2016-03-26 18 views
1

Ich muss Cross-Site-Scripting (XSS) verhindern. Wie kann ich bestätigen, dass es sich nicht um ein Cross-Site-Skript handelt? Das Problem ist mit meinem "URL" BBCode.PHP preg_replace Sicherheit

function bbcode($input) { 
    $search = array('/\[a url="(.+?)"\](.*?)\[\/a\]/is'); 

    $replace = array('<a href="$1" style="color: #337ab7; 
         text-decoration: none" target="_blank">$2 
         </a>'); 

    return preg_replace($search, $replace, $input); 
} 

bbcode([a url="javascript://hello.com/%0Aalert(%27s%27)"]XSS[/url]); 

Der obige Code ist ein Beispiel dafür, was passiert. Wenn Sie auf den Link klicken, wird ein JavaScript-Popup angezeigt. Außerdem gibt es mehr BBCode in diesem Array, aber ich habe sie entfernt, wenn ich das gepostet habe, um es einfacher zu machen.

+0

Sie können dies vor https://www.owasp.org/index.php/XSS_%28Cross_Site_Scripting%29_Prevention_Cheat_Sheet lesen –

+0

Hat mir nicht wirklich so viel geholfen. – SecureServer

+0

Ich muss andere Benutzer daran hindern, Cross-Site-Injektionen mit anderen Sites zu posten. – SecureServer

Antwort

1

Nach dem Chatten mit OP, sieht wie OP-Site XSS-infiziert ist.

Normalerweise kommt XSS von schlechten Benutzern durch Senden Formular, Kommentare Eingabe, Post, URL usw. So müssen wir XSS verhindern, aber da Sie bereits geschädigt sind, könnten Sie folgende Funktion verwenden, um Skripte von der Ausführung und Analyse zu stoppen Fixieren Sie Ihre Site gegen zukünftige Angriffe.

function filterScript($content) 
{ 
    $default = ''; 
    return preg_replace('/href="javascript:[^"]+"/', $default, $content); 
} 

Testing

Wir stellen uns das ist unser Angriff Inhalt:

$content = '<a href="javascript://somedomain.com/%0Aalert(%27s%27)">XSS</a>'; 

// this link is attacked 
echo $content . "<br>"; 
// this link is not attacked 
echo filterScript($content); 

EDIT: zusätzlich zu dieser Antwort, könnte es sich lohnen, auch bei this answer aussehen nehmen .

Hinweis: Die oben genannten Funktionen werden helfen, aber ist keine vollständige Lösung, was Sie wirklich brauchen, um eine Strategie Ihrer Website zu machen, um Schwäche zu finden und herauszufinden, wie Sie es schützen sollten.

Die zur Verfügung gestellte link hat einige Empfehlungen, wie und wo zu sehen. OWASP hat Top-10-Liste der möglichen Angriff Sie sollten read, sie haben auch eine neuere Empfehlung Leitfaden.

+0

Ich habe Probleme mit der Arbeit. Mein BBCode funktioniert nicht, wenn ich die von Ihnen erstellte Funktion filterOutput verwende. – SecureServer

+0

Hier ist eine vollständige Liste des Arrays, nach dem der BBCode nach einem Array sucht ('/ \ [b \] (. *?) \ [\/B \]/is', '/\[i'](.*?) \ [\/i \]/is ',' /\[strike \] (.*?) \[\/strike\]/is ','/\ [mark \]/mark \]/is ',' /\[u\](.*?)\[\/u\]/is ','/\ [Index \] (. *?) \ [\/Index \]/is ',' /\[superscript\](.*?)\[\/superscript\]/is ','/\ [a url = "(. +?)" \] (. *?) \ [ \/a \]/ist '); – SecureServer

+0

Okay, also im Grunde sucht der BBCode nach etwas wie im Array. Zum Beispiel können Sie fett wie folgt machen: "[b] Fett [/ b]". Die BBCode-Funktion sucht danach und ersetzt sie durch aktuelles HTML. Ich habe jedoch ein Problem mit einem Benutzer, der die URL im BBCode verwenden und Cross-Site-Injektion mit einem Link zu "javascript: //hello.com/%0Aalert (% 27s% 27)" vornehmen kann. – SecureServer