函数mysql_real_escape_string的 PDO 等效项是什么?
2022-08-30 10:52:52
我正在修改我的代码,从使用到.在我的代码中,我有.在PDO中,这相当于什么?mysql_*
PDO
mysql_real_escape_string()
我正在修改我的代码,从使用到.在我的代码中,我有.在PDO中,这相当于什么?mysql_*
PDO
mysql_real_escape_string()
好吧,没有!没有!
从技术上讲,有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);
}
现在,正如您可能知道的那样,我没有使用任何东西来逃避/净化的价值。由于PDO和预准备语句的强大功能,此代码可以安全地进行myql注入。$_POST["color"]
值得注意的是,出于安全原因,您应该在上面看到一个 as 属性,并始终使 PDO 以异常的形式显示错误。charset=utf8
DSN
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
因此,来自数据库查询的错误不会泄露敏感数据,例如目录结构,数据库用户名等。
最后但并非最不重要的一点是,有些时候你不应该信任PDO 100%,并且必然会采取一些额外的措施来防止sql注入,其中一种情况是,如果你使用的是过时的mysql版本,如这个答案中所述。[ mysql =< 5.3.6 ]
但是,使用如上所示的预准备语句将始终比使用任何以 开头的函数更安全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;");
*嗯,有一个,正如Michael Berkowski所说!但是有更好的方法。