我是否需要转义数据库输入?

时间:2011-12-05 14:57:42

标签: php database validation post pdo

我在PDO中读到,如果你使用prepare并在execute中传递变量,则不需要转义变量:

$st = $dbh->prepare("INSERT INTO mytable (name,email) VALUES (?,?)");
$st->execute(array($_POST['name'], $_POST['email']));

这是真的吗?

或者我还需要在那里用$ _POST做点什么吗?

3 个答案:

答案 0 :(得分:5)

在准备好的语句中,不需要转义(并且自行转义会导致双重转义,导致转义数据被写入数据库)。

但是,PDO编写的语句无法处理所有查询变体,有时您必须将“外部”数据直接插入查询字符串,这意味着您将负责正确地转义它。特别是,无法使用预准备语句指定表和/或字段名称更改的动态查询。 e.g。

SELECT ? FROM ? WHERE ?=?

无法完成。只能使用占位符指定值。

答案 1 :(得分:2)

简短回答:不,你不需要逃避任何事情。参数化查询完全令人敬畏!:)

答案很长:不,你不需要逃避任何,因为它进入数据库。但是,在显示查询的数据库输出以防止XSS攻击时,您仍然应该使用htmlspecialchars,否则您最终会在任意字段中填写类似这样的内容:

<script type="text/javascript">alert('sup, I'm in ur site!');</script>

答案 2 :(得分:2)

这是真的;代码是正确的(尽管您可能想要处理未设置$_POST['name']的情况。)

PDO准备好的语句功能以不需要显式转义的格式移交值。