web-dev-qa-db-ja.com

安全なBBCodeを作成する方法は?

今のところ、人々は私の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を使用します。

1
UnderMyWheel

コードの特定の問題は、実際には何もエスケープせず、複数の場所でユーザー定義の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の防止に関するいくつかの 基本ガイド も参照する必要があります。

3
Arminius