0
$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 选项,准备好的语句只会将您从 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 进行测试,注入将发生,并且电子邮件将被更新以进行测试以及将用户更新为 User。

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

更新

阅读本文后,如何防止 PHP 中的 SQL 注入?还有一个问题

这段代码

$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));

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

4

2 回答 2

1

是的,只要不存在逻辑缺陷(例如使用name = '?'.

bindParam当您想要绑定不同的数据类型时,它真的很有帮助;例如查询中的字符串、整数等。例如:

$stmt = $pdo->prepare('SELECT * FROM employees WHERE myID = ?');
$stmt->bindParam( 1, $id, PDO::PARAM_INT );
$stmt->execute();
于 2013-05-04T06:52:46.673 回答
0

如果您使用 bindParam 或 bindValue 选项,准备好的语句只会将您从 SQL 注入中投影出来。

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

这个代码和这个一样吗?

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

于 2013-05-04T07:11:12.157 回答