Недавно я редактировал некоторые регулярные выражения на bbcode.php phpbb2, и мне интересно, могут ли они вызвать проблемы с безопасностью (в том числе в случае смены скрипта из href, если это возможно).Вопросы безопасности, связанные с ссылками в PHPBB2
Я отредактировал только [url], [url =] и мои недавно созданные [url = ""] теги bbcode.
Их оригинальные регулярные выражения (датированные 2008 годом) не допускают «недопустимых» символов, таких как круглые скобки или белые пробелы в значении URL (которые необходимы для некоторых страниц в Википедии и URL-адресов хостов), поэтому вместо кодирования специальные символы URL-адресов, как это было предложено другими, я только что отредактировал регулярное выражение, чтобы разрешить буквенно-цифровые символы в протоколах и в основном любой символ в домене/остатке URL-адреса.
Новые регэкспы внутри функции bbencode_second_pass PHPbb2 (в $ текст = текст Поста):
// 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;
И неопубликованные декларации PHPbb2:
$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']);
Это отлично работает с моей отладки до сих пор, в настоящее время Я хотел бы спросить, разрешаю ли любой персонаж помещаться в атрибут href тега A, чтобы подвергать себя или пользователей любой хакерской атаке?
Скажем, я протестировал javascript URI hack (javascript :), и он, похоже, не работает даже в Internet Explorer, и я не знаю, каким образом вводить скрипт через атрибут href тега A , будет ли риск, позволяющий моим пользователям набирать то, что им нравится (до тех пор, пока существует допустимый буквенно-цифровой протокол, такой как *: // или www, который будет иметь http: //, размещенный до него) в href из тегов?
Обратите внимание, что я не собираюсь ссылаться на вредоносные сайты, я хочу знать, смогут ли хакеры вставлять скрипты/куки-файлы/через href тега без щелчка на нем!
Теперь звучит немного избыточно, чтобы атрибут href выполнял что-либо без щелчка его тега, но в любом случае, есть ли способ для хакера внедрить вредоносный код/javascript в документ через атрибут href?
Пробелы и возврат каретки являются незаконными в URL-адресах и против спецификации. Символы пробела должны быть закодированы как '% 20'.Если вы должны включить возврат каретки/окончание строки, вы можете сделать это с помощью '% 0A' и/или'% 0D' по мере необходимости – Cheekysoft
Если вы имеете в виду спецификации RFC, даже скобки будут незаконными тогда, и они понадобятся для некоторых страниц Википедии. Я знаю, что кодирование может быть хорошим решением, но я не буду просить своих конечных пользователей знать, как кодировать свои собственные URL-адреса, а в phpbb это будет не совсем иначе, чем то, что реализовано: phpbb позволяет пользователю напечатайте пробел с моим модом, но когда HTML сгенерирован, все незаконные символы правильно закодированы - скажем, '[url = www.a.com/aa] ... [/ url]' превращается в '...'. –