いいえ、ありません!
技術的には、 PDO::quote()
があります。
ただし、これが使用されることはめったになく、<と同等ではありません。強い>mysql_real_escape_string()
そうです! プリペアドステートメント を使用して文書化されている適切な方法ですでにPDOを使用している場合 、それからそれはあなたをMySQLインジェクションから保護します。
#Example:
以下は安全の例です プリペアドステートメントを使用したデータベースクエリ(pdo)
try {
// first connect to database with the PDO object.
$db = new \PDO("mysql:host=localhost;dbname=xxx;charset=utf8", "xxx", "xxx", [
PDO::ATTR_EMULATE_PREPARES => false,
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
]);
} catch(\PDOException $e){
// if connection fails, show PDO error.
echo "Error connecting to mysql: " . $e->getMessage();
}
そして、接続が確立されたと仮定すると、次のようにクエリを実行できます。
if($_POST && isset($_POST['color'])){
// preparing a statement
$stmt = $db->prepare("SELECT id, name, color FROM Cars WHERE color = ?");
// execute/run the statement.
$stmt->execute(array($_POST['color']));
// fetch the result.
$cars = $stmt->fetchAll(\PDO::FETCH_ASSOC);
var_dump($cars);
}
おそらくお分かりのように、$_POST["color"]
の値をエスケープ/サニタイズするために何も使用していません。 。そして、このコードは、PDOとプリペアドステートメントの力のおかげでmyql-injectionから安全です。
charset=utf8
を渡す必要があることに注意してください。 属性として、DSN
上記のように、セキュリティ上の理由から、常にPDOが例外の形でエラーを表示できるようにします。
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
したがって、データベースクエリからのエラーは、ディレクトリ構造、データベースユーザー名などの機密データを明らかにしません。
最後になりましたが、PDOを100%信頼してはいけない場合があり、SQLインジェクションを防ぐためにいくつかの追加の対策を講じる必要があります。そのような場合の1つは、古いバージョンのmysql[ mysql =< 5.3.6 ]
この答え
ただし、上記のようにプリペアドステートメントを使用する方が、mysql_
で始まる関数を使用するよりも常に安全です。
良い読み物