PHPでのSQLインジェクションの防止
ユーザー入力がチェックされずにSQLクエリに挿入されると、以下の例のように、アプリケーションはSQLインジェクション攻撃に対して脆弱になります:$variable = $_POST['input_utilisateur'];この例では、ユーザーは 値');DROP TABLE table;--') です。クエリは次のようになります:
mysql_query("INSERT INTO 'table' ('column') VALUES ('$variable')");
mysql_query("INSERT INTO 'table' ('column') VALUES('value');DROP TABLE table;--')
ハッカーの目的は、隠された情報を読み取ったり、その他の操作(読み取り、変更、削除)を実行したりできるようにSQLクエリを変更することです。この例では、テーブルがデータベースから削除されます。
この種の欠陥は最も広範で危険であり、コードがセキュリティで保護されていない場合、リスクは甚大になります。
SQL インジェクションの欠陥に対する解決策は、準備済みクエリまたはパラメーター化されたクエリ を使用することです。実行の準備が整うと、クエリがデータベース・サーバに送信され、構文チェックが実行されます。この方法では、ハッカーが悪意のあるSQL.
このために、3つのオプションがあります:
1- PDOの使用:
$statement = $pdo->prepare('SELECT * FROM administrator WHERE name = :name');2- MySQLi:
$statement->execute(array('name' => $nom));
foreach ($rowとして$statement) {
// 何かをする
}
$statement = $dbConnection->prepare('SELECT * FROM administrator WHERE name = ?');3- メソッドの使用 PHP mysql_real_escape_string
$statement->bind_param('s', $nom);
$statement->execute()を実行します。
$result = $statement->get_result();
while ($row = $result->fetch_assoc()) {
// 何かをします
}
PHP にはこの脆弱性を修正する独自の方法がありますが、上記の 2 つの方法の方が効果的であることに注意してください。mysql_real_escape_string MySQLクエリで使用される文字列を受け取り、SQLインジェクションからエスケープされたのと同じ文字列を返します。quotas(') は \' に置き換えられます。この関数を使用するには、データベースにすでに接続している必要があります.
$nom = "' OR 1'";
$nom = mysql_real_escape_string($nom);
$query = "SELECT * FROM administrator WHERE name = '$nom'";
echo "インジェクション回避:
" です。$query ."
";
$name_vul = "';DELETE FROM 管理者 WHERE 1 or name = '";
$name_vul = mysql_real_escape_string($name_vul);
$query_vul = "セレクト* FROM 管理者 WHERE name = '$nom'";
echo "インジェクション回避:
" です。$query_vul;
参照:
https://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php