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">
。したがって、スペースを許可しないと、このようなクラス属性がテンプレートまたは他のソースを含むデータベースから取得されなくなります...
- xhtml では引用符なしで属性を使用することは禁止されており、私のサイトは xhtml の厳密な doctype を生成するため、スペースを許可できますか?
- javascript のコンマを禁止する必要がありますか?