我正在将我的代码从使用mysql_*
修改为PDO
.在我的代码中,我有mysql_real_escape_string()
个.这在PDO中的等效值是什么?
我正在将我的代码从使用mysql_*
修改为PDO
.在我的代码中,我有mysql_real_escape_string()
个.这在PDO中的等效值是什么?
不,没有!
从技术上讲,有PDO::quote()
个,但很少使用,也不等同于mysql_real_escape_string()
个
That's right!如果您已经按照使用prepared statements记录的正确方式使用了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注入中是安全的.
值得注意的是,出于安全考虑,您应该在DSN
中传递charset=utf8
as属性,如上图所示,并始终启用
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
因此,数据库查询中的错误不会泄露敏感数据,如目录 struct 、数据库用户名等.
最后但并非最不重要的一点是,有时你不应该described in this answer%信任PDO,并且一定会采取一些额外的措施来防止sql注入,其中一种情况是,如果你使用的是过时版本的mysql [ mysql =< 5.3.6 ]
as described in this answer
但是,与使用任何以mysql_
开头的函数相比,使用如上所示的准备好的语句总是更安全的
好书