php注入防止のいくつかの総括


特殊文字処理に関するいくつかのPHP関数
関数名
釈義
紹介する
htmlspecialchars
AND、シングル二重引用符、大なり小なりをHTML形式にする
&転成&「転成」'転成'>転成>
htmlentities()
すべての文字をHTML形式に変換
上のhtmlspecialchars文字のほか、2バイト文字が符号化されて表示されるなども含まれています.
 
 
 
addslashes
単二重引用符、反斜線およびNULLに反斜線エスケープを付ける
変更された文字には、単一引用符(')、二重引用符(")、逆斜線backslash()、および空の文字NULLが含まれます.
stripslashes
バックスラッシュ文字を削除
文字列の反斜線文字を削除します.連続して2つの反斜線がある場合は、1つを削除し、1つを残します.反斜線が1つしかない場合は、直接削除します.
 
 
 
quotemeta
参照記号を追加
文字列に.\+*?[^]($)などの文字の前に反斜線""記号を入れます.
nl2br()
改行文字を
 
strip_tags
HTMLおよびPHPタグの削除
文字列内のHTMLタグとPHPタグを削除します.タグのブロック間の内容も含まれます.文字列HTMLおよびPHPタグにエラーがある場合は、エラーも返されます.
mysql_real_escape_string
エスケープSQL文字列の特殊文字
エスケープx 00rスペース'"x 1 aは、マルチバイト文字処理に有効です.mysql_real_escape_stringは文字セットを判断しますmysql_escape_stringは考慮しない.
一般的なフォームの特殊文字処理についてまとめます.
テスト文字列:
$dbstr='D:\test
http://www.metsky.com,    
\'!=\'1\' OR \'1\'
alert("Fail");
PHP OUTPUT"; ?>';
テストコード:
 header("Content-Type: text/html; charset=UTF-8");
echo "------------------------------------------------------
\r
"; echo $dbstr."
\r
------------------------------------------------------
\r
"; $str=fnAddSlashes($_POST['dd']); echo $str."
\r
------------------------------------------------------
\r
"; $str = preg_replace("/\s(?=\s)/","\\1",$str);// $str = str_replace("\r","
",$str); $str = str_replace("
","
",$str); $str = preg_replace("/((
)+)/i", "
", $str);//
$str=stripslashes($str); echo strip_tags($str)."
\r
------------------------------------------------------
\r
"; echo htmlspecialchars($str)."
\r
------------------------------------------------------
\r
"; echo htmlentities($str)."
\r
------------------------------------------------------
\r
"; echo mysql_escape_string($str)."
\r
------------------------------------------------------
\r
";

文字列には、バックスラッシュパス、シングル二重引用符、HTMLタグ、リンク、ブロックされていないHTMLタグ、データベース構文フォールトトレランス、JS実行判断、PHP実行判断、複数の連続リターン改行とスペースが含まれています.一部の概念には関係が含まれています.以下同じです.
ソース出力は以下の通りです(JSスクリプトが実行されます).
二、フォーム提出データ処理
1、逆斜線を強制的に入れる
一部のホストではデフォルトでget_magic_quotes_gpcを参照するマジックリファレンスがオンになっているため、オフになる可能性があるため、プログラムには逆斜線を強制的に追加することが望ましい.これにより、文字は単一引用符、二重引用符、逆斜線を含む統一的に処理することができる.
function fnAddSlashes($data)
{
    if(!get_magic_quotes_gpc()) //  POST/GET/cookie         
        return is_array($data)?array_map('addslashes',$data):addslashes($data);
    else
        return $data;
}

関数fnAddSlashes($data)を使用します.結果は次の図のようです(JSスクリプトは実行されませんが、HTML、JS、PHPタグはフォールトトレランス処理が必要です):
stripslashes、改行置換、スペース置換の結果を下図に示します.
2、特殊文字処理
以下は、いくつかの一般的な文字列処理です.具体的な状況に応じて切り捨てることができます.フォームデータのコミットがエスケープされているため、コンテンツの置換またはフィルタリングが必要な場合は、関連文字へのaddslashesの影響を考慮する必要があります.置換または検索時には、バックスラッシュバーの追加を考慮する必要があります.他の文字置換は影響しません.たとえば、r置換などです.
A、複数の連続スペースは1つのみ保持
$data=preg_replace("/s(?=s)/"\1"、$data);//複数の連続スペースは1つのみ保持
B、リターン改行を$data=str_replace("r",",$data);$data=str_replace(",",",$data);
//htmlのデフォルトはブロックされていません.xhtmlにはブロックがあります.使用することをお勧めします.もっと違いがあります.http://stackoverflow.com/questions/1946426/html-5-is-it-br-br-or-br
C、複数連続1個のみ保持
$data=preg_replace("/((()+)/i",",$data);//複数の連続ラベルは1つのみ保持
D、HTMLタグを全てフィルタ
この方法は、HTML、リンク、非ブロッキングHTMLタグ、JS、PHPなど、潜在的に危険なタグをすべてフィルタリングすることである.
関数strip_tags($data)の使用
この関数を使用すると、すべてのHTMLタグ(リンクを含む)とPHPタグ、JSコードなどがフィルタリングされ、リンクはリンク元のままタグとhref部分の内容、PHPタグとJSタグは全体的に除去して、中間の内容を含んで、以下の図:を削除するだけです.
E、タグをフィルタリングせずにHTML化する
この方法は,元の提出内容をすべて通常のテキストで処理する.
関数htmlspecialchars($data)を使用します.この関数を実行すると、コミットされたデータはすべて通常のテキストで表示されます.以下の図です.
htmlentities関数を使用して結果を実行します(中国語で文字化けしを表示します):
三、データベースへの書き込み
addslashes($data)を使用すると、高度な信頼性のあるユーザーに対して直接データベースに書き込むことができますが、addslashesは0 xbf 27の代わりに単一引用符をブロックできません.mysql_real_escape_stringまたはmysql_escape_stringを使用してエスケープすることが望ましいですが、エスケープする前に反スラッシュを除去する必要があります(addslashesがデフォルトでオンになっていると仮定します).
function fnEscapeStr($data)

{

if (get_magic_quotes_gpc())
{
        $data= stripslashes($value);
}
$data="'". mysql_escape_string($value) ."'";
return $data;
}

$data=fnEscapeStr($data);

以下の図を実行します.
四、提出後の即時表示
1.addslashesを使用している場合は、データを表示する前に反斜線を除去する必要があります.
関数stripslashes($data)の使用
注意この関数はaddslashes($data)で処理されたデータのみに向いているので、慎重に使用してください.そうしないと、逆斜線が失われます(コンテンツのフォルダパス分割線、ドライブパスなど).天縁の先日のエラーは、データベースの読み取り時にこの関数を使用したためです(コードは古いコードで、修正を忘れました)データベースへの再書き込みにより、多くのパスのスラッシュが失われる可能性があります.本明細書もありません.
2、関数htmlspecialchars($data)を使用します.この関数は実行後、提出データをすべてテキストに従って表示します.リンクを許可するなど特別な処理が必要でない限り、htmlspecialchars出力を一律に使用することができます.特に、ブロックされていないHTMLタグについては、フィルタリングされていない場合はタグ変換を採用しないと、出力後にレイアウトが混乱する可能性があります.
htmlentitiesは使用をお勧めしません.出力のソースコードに大きな読解障害をもたらす一方で、htmlentities関数を使用すると、中国語のような2バイトの文字が文字化けして表示されます.他の文字の表示は正常です.
天縁ブログよりhttp://www.metsky.com/archives/377.html