REJ*_*OLA 39 php mysql pdo sql-injection
我使用修改我的代码mysql_*来PDO.在我的代码中我有mysql_real_escape_string().在PDO中,这相当于什么?
sam*_*ayo 66
嗯不,没有!
从技术上来说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();
}
Run Code Online (Sandbox Code Playgroud)
而且,现在假设已建立连接,您可以像这样执行查询.
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);
}
Run Code Online (Sandbox Code Playgroud)
现在,正如你可能知道的那样,我没有用任何东西来逃避/消毒它的价值$_POST["color"].由于PDO和预处理语句的强大功能,此代码对于myql注入是安全的.
值得注意的是,出于安全原因,您应该charset=utf8在您的DSN上面传递as属性,并始终使PDO能够以异常的形式显示错误.
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
Run Code Online (Sandbox Code Playgroud)
因此,数据库查询中的错误不会泄露敏感数据,如目录结构,数据库用户名等.
最后但并非最不重要的是,有些时候你不应该信任PDO 100%,并且必然需要采取一些额外的措施来防止sql注入,其中一种情况是,如果你使用过时的mysql版本,[ mysql =< 5.3.6 ]如下所述回答
但是,使用上面显示的预处理语句总是比使用任何开头的函数更安全 mysql_
好读
Ry-*_*Ry- 27
空无一人*!PDO的目标是你不必逃避任何事情; 你只需将其作为数据发送.例如:
$query = $link->prepare('SELECT * FROM users WHERE username = :name LIMIT 1;');
$query->execute([':name' => $username]); # No need to escape it!
Run Code Online (Sandbox Code Playgroud)
相反:
$safe_username = mysql_real_escape_string($username);
mysql_query("SELECT * FROM users WHERE username = '$safe_username' LIMIT 1;");
Run Code Online (Sandbox Code Playgroud)
*好吧,就像Michael Berkowski所说的那样!但有更好的方法.
$v = '"'.mysql_real_escape_string($v).'"';
Run Code Online (Sandbox Code Playgroud)
相当于$v = $this->db->quote($v);
确保你有一个PDO实例,$this->db所以你可以调用pdo方法quote()