Ich habe vor kurzem einige Regexps auf einer BBC Code.php phpbb2 bearbeitet und ich frage mich, ob es Sicherheitsprobleme bringen würde (in Bezug auf Skript Injektion von href, hauptsächlich (wenn es überhaupt möglich ist)).Sicherheitsfragen bezüglich Links in PHPBB2
Ich bearbeitet nur die [url], [url =] und meine neu erstellten [url = ""] BBCode-Tags.
Ihre ursprünglichen Regexps (datiert auf 2008) erlaubten keine "ungültigen" Zeichen wie Klammern oder Leerstellen im URL-Wert (die für einige Wikipedia-Seiten und Datei-Hosting-Dienste URLs benötigt werden), also anstatt zu kodieren die Sonderzeichen der URLs, wie von anderen vorgeschlagen, ich habe gerade die Regex bearbeitet, um alphanumerische Zeichen in den Protokollen und im Prinzip jedes Zeichen in der Domäne/Rest der URL-Adresse zu erlauben.
Die neuen regexps innerhalb bbencode_second_pass Funktion der phpbb2 ($ text = text des post):
// matches a [url]xxxx://www.phpbb.com[/url] code..
$patterns[] = "#\[url\]([\w]+?://.*?)\[/url\]#is";
$replacements[] = $bbcode_tpl['url1'];
// [url]www.phpbb.com[/url] code.. (no xxxx:// prefix).
$patterns[] = "#\[url\]((www|ftp)\..*?)\[/url\]#is";
$replacements[] = $bbcode_tpl['url2'];
// [url=xxxx://www.phpbb.com]phpBB[/url] code..
$patterns[] = "#\[url=([\w]+?://.*?)\]([^?\n\r\t].*?)\[/url\]#is";
$replacements[] = $bbcode_tpl['url3'];
// [url=www.phpbb.com]phpBB[/url] code.. (no xxxx:// prefix).
$patterns[] = "#\[url=((www|ftp)\..*?)\]([^?\n\r\t].*?)\[/url\]#is";
$replacements[] = $bbcode_tpl['url4'];
// [url="xxxx://www.phpbb.com"]phpBB[/url] code..
$patterns[] = "#\[url="([\w]+?://.*?)"\]([^?\n\r\t].*?)\[/url\]#is"; //closes on first "]
//$patterns[] = "#\[url="([\w]+?://.*?)"\](?![\w\n\s]*"\])([^?\n\r\t].*?)\[/url\]#is"; //closes on last "] //discarded, ambigous
$replacements[] = $bbcode_tpl['url3'];
// [url="www.phpbb.com"]phpBB[/url] code.. (no xxxx:// prefix).
$patterns[] = "#\[url="((www|ftp)\..*?)"\]([^?\n\r\t].*?)\[/url\]#is";
$replacements[] = $bbcode_tpl['url4'];
// [email][email protected][/email] code..
$patterns[] = "#\[email\]([a-z0-9&\-_.][email protected][\w\-]+\.([\w\-\.]+\.)?[\w]+)\[/email\]#si";
$replacements[] = $bbcode_tpl['email'];
$text = preg_replace($patterns, $replacements, $text);
// Remove our padding from the string..
$text = substr($text, 1);
return $text;
Und die ungeschnittenen phpbb2 Erklärungen:
$bbcode_tpl['url1'] = str_replace('{URL}', '\\1', $bbcode_tpl['url']);
$bbcode_tpl['url1'] = str_replace('{DESCRIPTION}', '\\1', $bbcode_tpl['url1']);
$bbcode_tpl['url2'] = str_replace('{URL}', 'http://\\1', $bbcode_tpl['url']);
$bbcode_tpl['url2'] = str_replace('{DESCRIPTION}', '\\1', $bbcode_tpl['url2']);
$bbcode_tpl['url3'] = str_replace('{URL}', '\\1', $bbcode_tpl['url']);
$bbcode_tpl['url3'] = str_replace('{DESCRIPTION}', '\\2', $bbcode_tpl['url3']);
$bbcode_tpl['url4'] = str_replace('{URL}', 'http://\\1', $bbcode_tpl['url']);
$bbcode_tpl['url4'] = str_replace('{DESCRIPTION}', '\\3', $bbcode_tpl['url4']);
Das mit meinem Debugging völlig in Ordnung, funktioniert so weit, jetzt Ich würde gerne fragen, ob ich durch das Zulassen eines beliebigen Charakters innerhalb des href-Attributs des A-Tags meine Benutzer oder mich einem Hackerangriff aussetzen würde?
Angenommen, ich habe den Javascript-URI-Hack (Javascript :) getestet und er scheint selbst im Internet Explorer nicht zu funktionieren, und ich weiß nichts über das href-Attribut eines A-Tags Wäre es möglich, meinen Benutzern zu erlauben, zu tippen, was auch immer sie möchten (solange es ein gültiges alphanumerisches Protokoll wie *: // oder www. gibt, dem vorher http: // vorangestellt wird) in der href von Tags?
Bitte beachten Sie, dass ich nicht in Betracht ziehe, auf schädliche Websites zu verlinken. Ich möchte wissen, ob Hacker Scripts/Cookies/was auch immer durch die href eines Tags injizieren können, ohne dass der Benutzer darauf klickt!
Jetzt klingt es ein wenig überflüssig, dass ein href-Attribut alles ausführt, ohne dass das Tag angeklickt wird, aber gibt es auch einen Weg für einen Hacker, bösartigen Code/Javascript über das href-Attribut in das Dokument zu injizieren?
Leerzeichen und Wagenrücklauf sind in URLs und gegen die Spezifikation unzulässig. Leerzeichen sollten als '% 20' codiert sein.Wenn Sie Wagenrücklauf/Zeilenende einfügen müssen, können Sie dies mit '% 0A' und/oder'% 0D' nach Bedarf tun. – Cheekysoft
Wenn Sie RFC-Spezifikationen angeben, wären sogar runde Klammern dann illegal und werden benötigt für einige Wikipedia-Seiten. Ich weiß, dass Encoding eine nette Lösung sein könnte, aber ich werde meine Endbenutzer nicht fragen, wie sie ihre eigenen URLs codieren können, und in phpbb würde es nicht viel anders sein als das, was implementiert wird: phpbb ermöglicht es dem Benutzer Tippe Leerraum mit meinem Mod, aber wenn der HTML-Code erzeugt wird, werden alle ungültigen Zeichen richtig kodiert - sagen wir, '[url = www.a.com/aa] ... [/ url]' wird zu '...'. –