2

html および js の出力をエスケープするために、Twig (php テンプレート フレームワーク) からいくつかのコードを採用しています。現在、彼らが使用している正規表現を完全には理解していません。

完全な Twig コードの場合:

git clone git://github.com/fabpot/Twig.git
// the code is in Core.php in the function twig_escape_filter

彼らは以下を使用します:

preg_replace_callback( '#[^a-zA-Z0-9,\._]#Su'   , '_twig_escape_js_callback'               , $string ); // for javascript
preg_replace_callback( '#[^a-zA-Z0-9,\.\-_]#Su' , '_twig_escape_html_attr_callback' , $string ); // for html attibutes

コールバック関数は、負の文字クラスに対応するすべてのものを置き換えます。

私が知る限り、これは同等です(いくつかのバックスラッシュを取り除きます):

'#[^a-zA-Z0-9,._]#Su'
'#[^a-zA-Z0-9,._-]#Su'

これで、javascript ではコンマを使用できることがわかりましたが、コンマは JavaScript コンテキストの制御文字であるため、私には理解できません。カンマ エクスプロイトの例を次に示します。

// say we have a function call to a javascript function like this
function ajax( timeout, onerror, onsuccess ) {...};

// now assume I get the timeout value from somewhere dodgy (in php)
$timeout = escapeJS( '1000, evilCallback, evilCallback2' );

echo "ajax( $timeout, myErrorHandler, mySuccessHandler );"

JavaScript は余分なパラメータを喜んで無視することに注意してください...

html 属性では、属性を閉じるのを防ぐための考え方です。したがって、引用符なしで属性を記述するのが一般的であり、html4 でも合法であるため、スペースは許可されません。ただし、次のような要素に複数のクラスを与えるために、属性でスペースが使用されているのがわかります<tr class="tablerow odd">。したがって、スペースを許可しないと、このようなクラス属性がテンプレートまたは他のソースを含むデータベースから取得されなくなります...

  1. xhtml では引用符なしで属性を使用することは禁止されており、私のサイトは xhtml の厳密な doctype を生成するため、スペースを許可できますか?
  2. javascript のコンマを禁止する必要がありますか?
4

2 に答える 2

1

htmlspecialcharsHTMLjson_encodeのエスケープと Javascript のエスケープに使用する必要があります。

$timeout = json_encode('1000, evilCallback, evilCallback2');
echo "ajax( $timeout, myErrorHandler, mySuccessHandler );";

出力:

ajax( "1000, evilCallback, evilCallback2", myErrorHandler, mySuccessHandler );

あなたの場合、$timeoutvar の実際の内容を検証するか、次のように int にキャストする必要があります。

$timeout = json_encode((int)'1000, evilCallback, evilCallback2');
echo "ajax( $timeout, myErrorHandler, mySuccessHandler );";

出力:

ajax( 1000, myErrorHandler, mySuccessHandler );

PHP 整数は有効な JS 整数でもあるため、int にキャストする場合は実際には必要ありませんが、適切なコンテキストですべてのjson_encodeデータをエスケープすることをお勧めします。


更新:適応しようとしている Twig コードに関しては、実際の Javascript リテラルを生成しないようですが、Javascript リテラルに含めるため\xHH文字列をエスケープします。これは、JS でのみ有効なエスケープ コードの実際の使用から明らかです。文字列内(および正規表現ですが、それは重要ではありません)。次のように使用する必要があります。

$timeout = escapeJS('1000, evilCallback, evilCallback2');
echo "ajax('$timeout', myErrorHandler, mySuccessHandler);";

内の余分な引用符に注目$timeoutしてくださいecho。これは、'foo $escaped_part1 bar $escaped_part2 baz'.

于 2012-07-08T16:51:09.220 に答える
0

XSS (クロス サイト スクリプティング) 防止チート シートで見つけたもの:

HTML 属性の場合:

適切に引用された属性は、対応する引用符でのみエスケープできます。引用符で囲まれていない属性は、[スペース] % * + , - / ; を含む多くの文字で区切ることができます。< = > ^ と |。

それは、引用符で囲まれていない属性から保護され、属性にスペースを含める方法がないことを意味していると思います。エスケープ関数は引用符自体を追加できると思いますが、それは一貫性がなく、vulus が 2 回引用され、基本的にそれらの引用符が外される状況を作成することになります...したがって、今のところ、ユーザーが明示的に呼び出すことができるように、2 つのエスケープ関数を作成しました。引用符を付ける必要があることを知って、スペースを許可します。

JavaScriptを考慮する:

英数字を除き、256 未満のすべての文字を \xHH 形式でエスケープして、データ値がスクリプト コンテキストまたは別の属性に切り替えられないようにします。\" のようなエスケープ ショートカットは使用しないでください。最初に実行される HTML 属性パーサーによって引用符文字が照合される可能性があるためです。これらのエスケープ ショートカットは、攻撃者が \" および脆弱なコードを送信する「エスケープ ザ エスケープ」攻撃の影響も受けやすくなっています。これを \" に変換すると、引用符が有効になります。

イベント ハンドラーが適切に引用されている場合、ブレークアウトには対応する引用符が必要です。ただし、イベント ハンドラーの属性は引用符で囲まれていないことが多いため、意図的にこのルールを非常に広くしています。引用符で囲まれていない属性は、[スペース] % * + , - / ; を含む多くの文字で分割できます。< = > ^ と |。また、HTML パーサーは JavaScript パーサーの前に実行されるため、引用符で囲まれた文字列内であっても、終了タグはスクリプト ブロックを閉じます。

これは、すべてをエスケープする必要があることを示しているようです。小数点付きの数値を挿入できるようにするために、アンダースコアは JavaScript 名とドットの一部になる可能性があるため、アンダースコアを保持することを選択しました。脆弱性が残らないことを願っています。

Twig コードにバグがあり、カンマが残っていると思われます。レポートを提出して、調査できるようにします。

于 2012-07-08T23:12:15.997 に答える