ホームページ >バックエンド開発 >PHPチュートリアル >PHP は str_replace() 関数を使用してインジェクションを防止します_PHP チュートリアル

PHP は str_replace() 関数を使用してインジェクションを防止します_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-13 10:47:511103ブラウズ

str_replace()函数的使用就是用来替换指定字符了,那么我们正好可以利用它这一点来过滤敏感字符以太到防注入的效果,下面我来给大家总结了一些方法,给大家分享一下。


PHP各种过滤字符函数

 

 代码如下 复制代码

   /**
* 安全过滤函数
*
* @param $string
* @return string
*/
function safe_replace($string) {
$string = str_replace('%20','',$string);
$string = str_replace('%27','',$string);
$string = str_replace('%2527','',$string);
$string = str_replace('*','',$string);
$string = str_replace('"','"',$string);
$string = str_replace("'",'',$string);
$string = str_replace('"','',$string);
$string = str_replace(';','',$string);
$string = str_replace('<','<',$string);
$string = str_replace('>','>',$string);
    $string = str_replace("{",'',$string);
    $string = str_replace('}','',$string);
    $string = str_replace('','',$string);
    return $string;
    }
    ?>


    /**
* 返回经addslashes处理过的字符串或数组
* @param $string 需要处理的字符串或数组
* @return mixed
*/
function new_addslashes($string) {
if(!is_array($string)) return addslashes($string);
foreach($string as $key => $val) $string[$key] = new_addslashes($val);
    return $string;
    }
    ?>


    //对请求的字符串进行安全处理
/*
$safestep
0 为不处理,
1 为禁止不安全HTML内容(javascript等),
2 完全禁止HTML内容,并替换部份不安全字符串(如:eval(、union、CONCAT(、--、等)
*/
function StringSafe($str, $safestep=-1){
$safestep = ($safestep > -1) ? $safestep : 1;
    if($safestep == 1){
    $str = preg_replace("#script:#i", "script:", $str);
    $str = preg_replace("#<[/]{0,1}(link|meta|ifr|fra|scr)[^>]*>#isU", '', $str);
    $str = preg_replace("#[ ]{1,}#", ' ', $str);
    return $str;
    }else if($safestep == 2){
    $str = addslashes(htmlspecialchars(stripslashes($str)));
    $str = preg_replace("#eval#i", 'eval', $str);
    $str = preg_replace("#union#i", 'union', $str);
    $str = preg_replace("#concat#i", 'concat', $str);
    $str = preg_replace("#--#", '--', $str);
    $str = preg_replace("#[ ]{1,}#", ' ', $str);
    return $str;
    }else{
    return $str;
    }
    }
    ?>


