2011-12-05 35 views
6

我阅读了PDO你不需要逃脱的变量,如果你使用准备并通过变量执行:我是否需要逃避数据库输入?

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

这是TRU?

还是我仍然需要做_POST $有什么事?

+1

尽管不需要转义,一定要检查输入值的理智,在可接受的范围,格式正确的电子邮件等,并返回错误信息给你的用户在适当情况下。 –

+0

是的,我只是对sql攻击感到好奇 – JohnSmith

+0

只要你严格对待你的查询和你的位置(例如,在任何时候都使用参数,永远不会*允许用户提供的数据泄漏连接成动态查询的连接部分),那么你将是安全的。 – Polynomial

回答

5

编制报表,没有逃脱是必要的(和逃避的事情自己将导致双转义,造成转义的数据被写入到数据库)。

然而,PDO预处理语句不能处理所有查询变量,有时你必须插入“外国”直接写入数据到一个查询字符串,这意味着你将负责正确转义它。特别是,使用预处理语句无法指定表和/或字段名称发生更改的动态查询。例如

SELECT ? FROM ? WHERE ?=? 

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

+0

选择?哪里?=似乎不起作用。显然只有价值可以有? ...... – JohnSmith

+0

没错。字段和表名称不能用占位符指定。 –

2

简短的回答:不,你不需要逃避什么。参数化的查询是完全怪异'真棒! :)

长答案:不,你不需要逃脱任何东西,因为它进入数据库。但是,您还是应该使用htmlspecialchars从查询显示数据库输出时,防止XSS攻击,否则你会与别人馅像这样在任意场结束:

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

+1

显示数据库输出时强调*。一般情况下,您应该不**将HTML存储在数据库中,除非您的字段确实是HTML。 – phihag

2

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

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

+1

需要注意的是PDO实际上并没有进行任何转义,它只是完全隔离了查询语言的数据。 – Polynomial

+0

@Polynomial谢谢,更新。 – phihag

相关问题