Einzelnen Beitrag anzeigen
  #82 (permalink)  
Alt 17-06-2013, 12:20
Melewo
 Registrierter Benutzer
Links : Onlinestatus : Melewo ist offline
Registriert seit: Jan 2013
Beiträge: 365
Melewo befindet sich auf einem aufstrebenden Ast
Standard

Ja, sehe ich jetzt auch. Doch eine Raute oder Hash # leitet eigentlich nur einen Anker innerhalb eines Dokuments ein

HTML-Code:
<a href="#springe_zu-Absatz_zwei">Absatz 2</a>
und die Seite sollte dennoch erreichbar sein, gleich ob so oder so.

HTML-Code:
"http://...wissen-vor-a-906066.html#ref=rss"
"http://...wissen-vor-a-906066.html"
Was durch die Filterung passiert, das ist jedoch, dass nur # entfernt wird und der Rest bleibt und ein Dokument mit der Endung htmlref=rss nicht existiert. Doch wenn Du das einfach nur in der Zeichenklasse mit hinzufügst,

Code:
[^a-z0-9_\/=.:;&#?-]
und zusätzlich noch htmlspecialchars vergessen würdest, dann würde auch so etwas durchgehen:

PHP-Code:
echo "&#x3c;&#x53;&#x63;&#x68;&#x61;&#x64;&#x63;&#x6f;&#x64;&#x65;&#x3e;";

// <Schadcode> 
Dann brauchte bald mal gar nichts mehr gefiltert werden. Wenn, dann solltest Du Dir da noch einen zweiten Ausdruck entwickeln, der mit der # auch den nachfolgenden Rest entfernt, jedoch auch nicht mehr als halt diesen Rest entfernt.

So und bevor Du dumm stirbst, solltest Du Dir unbedingt Punkt zwei aufklappen und durchlesen:

Zitat:
Dies geschieht aus zwei Gründen:
Hash-Fragmente werden niemals als Teil einer HTML-Anfrage an den Server gesendet.
AJAX-Crawling: Leitfaden für Webmaster und Entwickler - Webmaster-Tools-Hilfe

Also #ref=rss kommt beim Server vom Spiegel eh nicht an.

HTML-Code:
http://example.com/seite.html#Hash-Fragment
#Hash-Fragment - weg damit und gut sollte es sein.

Wo ich nun bei meinen Listing schon am Nachbessern bin:

PHP-Code:
function filtereLinks($daten) {

    if ((
$pos strpos($daten"#")) !== false) {
        
$daten substr($daten0$pos);
    }    
    
$daten preg_replace("/[^a-z0-9_\/=.:;&?-]/is"""$daten);
    return 
$daten;

Damit geht es aber auch:

PHP-Code:
echo '<a href="%3c%53%63%68%61%64%63%6f%64%65%3e">lesen</a>'
Und das solltest Du unbedingt einmal ausprobieren in einer kleinen Datei. Es passiert nichts gefährliches, nur ein Demo für ein kleines JavaScript alert, wie schnell sich eine Seite verseuchen lässt:

PHP-Code:
<?php

  
echo  "\x3C\x73\x63\x72\x69\x70\x74\x20\x74\x79\x70\x65\x3D\x22\x74\x65".
        
"\x78\x74\x2F\x6A\x61\x76\x61\x73\x63\x72\x69\x70\x74\x22\x3E\x61".
        
"\x6C\x65\x72\x74\x28\x22\x53\x63\x68\x61\x64\x63\x6F\x64\x65\x22".
        
"\x29\x3B\x3C\x2F\x73\x63\x72\x69\x70\x74\x3E";
?>
Und dann weißt Du, warum # und \ und % im Allgemeinen nichts in einer Zeichenklasse für Filter verloren haben und \ nur zum maskieren von anderen Zeichen verwendet werden sollte.

Nach den Browsern und Anbietern brauchst Du Dich nicht zu richten, es ist ja nicht deren System, welches verseucht werden könnte, es ist ja Dein System oder das System der Besucher Deiner Webseite und die werden sich nicht bei Dir bedanken, wenn sie wegen einer unsicheren Webseite ihren eigenen Computer neu aufsetzen mussten.

Nun gut, mal sehen was Du da noch findest.

Edit: Nun scheint es dem Ende zuzugehen, was die Durchsicht anbelangt. Eigentlich sollte ich ja nun zufrieden sein, dass Du das Ding ausgiebig getestet hast. Etwas meckern ist zuweilen auch nicht verkehrt, dann kann der Tag nur noch besser werden. Wenn jetzt noch etwas ist, dann bleibt das so, habe ich mir zumindest vorgenommen, dann sind das halt Versionen und eigentlich ist es ja auch so.

Speichere ja alles noch einmal unter anderen Namen ab, denn allein nach dem DPMA gibt es schon um die 50 eingetragene Marken, die mit XML beginnen. Bei einer Script-Beschreibung ist das eigentlich egal, ein Feedreader ist nun einmal ein Feedreader, doch wenn man den dann eventuell bewerben möchte, könnte das anders aussehen.

Geändert von Melewo (17-06-2013 um 18:23 Uhr)
Mit Zitat antworten