2016-04-17 33 views
0

我用PDO读/为了防止SQL注入进入MySQL数据对于PHP 5.6和PDO,是否需要转义角色?

$stmt = $DBH->prepare("SELECT * FROM T_Users WHERE User_Name = :UN"); 
$stmt->bindParam(':UN', $user_name); 
$stmt->execute(); 

中我应该在数据库中输入他们之前或在显示数据库中的数据之前逃脱字符的任何原因浏览器吗?通过将JavaScript代码记录到我的数据库中,恶意的人可以利用我的网站或其他用户吗?

谢谢!

+1

你应该在这种情况下不要手动转义任何东西。数据绑定不会转义,如果您另外手动转义,则最终会出现“双重转义”字符。不是你想要的。这一切都在文档中进行了解释。 – arkascha

+0

通过使用Prepared,Parameterized Queries,您已经在处理SQL注入。没有必要逃脱任何东西了。 –

+0

如果恶意用户选择他的用户名为JavaScript代码 - 如果用户的用户名显示在浏览器中,会伤害其他用户吗?也许我只是太偏执...... – Mike

回答

2

->prepare();方法与bindParam()一起为您做所有事情,所以不需要做任何事情。

将参数绑定到准备好的语句变量时,它将原始数据放入,而不是像以前那样将其添加到查询中! :)

+1

说出现逃跑事件并不准确:事实上并非如此。 “准备”方法不会漏掉任何东西,因为它甚至不知道那个时候的值。它们在后来被绑定,*不*逃脱,甚至不被中间件窃取。 – trincot

+1

@trincot虽然'PDO :: ATTR_EMULATE_PREPARES'实际上在绑定它们之后会转义这些值。 (当然,它不应该;但它仍然是默认的。) – mario

+0

干杯,编辑。 –

2

你当然不应该逃避你为绑定参数传递的参数。

根本没有逃跑的事情发生。它是SQL引擎与占位符编译语句,并在稍后未单独接收参数值。 SQL引擎能够将编译语句(此时不再有SQL字符串)和确保SQL注入的整个问题变得无关紧要的参数值相结合。

您为绑定占位符传递的转义值会产生负面影响。 SQL引擎确实需要这些值,并且如果它们以某种方式被转义,引擎将不会忽略它们,而是从字面上理解它们。