今のところ、人々は私のURL BBCodeでXSSを使用できますが、それを修正する方法がわかりません。私はしばらく前にそれを修正しようとしましたが、誰かがそれをなんとか回避しました!
function filterScript($content) {
$pattern = array('/href="javascript:[^"]+"/', '/style=":[^"]+"/');
$default = array('#', 'color: #337ab7; text-decoration: none');
return preg_replace($pattern, $default, $content);
}
function bbcode($input) {
$search = array('/\[a url="(.+?)"\](.*?)\[\/a\]/is');
$replace = array('<a href="$1" style="color: #337ab7; text-decoration: none" target="_blank">$2</a>');
$bbcoded = preg_replace($search, $replace, $input);
return filterScript($bbcoded);
}
はい、strip_tags、mysql_real_escape_string、およびstriplashesを使用します。
コードの特定の問題は、実際には何もエスケープせず、複数の場所でユーザー定義のHTMLコードを許可することです。
作成するコードは次のとおりです。
_<a href="$1" target="_blank">$2</a>
_
値_$1
_および_$2
_はユーザーが制御し、両方を(さまざまな方法で)フィルタリングする必要があります。
$1
_の場合、攻撃者が二重引用符(_"
_)を指定して属性から脱出できないようにする必要があります。これを実現する1つの方法は、 htmlspecialchars()
を使用することです。もう1つの問題(対処しようとした)は、リンクが_javascript:
_などの疑似プロトコルで始まる可能性があることです。したがって、いくつかのもっともらしいURIスキームもホワイトリストに登録する必要があります。制限的ですが安全な方法は、入力を_http[s]://
_で始まるURLに制限することです。$2
_の場合、HTMLタグを禁止する必要があります。繰り返しになりますが、手っ取り早い解決策はhtmlspecialchars()
を適用することです。ただし、ネストされたBBタグをサポートする場合は、これにより問題が発生する可能性があることに注意してください。一般的な問題は、正規表現がネストされたマークアップを処理する正しい方法ではないことです。特にセキュリティ上の目的ではありません。非常に簡単です これを台無しにする 。フレームワークのツールに依存するか、 HTMLPurifier などのライブラリを使用してみてください。 XSSの防止に関するいくつかの 基本ガイド も参照する必要があります。