Php 我需要转义数据库输入吗?

Php 我需要转义数据库输入吗?,php,database,validation,post,pdo,Php,Database,Validation,Post,Pdo,我了解到,使用PDO时,如果在execute中使用prepare并传递变量,则不需要转义变量: $st = $dbh->prepare("INSERT INTO mytable (name,email) VALUES (?,?)"); $st->execute(array($_POST['name'], $_POST['email'])); 这是真的吗 或者我还需要用那里的$\u POST做点什么吗?简短回答:不,你不需要逃避任何事情。参数化查询真是太棒了 长回答:不,你不需要逃避

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

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


或者我还需要用那里的$\u POST做点什么吗?

简短回答:不,你不需要逃避任何事情。参数化查询真是太棒了

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


alert('sup,我在你的网站上!')

在准备好的语句上,不需要转义(转义内容本身将导致双重转义,导致转义数据写入数据库)

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

SELECT ? FROM ? WHERE ?=?

做不到。只能使用占位符指定值。

这是真的;代码是正确的(尽管您可能希望处理未设置
$\u POST['name']
的情况)


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

在显示数据库输出时强调。通常,除非您的字段确实是HTML,否则不应在数据库中存储HTML。尽管不需要转义,但请确保检查输入值是否正确、可接受的范围、格式是否正确的电子邮件等,并在适当的情况下向用户返回错误消息。是,我只是对sql攻击感兴趣,只要你对查询中的内容和执行位置严格要求(即始终使用参数,永远不允许用户提供的数据泄漏到动态查询的串联部分),那么你就安全了。需要注意的是,PDO实际上不会进行任何转义,它只是将数据与查询语言完全隔离。不能使用占位符指定字段和表名。