Suche
Suche Menü

WordPress Rest-API schützen

Die aktuelle c’t 23.2020 widmet sich den Sicherheitslücken. Eine „Lücke“ ist die Rest-API von WordPress. Die WordPress REST API ist eine Schnittstelle, mit der Entwickler von außerhalb der WordPress-Installation selbst auf WordPress zugreifen können. Der Zugriff erfolgt über JavaScript, d.h. es können damit interaktive Webseiten und Apps erstellt werden.

Die Rest-API wird über www.domain.tld/wp-json aufgerufen. Folgend ein paar Beispiele was man da alles abrufen kann:

  • /wp-json/wp/v2/media
  • /wp-json/wp/v2/pages
  • /wp-json/wp/v2/comments
  • /wp-json/wp/v2/users

Dies ist grundsätzlich nicht ein Problem. Allerdings können je nach Konstellation dadurch durchaus Daten ausgelesen werden, welche nicht für fremde Augen bestimmt sind. Nun gibt es verschiedene Plugins oder auch Snippets um die API zu deaktivieren:

add_filter( 'rest_authentication_errors', function( $result ) {   
   if ( ! empty( $result ) ) {
      return $result;
   }
   if ( ! is_user_logged_in() ) {
      return new WP_Error( '401', 'not allowed.', array('status' => 401) );
   }
   return $result;
});

Damit wird der Zugriff auf die IP auf eingeloggte User beschränkt. Nun ist das jedoch ein Problem. Setzt man z.B. das beliebte Plugin Contact Form 7 ein, kann ein Formular nur noch abgesendet werden, wenn der Webseitenbesucher auf der Seite angemeldet ist, da Contact Form 7 die Rest-API nutzt, um das Formular abzusenden.

Eine bessere Umsetzung zur Einschränkung der API ist folgender Ansatz, den ich in StackOverflow gefunden habe:

