ホームページ >バックエンド開発 >PHPチュートリアル >インジェクションに対する PHP セキュリティの詳細な紹介_PHP チュートリアル
Web 上でデータを送信するには 2 つの方法があることはわかっています。1 つは get で、もう 1 つは post です。そのため、一般的な SQL インジェクションの多くは get メソッドから始まり、SQL がないため、インジェクション ステートメントにはいくつかの SQL ステートメントが含まれている必要があります。 SQL ステートメントには次の 4 つの主要な文があります。 選択、更新、削除、挿入
では、送信するデータをフィルタリングすれば、これらの問題を回避できるでしょうか?
したがって、正規表現を使用して次の関数を構築します:
コードは次のとおりです | コードをコピー |
/* 関数 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 /*、./、../、' などの危険なパラメーター文字列をすべてフィルターで除外し、送信されたファイルを制御できます。パラメータを使用すると、プログラムは次のように構築できます:
コードは次のとおりです | コードをコピー |
if (inject_check($_GET['id'])) { exit('送信したデータは不正です。確認して再送信してください!'); }その他 { $id = $_GET['id'] echo '送信されたデータは合法です。続行してください。 '; } ?>
|
コードは次のとおりです | コードをコピー |
/* 関数 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 の場合、データベース ルールに準拠していない送信されたデータの前に ' ' が自動的に付加されないことです。この場合、これらの問題を制御する必要があるため、次のように構築します。
コードをコピー | |
/*
関数名:str_check() { if (!get_magic_quotes_gpc()) // magic_quotes_gpc が開いているかどうかを判断します { $str = addlashes($str) // フィルター } $str = str_replace("_", "_", $str) // '_' を除外します $str = str_replace("%", "%", $str) // '%' を除外します
$str を返す }
|
コードをコピー | |
/*
関数名:post_check() { 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 を返す }
|