最近、phpbb2のbbcode.phpでいくつかの正規表現を編集しましたが、セキュリティの問題が発生するのではないかと思います(主に、hrefからのスクリプトインジェクションに関して(可能であれば))。
[url]、[url =]、および新しく作成した[url=""]bbcodeタグのみを編集しました。
元の正規表現(2008年)では、URL値に括弧や空白などの「無効な」文字(一部のWikipediaページやファイルホスティングサービスのURLに必要)が許可されていなかったため、URLの特殊な文字をエンコードする代わりに他の人が提案した文字、私は正規表現を編集して、プロトコルで英数字を許可し、基本的にURLアドレスのドメイン/残りの文字を許可しました。
phpbb2のbbencode_second_pass関数内の新しい正規表現($ text =投稿のテキスト):
// 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]user@domain.tld[/email] code..
$patterns[] = "#\[email\]([a-z0-9&\-_.]+?@[\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']);
これは、これまでのデバッグでは完全に正常に機能します。ここで、Aタグのhref属性内に任意の文字を配置できるようにすることで、ユーザーまたは自分自身をハッカー攻撃にさらすかどうかを尋ねたいと思います。
たとえば、javascript URIハック(javascript :)をテストしましたが、Internet Explorerでも機能しないようで、Aタグのhref属性を使用してスクリプトを挿入する方法がわかりません。ユーザーがタグのhrefに好きなものを入力できるようにするリスクはありますか(*://やwww。などの有効な英数字プロトコルの前にhttp://が配置されている場合)。
悪意のあるサイトへのリンクを検討していないことに注意してください。ハッカーがタグのhrefを介して、ユーザーがクリックしなくてもスクリプトやCookieなどを挿入できるかどうかを知りたいのです。
タグをクリックせずにhref属性を実行するのは少し冗長に聞こえますが、とにかく、ハッカーがhref属性を介してドキュメントに悪意のあるコード/ JavaScriptを挿入する方法はありますか?