次の関数を使用してユーザー入力をフィルタリングし、入力が XSS 安全であることを確認できます。フィルタリング方法の詳細については、関数内のコメントも参照してください。
コードをコピーします コードは次のとおりです:
function RemoveXSS($val) {
// 印刷できない文字をすべて削除します。 CR(0a)、LF(0b)、TAB(9) は許可されます
// これにより、
などの一部の文字の再間隔が防止されます。
// n、r、t による分割は一部の入力で *許可されているため、後で処理する必要があることに注意してください
$val = preg_replace('/([x00-x08,x0b-x0c,x0e-x19]) /', '', $val);
// 直接の置換。これらは通常の文字であるため、ユーザーはこれらを必要とすることはありません
// これにより、 のようなことが防止されます。
$search = 'abcdefghijklmnopqrstuvwxyz';
$search .= 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
$search .= '1234567890!@#$%^&*()';
$search .= '~`";:?+/={}[]-_|'\';
for ($i = 0; $i < strlen($search); $i++) {
/ / ;? は、オプションの ; に一致します
// 0{0,7} は、任意の埋め込みゼロ (最大 8 文字まで) に一致します
// @ @ 16 進数の値を検索します
$val = preg_replace( '/([xX]0{0,8}'.dechex(ord($search[$i])).';?)/i', $search[$i], $val); ; 付き
// @ @ 0{0,7} は '0' に 0 ~ 7 回一致します
$val = preg_replace('/({0,8}'.ord($search[$i]) .';?)/', $search[$i], $val); // ; を使用します
}
// 残りの空白攻撃は t、n、r だけです
$ra1 = Array(' javascript'、'vbscript'、'式'、'アプレット'、'メタ'、'xml'、'ブリンク'、'リンク'、'スタイル'、'スクリプト'、'埋め込み'、'オブジェクト'、'iframe' , 'frame', 'frameset', 'ilayer', 'layer', 'bgsound', 'title', 'base');
$ra2 = Array('onabort', 'onactivate', 'onafterprint', 'onafterupdate】 '、'onbeforeactivate'、'onbeforecopy'、'onbeforecut'、'onbeforedeactivate'、'onbeforeeditfocus'、'onbeforepaste'、'onbeforeprint'、'onbeforeunload'、'onbeforeupdate'、'onblur'、'onbounce'、'oncellchange'、 'onchange'、'onclick'、'oncontextmenu'、'oncontrolselect'、'oncopy'、'oncut'、'ondataavailable'、'ondatasetchanged'、'ondatasetcomplete'、'ondblclick'、'ondeactivate'、'ondrag'、'ondragend '、'ondragenter'、'ondragleave'、'ondragover'、'ondragstart'、'ondrop'、'onerror'、'onerrorupdate'、'onfilterchange'、'onfinish'、'onfocus'、'onfocusin'、'onfocusout'、 'onhelp'、'onkeydown'、'onkeypress'、'onkeyup'、'onlayoutcomplete'、'onload'、'onlosecapture'、'onmousedown'、'onmouseenter'、'onmouseleave'、'onmousemove'、'onmouseout'、'onmouseover '、'onmouseup'、'onmousewheel'、'onmove'、'onmoveend'、'onmovestart'、'onpaste'、'onpropertychange'、'onreadystatechange'、'onreset'、'onresize'、'onresizeend'、'onresizestart'、 'onrowenter'、'onrowexit'、'onrowsdelete'、'onrowsinserted'、'onscroll'、'onselect'、'onselectionchange'、'onselectstart'、'onstart'、'onstop'、'onsubmit'、'onunload');
$ra = array_merge($ra1, $ra2);
$found = true; // 前のラウンドで何かが置き換えられている限り、置き換えを続けます
while ($found == true) {
$val_before = $val;
for ($i = 0; $i < sizeof($ra); $i++) {
$pattern = '/';
for ($j = 0; $j < strlen($ra[$i]); $j++) {
if ($j > 0) {
$pattern .= '(';
$パターン .= '([xX]0{0,8}([9ab]);)';
$pattern .= '|';
$pattern .= '|({0,8}([9 |10|13]);)';
$パターン .= ')*';
}
$pattern .= $ra[$i][$j];
}N $ パターン = '/I';
$ 置換 = substr ($ ra [$ i], 0, 2). Substr ($ ra [$ i], 2); // タグをナーフするために & lt; & gt; を追加します
$ value = preg_replace ($ Pattern, $ Replacement, $ Val) // 16 進タグを除外します
($ Val_BeFore == $ Val) {
/
/
/ 置換は行われていないため、ループを終了します
$found = false;
http://www.bkjia.com/PHPjc/825147.html
www.bkjia.com true
http://www.bkjia.com/PHPjc/825147.html技術記事次の関数を使用してユーザー入力をフィルタリングし、入力が XSS 安全であることを確認できます。フィルタリング方法の詳細については、関数内のコメントも参照してください。 コードをコピーします コードは次のとおりです: ?php func...