PHPでのSQLインジェクションの防止

ユーザー入力がチェックされずにSQLクエリに挿入されると、以下の例のように、アプリケーションはSQLインジェクション攻撃に対して脆弱になります:

$variable = $_POST['input_utilisateur'];

mysql_query("INSERT INTO 'table' ('column') VALUES ('$variable')");
この例では、ユーザーは 値');DROP TABLE table;--') です。クエリは次のようになります:

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');

$statement->execute(array('name' => $nom));

foreach ($rowとして$statement) {
// 何かをする
}
2- MySQLi:

$statement = $dbConnection->prepare('SELECT * FROM administrator WHERE name = ?');
$statement->bind_param('s', $nom);

$statement->execute()を実行します。

$result = $statement->get_result();
while ($row = $result->fetch_assoc()) {
// 何かをします
}
3- メソッドの使用 PHP mysql_real_escape_string
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