/**
+------------------------------------------------ ----------
* 危険なコードをフィルタリングするために使用される安全な HTML を出力します
+------------------------------------------------ ----------
* @アクセス公開
+------------------------------------------------ ----------
* @param string $text 処理対象の文字列
* @param は許可されるタグの $tags リストを混合します (table|td|th|td など)
+------------------------------------------------ ----------
* @戻り文字列
+------------------------------------------------ ----------
​​​​*/
静的パブリック関数safeHtml($text, $tags = null)
{
$text = トリム($text);
// コメントを完全にフィルターします
$text = preg_replace('//','',$text);
//動的コードを完全にフィルタリングします
$ Text = Preg_replace ('/& LT;? |?'. '& GT;/', '', $ Text); //jsを完全にフィルタリングします
$text = preg_replace('//','',$text);
$text = str_replace('[','[',$text);
$text = str_replace(']',']',$text);
$text = str_replace('|','|',$text);
//改行をフィルタリングします
$text = preg_replace('/ ? /','',$text);
//br
$ Text = preg_replace ('/& lt; br (s/s/s/s/s/s/s/i', '[br]', $ text);
$text = preg_replace('/([br]s*){10,}/i','[br]',$text);
//イベント lang js でフィルターするなど、危険な属性をフィルターします
while(preg_match('/(<[^><]+)(lang|on|action|background|codebase|dynsrc|lowsrc)[^><]+/i',$text,$mat )){
$text=str_replace($mat[0],$mat[1],$text);
}
while(preg_match('/(<[^><]+)(window.|javascript:|js:|about:|file:|document.|vbs:|cookie)([^><] *)/i',$text,$mat)){
$text=str_replace($mat[0],$mat[1].$mat[3],$text);
}
if( empty($allowTags) ) { $allowTags = self::$htmlTags['allow'] }
//許可される HTML タグ
$text = preg_replace('/<('.$allowTags.')( [^><[]]*)>/i','[12]',$text);
// 余分な HTML をフィルタ
If ( empty($banTag) ) { $banTag = self::$htmlTags['ban'] }
$ Text = preg_replace ('/& lt;/? ('. $ Bantag. ') [^& Gt; & lt;]*& gt;/i', '', $ text); // 有効な HTML タグをフィルタリングします
while(preg_match('/<([a-z]+)[^><[]]*>[^><]*/i',$text,$mat)) {
               $text=str_replace($mat[0],str_replace('>',']',str_replace('<','[',$mat[0])),$text);
}
//转换引号
while(preg_match('/([[^[]]*=s*)("|')([^2=[]]+)2([^[]]*])/i',$text,$mat)){
$text=str_replace($mat[0],$mat[1].'|'.$mat[3].'|'.$mat[4],$text);
}
//空属性转换
$text = str_replace('''','||',$text);
$text = str_replace('""','||',$text);
//过滤错误的单个引号
while(preg_match('/[[^[]]*("|')[^[]]*]/i',$text,$mat)){
$text=str_replace($mat[0],str_replace($mat[1],'',$mat[0]),$text);
}
//转换其它所有不合法的 < >
           $text =  str_replace('<','<',$text);
$text = str_replace('>','>',$text);
           $text = str_replace('"','"',$text);
           //反转换
           $text =  str_replace('[','<',$text);
$text = str_replace(']','>',$text);
           $text =  str_replace('|','"',$text);
           //过滤多余空格
           $text =  str_replace('  ',' ',$text);
           return $text;
       }
    ?>


        関数 RemoveXSS($val) {
       // 印刷できない文字をすべて削除します。 CR(0a)、LF(0b)、TAB(9) が許可されます
       // これにより、 などの一部の文字の再間隔が妨げられます。
       // 一部の入力では * 許可されている * ため、 、 、およびそれ以降で分割を処理する必要があることに注意してください。 // 入力
       $val = preg_replace('/([x00-x08,x0b-x0c,x0e-x19])/', '', $val);
       // 直接の置換。これらは通常の文字であるため、ユーザーはこれらを必要としないはずです
       // これにより、 のようなことが防止されます。
       $search = 'abcdefghijklmnopqrstuvwxyz';
       $search .= 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
       $search .= '1234567890!@#$%^&*()';
       $search .= '~`";:?+/={}[]-_|'';
       for ($i = 0; $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); // とともに ;
       }
       // 現在、残っている空白攻撃は 、 、
だけです        $ra1 = Array('javascript', 'vbscript', 'expression', 'applet', 'meta', 'xml', 'blink', 'link', 'style', 'script', 'embed', ' object'、'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                $パターン = '/';
               for ($j = 0; $j                    if ($j > 0) {
                       $pattern .= '(';
                       $pattern .= '([xX]0{0,8}([9ab]);)';
                       $パターン .= '|';
                       $pattern .= '|({0,8}([9|10|13]);)';
                       $パターン .= ')*';
                   }
                   $pattern .= $ra[$i][$j];
               }
               $pattern .= '/i';
               $replacement = substr($ra[$i], 0, 2).''.substr($ra[$i], 2); // <>を追加します。タグをナーフします
               $val = preg_replace($pattern, $replacement, $val); // 16 進タグをフィルターで除外します
               if ($val_before == $val) {
                   // 置換は行われなかったので、ループを終了します
                   $found = false;
               }
           }
       }
       $val を返します。
    }
    ?>

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/632835.html技術記事 str_replace()関数の使用就是用来置換指定文字了,那么我们正好可利用它这来过滤敏感字符太到防注的效果,下面我来给大家总结...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。