ホームページ  >  記事  >  バックエンド開発  >  PHP によるフォーム送信での特殊文字のフィルター (アンチインジェクション)_PHP チュートリアル

PHP によるフォーム送信での特殊文字のフィルター (アンチインジェクション)_PHP チュートリアル

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

この記事では、PHP インジェクションと SQL インジェクションを防ぐために PHP で一般的に使用されるいくつかの方法をまとめます。PHP には、htmlspecialchars/addslashes/stripslashes/strip_tags/mysql_real_escape_string などの関数が用意されています。詳しく知りたい人は参照してください。

以下は、一般的に使用される形式での特殊文字の処理の概要です:

テスト文字列:

コードは次のとおりです コードをコピー

$dbstr='D:テスト
http://www.bKjia.c0m、天源ブログ
'!='1' または '1'


PHP 出力" ?>';

テストコード:

コードは次のとおりです コードをコピー

header("Content-Type: text/html; charset=UTF-8");
エコー " - - - - - - - - - - - - - - - - - - - - - - - - ------
rn";
echo $dbstr."
rn------------------------------------- --- ----------------
rn";
$str=fnAddSlashes($_POST['dd']);
echo $str."
rn------------------------------------- --- ----------------
rn";

$str = preg_replace("/s(?=s)/","1",$str);//複数の連続するスペースのうち 1 つだけを保持します
$str = str_replace("r","
",$str);
$str = str_replace("n","
",$str);
$str = preg_replace("/((
)+)/i", "
", $str);//複数の連続した
タグのみが保持されます。

$str=ストリップスラッシュ($str);
echotrip_tags($str)."
rn---------------------------------- - -----------------
rn";
echo htmlspecialchars($str)."
rn----------------------------- - -----------------
rn";
echo htmlentities($str)."
rn---------------------------------- - -----------------
rn";
echo mysql_escape_string($str)."
rn---------------------------------- - -----------------
rn";

文字列には、バックスラッシュ パス、一重引用符および二重引用符、HTML タグ、リンク、ブロックされていない HTML タグ、データベース構文許容度、JS 実行判定、PHP 実行判定、複数の連続するキャリッジ リターン、改行、スペースが含まれます。これらの概念の中には包括的な関係があるものもあります


2. フォーム送信データの処理
1. バックスラッシュを強制的に追加する

一部のホストではマジック クォーテーション get_magic_quotes_gpc がデフォルトでオンになっており、一部のホストではオフになっているため、文字に一重引用符、二重引用符が含まれるように、プログラムにバックスラッシュを強制的に追加することが最善です。バックスラッシュ。

コードは次のとおりです コードをコピー

関数 fnAddSlashes($data)
{
If(!get_magic_quotes_gpc()) //POST/GET/cookie からのデータにエスケープのみを追加します
return is_array($data)?array_map('addslashes',$data):addslashes($data);
それ以外
$data を返す;
}

2.特殊文字の処理

以下は一般的に使用される文字列処理のいくつかであり、特定の状況に応じて選択できます。送信されたフォームデータは上記でエスケープされているため、内容を置換またはフィルターする必要がある場合は、関連する文字に対するアッドスラッシュの影響を考慮する必要があり、置換または検索時にバックスラッシュの追加を考慮する必要があります。 rn 置換など、他の文字置換は効果がありません。

A. 連続する複数のスペースのうち 1 つだけを保持します

コードは次のとおりです コードをコピー

$data = preg_replace("/s(?=s)/","1",$data );//複数の連続するスペースのうち 1 つだけを保持します

B. 復帰と改行を
に置き換えます

コードは次のとおりです コードをコピー
$data = str_replace("r","
",$data );
$data = str_replace("n","
",$data );

//HTML では、
はデフォルトではブロックされませんが、xhtml では
を使用することをお勧めします。

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関数を使用して結果を実行(中国語では文字化けが表示されます):

3. データベースに書き込みます

addslashes($data) を使用した後、高度な信頼できるユーザーはデータベースに直接書き込むことができますが、addslashes は 0xbf27 に置き換えられた一重引用符をインターセプトできないため、エスケープするには mysql_real_escape_string または mysql_escape_string を使用するのが最善ですが、エスケープする前に最初にエスケープする必要があります。バックスラッシュを削除します (デフォルトでスラッシュの追加が有効であると仮定します)。

コードは次のとおりです関数 fnEscapeStr($data)

PHP ユニバーサルアンチインジェクションセキュリティコード

コードをコピー

{

if (get_magic_quotes_gpc())

{

$data= ストリップスラッシュ($value);
}
$data="'".mysql_escape_string($value) ."'";
$data を返します;
}

$data=fnEscapeStr($data);

コードは次のとおりです コードをコピー
説明:
渡された変数に不正な文字が含まれているかどうかを判断します
$_POST、$_GET など
機能:
アンチインジェクション
****************************/
//フィルタリング対象外の文字
$ArrFiltrate=array(”‘”,”;”,”union”);
//エラー発生後にジャンプするURL。入力しない場合は、前のページがデフォルトになります
$StrGoUrl=””;
//配列に値があるかどうか
関数 FunStringExist($StrFiltrate,$ArrFiltrate){
foreach ($ArrFiltrate as $key=>$value){
if (エレギ($value,$StrFiltrate)){
true を返します;
}
}
false を返します;
}
// $_POST と $_GET をマージします
if(function_exists(array_merge)){
$ArrPostAndGet=array_merge($HTTP_POST_VARS,$HTTP_GET_VARS);
}その他{
foreach($HTTP_POST_VARS as $key=>$value){
$ArrPostAndGet[]=$value;
}
foreach($HTTP_GET_VARS as $key=>$value){
$ArrPostAndGet[]=$value;
}
}
//検証開始
foreach($ArrPostAndGet as $key=>$value){
if (FunStringExist($value,$ArrFiltrate)){
echo "alert(/"Neeao プロンプト、不正な文字/");";
if (空($StrGoUrl)){
echo “history.go(-1);”;
}その他{
echo “window.location=/””.$StrGoUrl.”/”;”;
}
終了します;
}
}
?>

/************************
checkpostandget.phpとして保存
次に、各 php ファイルの前に include("checkpostandget.php"); を追加します

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/629625.html技術記事この記事では、PHP インジェクションと SQL インジェクションを防ぐために PHP で一般的に使用されるいくつかの方法をまとめます。PHP では htmlspecialchars/addslashes/stripslashes/strip_tags/mysql_re...