Ich habe einen Schwachstellenbericht (1) erhalten, der darauf hindeutet, dass möglicherweise ein Sicherheitsproblem in der Art und Weise vorliegt, wie Wordpress URLs mit folgenden Tildes behandelt. Es scheint, dass der Scanner glaubt, dass die Website einige Verzeichnislisten und dergleichen bereitstellt.
Ich war überrascht, dass meine Website immer noch Inhalte auf diesen verschiedenen URLs bereitstellte. Daher habe ich einen Test durchgeführt, indem ich eine völlig leere WP-Instanz installiert, auf Permalinks "Postname" umgestellt und bestätigt habe, dass jede URL mit hinzugefügter Tilde weiterhin als interpretiert wird die URL ohne Tilde.
In der Tat eine URL wie diese:
https://mywordpresssite.com/my-permalink
Ist auch über folgende URLs zugänglich:
https://mywordpresssite.com/my-permalink~
https://mywordpresssite.com/my-permalink~/
https://mywordpresssite.com/my-permalink~~~~~~
Ich stöberte ein wenig herum, um zu sehen, wo WP die Permalinks analysiert, und habe es class-wp.php
in der parse_request
Methode aufgespürt , konnte aber nicht viel weiter kommen.
Meine Frage ist, ob dies ein beabsichtigtes Verhalten für WP ist, und wenn ja, kann ich dies auf irgendeine Weise ausschalten, damit die Tildes nicht übereinstimmen? Warum sollte WP URLs mit Tildes als URL ohne diese interpretieren?
(1) Ja, jetzt haben wir alle ein paar große Hacks und Datenlecks in Großbritannien gesehen. Es ist wieder so weit, dass die "Sicherheitsleute" alle so tun, als würden sie ihren Beitrag leisten, indem sie uns Entwicklern 200-seitige Scan-Berichte geben Voller Fehlalarme und allgemeiner Probleme, von denen sie in der Erwartung nichts wissen, wenn wir diesen Bericht lesen und darauf reagieren, wird niemals etwas Schlimmes passieren.
quelle
sanitize_title
, aber da es filterbar ist, ist es nicht möglich, eine immer gültige Lösung zu schreiben. Also ging ich spezifisch.Ja, wie bereits erläutert,
WP_Query::get_posts()
wirdsanitize_title_for_query()
( der verwendetsanitize_title()
) verwendet, um den Postnamen eines einzelnen Posts zu bereinigen.Kurz nach dem Post Namen durchlaufen
sanitize_title_for_query()
,my-permalink === my-permalink~~~
sosanitize_title_for_query()
entfernt das Hinter~~~
. Sie können dies folgendermaßen testen:Dies können Sie nicht ausschalten. Es gibt einen Filter
sanitize_title()
namens, mitsanitize_title
dem Sie das Verhalten von ändern könnensanitize_title()
, aber das ist fast immer keine sehr gute Idee. Die SQL-Injection ist sehr schwerwiegend. Wenn Sie also aufgrund schlechter Hygiene etwas durch die Risse rutschen lassen, kann dies einen sehr schlechten Einfluss auf die Integrität Ihrer Site haben. "Überhygiene" kann manchmal ein Schmerz im Hintern sein.Ich bin mir nicht sicher, wonach Sie suchen, aber ich vermute, dass Sie vielleicht 404 einzelne Posts mit dieser nachlaufenden Tilde in Ihren Worten "ausschalten" möchten. Die einzige Möglichkeit, die ich mir derzeit vorstellen kann, besteht darin, die Hauptabfrage anzuhalten, wenn wir diese nachlaufenden Tildes haben. Dazu können wir die
posts_where
Klausel der Hauptabfrage filtern .DER FILTER
Hinweis: Ich habe nur normale einzelne Beiträge berücksichtigt und keine statischen Titelseiten oder Anhänge. Sie können den Filter erweitern, um dies zu berücksichtigen
WENIGE ANMERKUNGEN
Der obige Filter gibt eine 404-Seite zurück, wenn wir eine URL wie haben
https://mywordpresssite.com/my-permalink~~~~~~
. Sie können jedoch durch Entfernenremove_action( 'template_redirect', 'redirect_canonical' );
aus dem Filter die Abfrage automatisch umleitenhttps://mywordpresssite.com/my-permalink
und den einzelnen Beitrag anzeigen lassen, aufgrundredirect_canonical()
dessentemplate_redirect
die Umleitung der von WordPress generierten 404-Dateien verknüpft istquelle
Ja, es scheint seltsam, dass wir das gleiche Spiel haben sollten für:
und zB
Warum dies möglich ist, scheint dieser Teil der
WP_Query::get_posts()
Methode zu sein:wo
sanitize_title_for_query()
ist definiert als:Es sollte möglich sein, dies mit dem
sanitize_title
Filter strenger zu gestalten , aber es ist möglicherweise keine gute Idee, die Standardausgabe zu überschreiben, basierend auf dersanitize_title_with_dashes
, die hier für die Hygiene verantwortlich ist. Sie sollten in Betracht ziehen, ein Ticket zu erstellen, anstatt es zu ändern, wenn dieses Verhalten noch nicht einmal aktuell ist.Aktualisieren
Ich frage mich, ob wir das Rauschen aus dem aktuellen Pfad
sanitize_title_for_query()
entfernen und bei Bedarf zur bereinigten URL umleiten könnten .Hier ist eine Demo, mit der Sie auf Ihrer Testseite spielen und sich an Ihre Bedürfnisse anpassen können:
Es könnte sogar besser sein,
sanitize_title_with_dashes()
direkt zu verwenden, um die Filter zu vermeiden und zu ersetzen:mit:
ps: Ich glaube, ich habe diesen Trick gelernt, um den aktuellen Pfad mit einem leeren
add_query_arg( [] )
von @gmazzap zu erhalten ;-) Dies ist auch im Codex vermerkt . Nochmals vielen Dank an @gmazzap für die Erinnerung an die Verwendungesc_url()
beim Anzeigen der Ausgabeadd_query_arg( [] )
oderesc_url_raw()
beim z. B. Umleiten. Überprüfen Sie auch die vorherige Codex-Referenz.quelle
add_query_arg
müssen mitesc_url
oderesc_url_raw
um Sicherheitsprobleme zu entkommen ...Lassen Sie mich die Verarbeitung einer Anfrage durch WordPress und eine Methode zum Ändern des Verhaltens von WordPress erläutern, um Ihre Ziele entsprechend zu erreichen.
Analysieren der Anforderung
Wenn WordPress eine Anfrage erhält, beginnt es damit, die Anfrage zu zerlegen und in eine Seite umzuwandeln. Der Kern dieses Prozesses beginnt mit dem
WP::main()
Aufruf der WordPress-Hauptabfragemethode . Diese Funktion analysiert die Abfrage, wie Sie korrekt identifiziert haben, inparse_request()
(inincludes/class-wp.php
). Dort versucht WordPress, die URL mit einer der Umschreiberegeln abzugleichen . Wenn die URL übereinstimmt, wird eine Abfragezeichenfolge der URL-Teile erstellt und diese Teile (alles zwischen zwei Schrägstrichen) mit codierturlencode()
, um zu verhindern, dass Sonderzeichen&
die Abfragezeichenfolge durcheinander bringen. Diese codierten Zeichen haben Sie möglicherweise zu der Annahme veranlasst, dass das Problem dort liegt, aber sie werden beim Parsen der Abfragezeichenfolge tatsächlich in ihre entsprechenden "echten" Zeichen umgewandelt.Ausführen der der Anforderung zugeordneten Abfrage
Nachdem WordPress die URL analysiert hat, richtet es die Hauptabfrageklasse ein
WP_Query
, die auf dieselbemain()
Weise wie dieWP
Klasse ausgeführt wird. Das Rindfleisch vonWP_Query
kann in seinerget_posts()
Methode gefunden werden, in der alle Abfrageargumente analysiert und bereinigt werden und die eigentliche SQL-Abfrage erstellt (und schließlich ausgeführt) wird.Bei diesem Verfahren wird in Zeile 2730 der folgende Code ausgeführt:
Dadurch wird der Beitrag bereinigt, um ihn aus der Beitragstabelle abzurufen. Die Ausgabe von Debug-Informationen innerhalb der Schleife zeigt, dass hier das Problem liegt: Ihr Beitragsname
my-permalink~
wird in transformiertmy-permalink
, der dann zum Abrufen des Beitrags aus der Datenbank verwendet wird.Die Funktion zur Bereinigung nach dem Titel
Die Funktion
sanitize_title_for_query
ruftsanitize_title
mit den richtigen Parametern auf, wodurch der Titel bereinigt wird. Der Kern dieser Funktion ist nun das Anwenden dessanitize_title
Filters:Diesem Filter ist in nativem WordPress eine einzige Funktion zugeordnet :
sanitize_title_with_dashes
. Ich habe einen umfassenden Überblick über die Funktionsweise dieser Funktion geschrieben, den Sie hier finden . In dieser Funktion ist die Zeile, die Ihr Problem verursacht,In dieser Zeile werden alle Zeichen außer alphanumerischen Zeichen, Leerzeichen, Bindestrichen und Unterstrichen entfernt.
Lösen Sie Ihr Problem
Grundsätzlich gibt es einen einzigen Weg, um Ihr Problem zu lösen: Entfernen Sie die
sanitize_title_with_dashes
Funktion aus dem Filter und ersetzen Sie sie durch Ihre eigene Funktion. Das ist eigentlich gar nicht so schwer, aber :Am wichtigsten : WordPress verwendet das Ergebnis der
sanitize_title
Funktion direkt in der SQL-Abfrage in dieser Zeile:Sollten Sie jemals in Betracht ziehen, den Filter zu ändern, stellen Sie sicher, dass Sie den Titel ordnungsgemäß maskieren, bevor er in der Abfrage verwendet wird!
Fazit: Die Lösung Ihres Problems ist aus Sicherheitsgründen nicht erforderlich. Sollten Sie dies jedoch tun möchten, ersetzen Sie die
sanitize_title_with_dashes
durch Ihre eigene Funktionalität und achten Sie auf die SQL-Flucht.Hinweis: Alle Dateinamen und Zeilennummern entsprechen den WordPress 4.4.2-Dateien.
quelle
Einige Leute haben das Problem bereits erklärt, daher werde ich nur eine alternative Lösung veröffentlichen. Sollte ziemlich selbsterklärend sein.
Sie müssen jedoch etwas anderes für hierarchische Beitragstypen tun, da
WP_Query
diesepagename
durchlaufenwp_basename
und dann bereinigt werden, alsoquery_vars['pagename']
undget_query_var('pagename')
werden für Kinder nicht passen becuase letztere nicht das übergeordnete Teil enthalten.Ich wünschte, ich hätte mich
redirect_canonical
nur um diesen Mist gekümmert.quelle
Dies ist das Update ... für den Fehler von WORDPRESS fügen Sie einfach den BEGIN-Sicherheitsmod-Block über dem von Wordpress generierten BLOCK hinzu.
quelle
Sie können jederzeit versuchen, Folgendes zu Ihrer
.htaccess
Datei hinzuzufügen :Die zweite Zeile oben sollte direkt unter der ersten angezeigten Zeile stehen. Es sollte verhindert werden
index.php~
, dass in URLs angezeigt wird.quelle