/*-----------------------------------------------------------------------------------*
/* Secure Rest API - Remove some endpoints for non logged in users * 
/*-----------------------------------------------------------------------------------*

function myplugin_removes_api_endpoints_for_not_logged_in() {
	if ( ! is_user_logged_in() ) {
		// Removes WordPress endpoints:
		remove_action( 'rest_api_init', 'create_initial_rest_routes', 99 );

		// Removes Woocommerce endpoints
		if ( function_exists('WC') )
			remove_action( 'rest_api_init', array( WC()->api, 'register_rest_routes' ), 10 );	
	}
} 
add_action('init', 'myplugin_removes_api_endpoints_for_not_logged_in');

In dieser Umsetzung wird nicht die gesamte API deaktiviert sondern die relevanten Daten von WordPress und Woocommerce entfernt, sofern der Webseitenbesucher nicht eingeloggt ist.

Excel: SUMMEWENNS mit Datumsbereich

Letzhin musste ich im Excel die Summe aller Beträge auf die einzelnen Monate des Jahres aufteilen. Mit der Formel SUMMEWENN können Summen mit einer einzelnen Bedingung z.B. einer Kategorie umgesetzt werden.
Brauchen wir nun die Summe aller Beträge des Monats Januar, kommen wir mit SUMMEWENNS ans Ziel, welche aus mehreren Bedingungen aus einer „Nebenzelle“ bestehen kann:

=SUMMEWENNS(B:B;A:A;">=" & DATUM(2020;1;1);A:A;"<=" & DATUM(2020;1;30))

Somit summieren wir alle Werte der Spalte B, deren „Nebenzelle“ in A größer gleich ist als der 1.1.2020 UND kleiner gleich dem 30.1.2020.

Beim kopieren der Formel ins Excel müssen allenfalls die Anführungszeichen in der Formel neu geschrieben werden.

Win10 – Lockscreen deaktivieren

Seit dem Anniversary Update Win10 Redstone lässt sich der Lockscreen nicht mehr so einfach deaktivieren. SemperVideo hat eine Anleitung veröffentlicht, wie dies dennoch einfach zu machen ist.

In der Registry gibt es einen Schlüssel, mit dem der Lockscreen deaktiviert werden kann. Dummerweise wird dieser bei jeder Anmeldung und jeder Sperre wieder aktiviert. Der „Trick“ das zu umgehen ist einfach. Wir erstellen eine Aufgabe, welche bei der Anmeldung und der Sperre diesen Schlüssel wieder schreibt.

Das Argument der Aufgabe lautet

add HKLMSOFTWAREMicrosoftWindowsCurrentVersionAuthenticationLogonUISessionData /t REG_DWORD /v AllowLockScreen /d 0 /f

 

Anleitung 

Die Computerverwaltung öffnen. Dies geht am einfachen mit dem Kurzbefehl Windows+X resp. mit einem Klick mit der rechten Maustaste auf das Windows-Icon der Taskleiste. Im Kontextmenü die Computerverwaltung auswählen.

Nun auf die Aufgabenplanung wecheln:

Lockscreen deaktivieren - Bild 1 

Mit der rechten Maustaste auf „Aufgabenplanungsbibliothek“ klicken und „Aufgabe erstellen…“ wählen.

Lockscreen deaktivieren - Bild 2

Der Aufgabe einen Namen, z.B. „Sperrbildschirm“ geben und die Aufgabe „Mit höchsten Privilegien ausführen“

Lockscreen deaktivieren - Bild 3

Einen neuen Trigger erstellen und als Aufgabe „Bei Anmeldung“ wählen.

Lockscreen deaktivieren - Bild 4

Einen weiteren Trigger als Aufgabe „bei Arbeitsstationssperre“ erstellen.

Lockscreen deaktivieren - Bild 5

Unter „Aktion“ eine neue Aktion erstellen. Die Vorgabe „Programm starten“ belassen und als Programm „reg.exe“ eintragen. Als Argument folgenden Befehl einfügen:

add HKLMSOFTWAREMicrosoftWindowsCurrentVersionAuthenticationLogonUISessionData /t REG_DWORD /v AllowLockScreen /d 0 /f

Danach die Aufgabe speichern. Nun funktioniert diese wie gewünscht und der Sperrbildschirm wird nicht mehr angezeigt. Es kann nun jedesmal direkt das Passwort eingegegen werden.

CMSMS: Passwort in der DB ändern

Es kann mal vorkommen, dass das Passwort des Admins verloren / vergessen geht. Mit dieser Anleitung lässt sich das Passwort direkt im phpMyAdmin neu setzen:

update cms_users set password = (select md5(CONCAT(IFNULL((SELECT sitepref_value FROM cms_siteprefs WHERE sitepref_name = 'sitemask'),''),'NEW_PASSWORD'))) where username = 'USER_NAME'

NEW_PASSWORD = das neue Passwort
USER_NAME = der Benutzer bei welchem das Passwort geändert werden soll.

Hier als Beispiel mit einem definierten Passwort und einem definierten Benutzernamen. –> bitte die jeweiligen Werte anpassen:

update cms_users set password = (select md5(CONCAT(IFNULL((SELECT sitepref_value FROM cms_siteprefs WHERE sitepref_name = 'sitemask'),''),'chang3m3'))) where username = 'cmsmsadmin'

Quelle

Spiegel-Mining – oder wie man Vorratsdatenspeicherung und BigData erklären kann

Am letzten 33C3, der Ende 2016 in Hamburg stattfand, gab es einen sehr interessanten Vortrag über Data-Mining. David Kriesel hatte zwei Jahre lang jeden Artikel von Spiegel Online gespeichert (echte Vorratsdatenspeicherung!), um die Daten dann am Ende zu analysieren und Beziehungen herauszuziehen.

Mit seinem Vortrag „SpiegelMining – Reverse Engineering von Spiegel-Online“ zeigte Kriesel nicht nur, welche Analysen man so generell vornehmen kann, sondern welche Schlüsse man ziehen kann. Eine der beeindruckendsten Analysen lies darauf schliessen, dass es persönliche Beziehungen zwischen einzelnen Redakteuren gibt, waren diese doch immer zu gleichen Zeiten in Urlaub. Den Urlaub schloss Kriesel aus dem Umstand von Veröffentlichungslücken. Ein spannender Schluss, den er zog und der jeden zum Nachdenken bringen soll, der sich beruhigen lässt, weil bei der Vorratsdatenspeicherung schliesslich „nur“ Metadaten gespeichert werde würden.

Ingo Dachwitz fasst bei netzpolitik.org die wichtigsten Punkte des Vortrags zusammen. David Kriesel hat auf seinem Blog auch mehrere Artikel zu seinem Vortrag veröffentlicht. Wenn ihr kaum Zeit für die Vorträge des 33C3 einplanen könnt, solltet ihr diesen einen dennoch schauen.

Smarty: Systempfad

Für diverse Operationen mit Dateien benötigt es den Systempfad und nicht die URL. Wenn aber nur die URL zur Verfügung steht, muss dies zuvor in den Systempfad umgewandelt werden.

Dies lässt sich mit Smarty3-Bordmitteln schnell und effizient erledigen, und bedarf keines eigenen Plugins. Die URL sei dabei in der Variable $iurl enthalten (z.Bsp. https://www.domain.net/uploads/images/logo1.gif)

{$ipath = "{$smarty.server.DOCUMENT_ROOT}{$iurl|parse_url:$smarty.const.PHP_URL_PATH}"}

Ausgabe der Variable mit {$ipath}

/users/w1234567/www/uploads/images/logo1.gif

Quelle forum.cmsmadesimple.de

Smarty: Exif-Daten von Bildern auslesen und anzeigen

Will man zu einer Gallery Detaildaten zu den Bilder wie Auflösung, Brennweite und Belichtungsdauer bis hin zu den GPS-Koordinaten uvm. anzeigen, so kann dies mit der PHP Funktion exif_read_data() umgesetzt werden. Diese Funktion liest sämtliche vorhandenen Exif-Daten eines Bildes aus und liefert sie in einem Array zurück. Die Exif-Daten sind die Meta-Daten der Bilder.

In CMS Made Simple wird dies wie folgt eingebaut

{$exif = exif_read_data({$ipath}, 'IFD0')}

Hinter $ipath verbirgt sich der Systempfad des Bildes, NICHT die URL. Wie eine URL in den Systempfad konvertiert werden kann, ist hier beschrieben: https://www.cmsmadesimple.de/forum/view … hp?id=4963

Vor dem praktischen Einsatz solltet ihr allerdings eure Bilder prüfen, welche EXIF-Daten vorhanden sind. Diese sind zwar grundsätzlich standardisiert, aber da hat jeder Kamera-Hersteller so seine eigenen Vorstellungen, was geschrieben wird.

Funktioniert in CMSMS so (nach vorstehendem Befehl einfügen)

<pre>{$exif|print_r}</pre>

Der Output sieht in menem Fall so aus:

Array
(
    [FileName] => _DSC7200.JPG
    [FileDateTime] => 1466331900
    [FileSize] => 9866716
    [FileType] => 2
    [MimeType] => image/jpeg
    [SectionsFound] => ANY_TAG, IFD0, THUMBNAIL, EXIF, GPS, INTEROP
    [COMPUTED] => Array
        (
            [html] => width="4288" height="2848"
            [Height] => 2848
            [Width] => 4288
            [IsColor] => 1
            [ByteOrderMotorola] => 1
            [ApertureFNumber] => f/11.0
            [UserComment] => Copyright by Lukas Blatter
            [UserCommentEncoding] => ASCII
            [Copyright] => Lukas BIatter                                         
            [Thumbnail.FileType] => 2
            [Thumbnail.MimeType] => image/jpeg
        )

    [Make] => NIKON CORPORATION
    [Model] => NIKON D300
    [Orientation] => 1
    [XResolution] => 300/1
    [YResolution] => 300/1
    [ResolutionUnit] => 2
    [Software] => Ver.1.10 
    [DateTime] => 2016:06:19 11:24:58
    [Artist] => Lukas Blatter                       
    [WhitePoint] => Array
        (
            [0] => 313/1000
            [1] => 329/1000
        )

    [PrimaryChromaticities] => Array
        (
            [0] => 64/100
            [1] => 33/100
            [2] => 21/100
            [3] => 71/100
            [4] => 15/100
            [5] => 6/100
        )

    [YCbCrCoefficients] => Array
        (
            [0] => 299/1000
            [1] => 587/1000
            [2] => 114/1000
        )

    [YCbCrPositioning] => 2
    [Copyright] => Lukas BIatter                                         
    [Exif_IFD_Pointer] => 472
    [GPS_IFD_Pointer] => 33888
    [THUMBNAIL] => Array
        (
            [Compression] => 6
            [XResolution] => 300/1
            [YResolution] => 300/1
            [ResolutionUnit] => 2
            [JPEGInterchangeFormat] => 34016
            [JPEGInterchangeFormatLength] => 8742
            [YCbCrPositioning] => 2
        )

    [ExposureTime] => 10/5000
    [FNumber] => 110/10
    [ExposureProgram] => 2
    [ISOSpeedRatings] => 1000
    [ExifVersion] => 0221
    [DateTimeOriginal] => 2016:06:19 11:24:58
    [DateTimeDigitized] => 2016:06:19 11:24:58
    [CompressedBitsPerPixel] => 4/1
    [ExposureBiasValue] => 0/6
    [MaxApertureValue] => 36/10
    [MeteringMode] => 5
    [LightSource] => 0
    [Flash] => 0
    [FocalLength] => 180/10
    [MakerNote] => Nikon
    [SubSecTime] => 08
    [SubSecTimeOriginal] => 08
    [SubSecTimeDigitized] => 08
    [FlashPixVersion] => 0100
    [ColorSpace] => 65535
    [ExifImageWidth] => 4288
    [ExifImageLength] => 2848
    [InteroperabilityOffset] => 33858
    [SensingMethod] => 2
    [CustomRendered] => 0
    [ExposureMode] => 0
    [WhiteBalance] => 0
    [DigitalZoomRatio] => 1/1
    [FocalLengthIn35mmFilm] => 27
    [SceneCaptureType] => 0
    [GainControl] => 2
    [Contrast] => 0
    [Saturation] => 0
    [Sharpness] => 0
    [SubjectDistanceRange] => 0
    [UndefinedTag:0xA500] => 22/10
    [InterOperabilityIndex] => R03
    [InterOperabilityVersion] => 0100
) 

 

Praktisch an dieser Ausgabe, dass man bereits hier erkennen kann, wie man die Elemente des generierten $exif Arrays zur Anzeige bringt. So findet sich z.Bsp. für das Kamera-Modell dieser Eintrag

[Model] => Nikon D300

Angezeigt werden kann dies mit

{$exif.Model}

Manche Werte wie zum Beispiel der Zeitstempel oder die Dateigröße liegen aber als unformatierte Rohdaten vor, weshalb sie für die Anzeige noch etwas überarbeitet werden müssen.

[FileDateTime] => 1419676580
    [FileSize] => 237278

Der Zeitstempel ist ein Unix Zeitstempel und kann so über den in CMSMS mitgelieferten Modifikator cms_date_format formatiert werden.

{$exif.FileDateTime|cms_date_format:'%d. %B %Y'}

Um die Bytezahl der Dateigrösse in ein lesbares Format zu bringen, kann folgender Modifier (modifier.formatsize.php) genutzt werden

https://www.cmsmadesimple.de/forum/view … hp?id=4770

{$exif.FileSize|formatsize}

Zusammengefasst in einem erweiterungsfähigen Basis-Script sieht das dann so aus

{$ipath = "{$smarty.server.DOCUMENT_ROOT}{$iurl|parse_url:$smarty.const.PHP_URL_PATH}"}
{$exif = exif_read_data({$ipath}, 'IFD0')}
Erstellt: {$exif.FileDateTime|cms_date_format:'%d. %B %Y'}
Auflösung: {$exif.COMPUTED.Width} x {$exif.COMPUTED.Height}
Dateigröße: {$exif.FileSize|formatsize}
Kamera: {$exif.Make} {$exif.Model}

Ausgegeben wird folgendes

Erstellt: 19. Juni 2016
Auflösung: 4288 x 2848 Pixel
Dateigröße: 9.6MB
Kamera: Nikon D300

Ergänzen könnte man das Script um eine Prüfung, ob die EXIF Erweiterung aktuell auf eurem Host bzw. Server geladen ist. Dies lässt sich über eine Prüfung der Existenz der genutzten Funktion erledigen

{if function_exists('exif_read_data')}
...
{/if}

Zudem sollte man bei kritischen EXIF-Daten (also Daten, die nicht in jedem Bild vorhanden sind), vorher dessen Existenz prüfen

{if $exif.Make && $exif.Model}
  <p>Kamera: {$exif.Make} {$exif.Model}</p>
{/if}

Das komplette Script sähe in diesem Fall so aus

{if function_exists('exif_read_data')}
  {$ipath = "{$smarty.server.DOCUMENT_ROOT}{$iurl|parse_url:$smarty.const.PHP_URL_PATH}"}
  {$exif = exif_read_data({$ipath}, 'IFD0')}
  <p>Erstellt: {$exif.FileDateTime|cms_date_format:'%d. %B %Y'}</p>
  <p>Auflösung: {$exif.COMPUTED.Width} x {$exif.COMPUTED.Height}</p>
  <p>Dateigröße: {$exif.FileSize|formatsize}</p>
  {if $exif.Make && $exif.Model}
    <p>Kamera: {$exif.Make} {$exif.Model}</p>
  {/if}
{/if}

Falls das Script an mehreren Stellen eingesetzt werden soll, bietet sich natürlich auch der Einsatz dieses Tricks an

https://www.cmsmadesimple.de/forum/viewtopic.php?id=572

So muss der Block nicht jedes Mal neu eingefügt werden. Anpassungen können so auch an zentraler Stelle vorgenommen werden.

1. Falls nicht vorhanden, Verzeichnis /tmp/templates anlegen
2. Snippet in einer Datei als exif.tpl speichern
3. exif.tpl nach /tmp/templates hochladen
4. Aufruf an den gewünschten Stellen mittels

{include file='exif.tpl'}

Quelle des Artikel forum.cmsmadesimple.de

NumLock dauernd aktivieren

Problemstellung: Beim Anmelden am PC ist der Zahlenblock nicht aktiv.  Um das Problem zu beheben gibt es zwei Möglichkeiten. Dazu muss die Windows-Registry geöffnet werden. Mit dem drücken von Windowstaste+R das Ausführen Fenster öffnen und hier regedit eintippen und auf Enter drücken.

Userspezifisch ändern

In der Registry nach folgendem Key suchen:
HKEY_CURRENT_USERControl PanelKeyboard

 

Einstellung nur für aktuellen User ändern Einstellung nur für aktuellen User ändern Zoom

Im rechten Fensterteil doppelklicken Sie auf den Eintrag namens «InitialKeyboardIndicators»

Ändern Sie seinen Wert von 0 auf 2. Falls er auf einer ganz anderen Zahl steht erhöhen Sie den Wert um zwei, (z. B. von 123 auf 125).

Für die systemweite Änderung ist das Vorgehen praktisch gleich. Starten Sie aber den Registrierungseditor mit Administrator-Rechten. Unter Windows XP, Vista und 7 klicken Sie auf Start, tippen regedit ein, klicken mit der rechten Maustaste auf den gefundenen Registrierungseditor und wählen im Kontextmenü Als Administrator ausführen. Unter Windows 8 drücken Sie Windowstaste+X, gehen zu Ausführen, tippen regedit ein und drücken Enter.
Der zu ändernde Eintrag «InitialKeyboardIndicators» befindet sich unter diesem Zweig:
HKEY_USERS.DefaultControl PanelKeyboard
Auch hier gilt: Von 0 auf 2 erhöhen oder von 2147483648 auf 2147483650.

Nach der Änderung klicken Sie auf OK und schliessen den Registry-Editor wieder. Ab dem nächsten PC-Neustart sollte NumLock nun standardmässig aktiviert sein.

target=_blank – eine unterschätzte Sicherheitslücke bei sozialen Medien

T3N hat einen interessanten Artikel zu target=_blank veröffentlicht.
Wird ein Link mit target=_blank geöffnet, öffnet sich ein neues Browserfenster. Durch den dabei ausgeführten Befehl window.opener erhält die sich neu öffenende Seite Zugriff auf das bisherige Browserfenster. So ist es möglich via Javascript möglich den Inhalt der Ursprungsseite zu verändern. Gefährdet sind hier vor allem soziale Medien wie Facebook.

Klickt man z.B. bei Facebook auf einen Link, so kann die Zielseite die noch offene Facebookseite manipulieren, so dass man z.B. das Passwort eingeben muss, welches direkt bei den bösen Buben landet.

Als Webseitenbetreiber mit Kundenlogin welcher target=_blank verwendet, kann man seine Benutzer wie folgt schützen:

<a href="http://www.seite.com" target="_blank" rel="noopener noreferrer">Neue Seite</a>

Mit dem rel=“noopener noreferrer“ setzt man den window.opener auf Null. Somit erhält die neue Seite keinen Zugriff mehr auf die bisherige Seite.

Ob man als User von diesem Problem betroffen ist, kann man auf dieser Seite testen:
https://mathiasbynens.github.io/rel-noopener/

Beim Cross-Origin Beispiel warnt mich Firefox, dass die Ursprungsseite Seite plötzlich umleiten will. Dazu gibt es einerseits eine Einstellung: „Erweitert“ › „Allgemein“ die Option „Warnen, wenn Webseiten versuchen umzuleiten oder neuzuladen“
Außerdem gibt es noch das AddOn RequestPolicy. RequestPolicy warnt unabhängig von dieser Einstellung.