チェックポイント:すべてのパラメータを文字列として取り扱っているか?
前のチェックポイントですべてのパラメータがエスケープ処理されているか確認しましたが,
例えば,
$sql = 'SELECT * FROM user WHERE uid = '.pg_escape_string($_POST['uid']). ' AND gid = '. pg_escape_string($_POST['gid']). ';';
としても意味がありません。$_POST['uid'] に
1; DELETE FROM user; --
などが入っていればSQLインジェクションが可能です。すべての入力を文字列として取り扱えば,
$sql = "SELECT * FROM user WHERE uid = '".pg_escape_string($_POST['uid']). "' AND gid = '". pg_escape_string($_POST['gid']). "';";
ところで,
キャストした場合,
チェックポイント:データベースが利用する文字エンコーディングを変更する場合,
データベース文字エンコーディングをSJISに変更した場合に最も影響が大きいですが,
mysql_query("SET NAMES 'sjis';");
$result = mysql_query("SELECT * FROM user WHERE first_name = '".mysql_real_escape_string($_POST['first_name'])."' AND '".mysql_real_escape_string($_POST['last_name']) "';");
$_POST['first_ とエスケープ処理され, チェックポイント:クエリを生成する場合に 実際時々見かける間違いですが, このようなプリペアードクエリの作成ではまったくSQLインジェクション対策になりません。 チェックポイント:テーブル名, テーブル名やフィールド名をパラメータで設定している場合, PHPファイルすべてから LinuxやMac OSなどでは以下のようなコマンドで検索できます。 PHPファイルすべてから LinuxやMacOSなどでは以下のようなコマンドで検索できます。 PHPファイルすべてから PHPファイルすべてから
first_
$prepared = "SELECT ". $_GET['field_name'] . " FROM " . $_GET['table_name']. " WHERE user = $1 AND group = $2";
実際の確認手順
1. ソースコード中にSQLインジェクションが可能となる可能性があるコードが無いか?
find . -name "*.php" | xargs grep -in "SET NAMES"
2. エスケープ関数が正しく使われているか?
find . -name "*.php" | xargs grep -in "mysql_real_escape_string"
3. クエリ実行箇所を確認し,
4. プリペアードクエリが利用されている箇所を確認し,