$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));
如果是,那么使用第一个代码似乎更好,因为它更短?
答案 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不会为您提供可添加到查询中的所有内容的占位符,例如标识符。
此代码是否与此相同?
是。
命名占位符只是常规的“语法糖”
从技术上讲,它们在任何一种方式都是相同的 - 所以,这只是品味问题
就个人而言,我更喜欢常规的问号占位符,因为它们确实使代码显着缩短,而命名占位符使得它变得臃肿而没有任何好处。