_mysql_*
_を使用してコードをPDO
に変更しています。私のコードにはmysql_real_escape_string()
がありました。 PDOでこれに相当するものは何ですか?
いいえ、ありません!
技術的には PDO::quote()
がありますが、使用されることはめったになく、同等ではありません mysql_real_escape_string()
そうです!準備済みステートメント を使用して文書化されているように、すでにPDOを使用している場合は、MySQLから保護されます注入。
Example:
以下は、準備済みステートメント(pdo)を使用したsafeデータベースクエリの例です。
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から保護されています。
セキュリティ上の理由から、上記のDSN
で属性としてcharset=utf8
を渡し、常にPDOが例外の形式でエラーを表示できるようにする必要があることに注意してください。
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
したがって、データベースクエリからのエラーは、ディレクトリ構造、データベースユーザー名などの機密データを明らかにしません。
最後になりましたが、PDOを100%信頼するべきではない瞬間があり、SQLインジェクションを防ぐためにいくつかの特別な措置を取る必要があります。そのようなケースの1つは、mysql [ mysql =< 5.3.6 ]
as この回答で説明
しかし、上記のように準備されたステートメントを使用することは、mysql_
で始まる関数を使用するよりも常に安全です。
良い読み取り
なにもない*! PDOの目的は、何もエスケープする必要がないことです。データとして送信するだけです。例えば:
$query = $link->prepare('SELECT * FROM users WHERE username = :name LIMIT 1;');
$query->execute([':name' => $username]); # No need to escape it!
とは対照的に:
$safe_username = mysql_real_escape_string($username);
mysql_query("SELECT * FROM users WHERE username = '$safe_username' LIMIT 1;");
*まあ、マイケル・バーコウスキーが言ったように、1つあります!しかし、より良い方法があります。
_$v = '"'.mysql_real_escape_string($v).'"';
_
$v = $this->db->quote($v);
と同等です_$this->db
_にPDOインスタンスがあることを確認してください。pdoメソッドquote()
PDOではmysql_real_escape_stringの必要はありません。
PDO自体はmysqlクエリで特殊文字を調整します。匿名パラメータを渡して、実行時間にバインドするだけです。このように、属性名、電子メール、およびパスワードを持つユーザーテーブルがあり、このuse prepareステートメントに次のように挿入する必要があるとします=> $ name = "Rajes'h";として名前を渡します。
mysql_real_escape_stringと同等の必要はないので実行する必要があります
$stmt="INSERT into user(name,email,password) VALUES(:name,:email,:password)";
try{
$pstmt=$dbh->prepare($stmt);//$dbh database handler for executing mysql query
$pstmt->bindParam(':name',$name,PDO::PARAM_STR);
$pstmt->bindParam(':email',$email,PDO::PARAM_STR);
$pstmt->bindParam(':password',$password,PDO::PARAM_STR);
$status=$pstmt->execute();
if($status){
//next line of code
}
}catch(PDOException $pdo){
echo $pdo->getMessage();
}