可能重复:
Php PDO::bindParam数据类型。。它是如何工作的?
例如,假设我有以下准备好的声明:
$sth = $dbh->prepare('SELECT `name` FROM `user` WHERE `user_id` = :user_id');
我可以像这样绑定user_id参数:
$sth->bindValue(':user_id', $user_id_value);
而且我仍然可以安全地避免SQL注入。
但是,bindValue()也是一个名为data_type的可选参数,它允许您设置显式数据类型。示例:
$sth->bindValue(':user_id', $user_id_value, PDO::PARAM_INT);
这允许我声明user_id将是一个整数。
我的问题是:如果有或没有data_type参数都可以安全地防止SQL注入,那么为什么要在bindValue中使用它呢?它是用来强制数据完整性的吗?如果你事先验证了你的数据,你需要担心使用它吗?使用它还有其他我没有想过的好处吗?
基本上-是。强制执行data_types是一件好事。
不要想当然地认为可以防止注入——很久以前,我看到一篇博客文章详细介绍了使用utf8代码进行反勾和引号之类的注入;其虽然在被评估为单个字符的情况下未被转义并且因此允许注入。
这并不是说这一问题没有得到解决,我也不是说你很脆弱——只是说假设有时不是最好的做法…