这段代码对mysql注入是否安全?

时间:2013-05-04 06:26:37

标签: php mysql pdo prepared-statement

$stmt_update = $db->prepare("UPDATE 2_1_journal SET RecordDay = ?,  WHERE Number = ? ");
$stmt->execute(array($amount1, $date_day1));

这对于mysql注射是否安全?

如果安全,据我所知是因为“=?”。然后质疑“=?”作品/帮助

问题是因为这里写了http://php.net/manual/en/pdo.prepare.php

  

如果您使用bindParam或bindValue选项,Prepared语句只会从SQL注入中引导您。

     

例如,如果您有一个名为users的表,其中包含两个字段,用户名和电子邮件,而有人更新了用户名,则可能会运行

UPDATE `users` SET `user`='$var'
     

其中$ var是用户提交的文本。

     

现在,如果你做了

<?php
$a=new PDO("mysql:host=localhost;dbname=database;","root","");
$b=$a->prepare("UPDATE `users` SET user='$var'");
$b->execute();
?>
     

并且用户已输入User',email ='test for a test将发生注入并且电子邮件将更新以进行测试以及用户正在更新为User。

在我的代码(上面)中,没有bindParams,也没有bindValue。所以不知道它是否安全,如果是,那么代码的哪一部分可以确保它。请,建议

更新

阅读完本后,How can I prevent SQL injection in PHP?还有一个问题

这段代码

$stmt = $pdo->prepare('SELECT * FROM employees WHERE name = ?');
$stmt->execute(array($name));

与此相同?

$stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name');
$stmt->execute(array(':name' => $name));

如果是,那么使用第一个代码似乎更好,因为它更短?

2 个答案:

答案 0 :(得分:1)

是的,只要没有逻辑缺陷,例如使用name = '?',准备好的语句始终可以免于注入攻击。

当你想绑定不同的数据类型时,

bindParam非常有用;例如查询中的字符串,整数等。例如:

$stmt = $pdo->prepare('SELECT * FROM employees WHERE myID = ?');
$stmt->bindParam( 1, $id, PDO::PARAM_INT );
$stmt->execute();

答案 1 :(得分:0)

  

如果您使用bindParam或bindValue选项,Prepared语句只会从SQL注入中引导您。

此处手动不正确。将数据传递到execute()也是安全的。主要是使用占位符来表示查询中的实际数据。只要您使用占位符而不是实际数据 - 您就是安全的。但是,PDO不会为您提供可添加到查询中的所有内容的占位符,例如标识符。

  

此代码是否与此相同?

是。
命名占位符只是常规的“语法糖” 从技术上讲,它们在任何一种方式都是相同的 - 所以,这只是品味问题 就个人而言,我更喜欢常规的问号占位符,因为它们确实使代码显着缩短,而命名占位符使得它变得臃肿而没有任何好处。