ホームページ >バックエンド開発 >PHPチュートリアル >インジェクションに対する PHP セキュリティの詳細な紹介_PHP チュートリアル

インジェクションに対する PHP セキュリティの詳細な紹介_PHP チュートリアル

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

Web 上でデータを送信するには 2 つの方法があることはわかっています。1 つは get で、もう 1 つは post です。そのため、一般的な SQL インジェクションの多くは get メソッドから始まり、SQL がないため、インジェクション ステートメントにはいくつかの SQL ステートメントが含まれている必要があります。 SQL ステートメントには次の 4 つの主要な文があります。 選択、更新、削除、挿入

では、送信するデータをフィルタリングすれば、これらの問題を回避できるでしょうか?
したがって、正規表現を使用して次の関数を構築します:

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

/*
関数名: inject_check()
機能: 送信された値に SQL インジェクション文字が含まれているかどうかを検出し、インジェクションを防止し、サーバーのセキュリティを保護します
パラメータ: $sql_str: 送信された変数
戻り値: 検出結果をtrueまたはfalseで返します
関数作成者: heiyeluren
*/

関数 inject_check($sql_str)

{

return eregi('select|insert|update|delete|'|/*|*|../|./|union|into|load_file|outfile', $sql_str); // フィルター

}


私たちの関数では、select、insert、update、delete、union、into、load_file、outfile /*、./、../、' などの危険なパラメーター文字列をすべてフィルターで除外し、送信されたファイルを制御できます。パラメータを使用すると、プログラムは次のように構築できます:


URL を a.php?id=1 として送信すると、プロンプトが表示されます:
「提出されたデータは合法です。続行してください。」
a.php?id=1%27 select * from tb_name
を送信する場合 「送信したデータは違法です。確認して再送信してください。」というプロンプトが表示されます

これで要件は満たされます。

ただし、問題はまだ解決されていません。a.php?id=1asdfasdfasdf を送信すると、上記のルールに準拠していますが、要件を満たしていないため、他の状況を考慮して別のビルドを作成します。チェックする関数:

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

if (inject_check($_GET['id']))

{

exit('送信したデータは不正です。確認して再送信してください!');

}

その他

{

$id = $_GET['id']

echo '送信されたデータは合法です。続行してください。 ';

}

?>

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

/*
関数名: verify_id()
機能: 送信された ID 値が正当かどうかを検証します
パラメータ: $id: 送信されたID値
戻り値: 処理済みのIDを返します
関数作成者: heiyeluren
*/

関数 verify_id($id=null)

{

if (!$id) { exit('パラメータが送信されていません!' } // 空かどうかを判断します

;

elseif (inject_check($id)) { exit('提出されたパラメータが不正です!') } // インジェクション判定

;

elseif (!is_numeric($id)) { exit('提出されたパラメータが不正です!' } // 数値判定

;

$id = intval($id) // 整数化

$id を返す

}


はは、それでは検証を実行できるので、上記のプログラム コードは次のようになります:

if (inject_check($_GET['id']))

{

exit('送信したデータは不正です。確認して再送信してください!');

}

その他

{

$id = verify_id($_GET['id']); // $id をフィルターするためにフィルター関数がここで引用されています

echo '送信されたデータは合法です。続行してください。 ';

}

?>

さて、問題はここで解決されたように見えますが、郵送で送信されたデータ、つまり大量のデータについて考慮したことがありますか?
たとえば、「_」、「%」など、一部の文字はデータベースに悪影響を与える可能性があります。これらの文字は特別な意味を持っているため、これらを制御するとどうなるでしょうか。もう 1 つのポイントは、php.ini で magic_quotes_gpc = off の場合、データベース ルールに準拠していない送信されたデータの前に ' ' が自動的に付加されないことです。この場合、これらの問題を制御する必要があるため、次のように構築します。

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


OK、サーバーが侵害される危険は再び回避されました。

最後に、投稿や記事やニュースの作成など、大量のデータを送信する状況を考えてみましょう。上記の関数に基づいて、次の関数を構築します。

/*

関数名:str_check()
機能: 送信された文字列をフィルターします
パラメータ: $var: 処理する文字列
戻り値: フィルタリングされた文字列を返します
関数作成者: heiyeluren
*/

関数 str_check($str)

{

if (!get_magic_quotes_gpc()) // magic_quotes_gpc が開いているかどうかを判断します

{

$str = addlashes($str) // フィルター

}

$str = str_replace("_", "_", $str) // '_' を除外します

$str = str_replace("%", "%", $str) // '%' を除外します

$str を返す

}

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

関数名:post_check()
機能: 送信された編集コンテンツを処理します
パラメータ: $post: 送信するコンテンツ
戻り値: $post: フィルターされたコンテンツを返します
関数作成者: heiyeluren
*/

関数 post_check($post)

{

if (!get_magic_quotes_gpc()) // magic_quotes_gpc が開いているかどうかを判断します

{

$post =addslashes($post); // magic_quotes_gpc がオンになっていない場合に送信されたデータをフィルタリングします

}

$post = str_replace("_", "_", $post) // '_' を除外します

$post = str_replace("%", "%", $post) // '%' を除外します

$post = nl2br($post) // 変換を入力します

$post= htmlspecialchars($post); // HTML タグ変換

$post を返す

}

http://www.bkjia.com/PHPjc/629656.htmlwww.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/629656.html技術記事 Web 上でデータを送信するには 2 つの方法があることがわかっています。1 つは get で、もう 1 つは post です。そのため、一般的な SQL インジェクションの多くは get メソッドから始まり、インジェクション ステートメントには...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。