我已经使用准备好的插入语句多年并且假设它是正确的绑定参数或者会给出错误但是它似乎不像下面的php绑定并插入记录而没有任何错误但是更改了一个字符串应该是一个int为零。因此,可以防止SQL注入攻击,但最终会在表中出现虚假记录。 e.g:
$q = "INSERT INTO `table` (id1, id2) VALUES (?, ?)";
$stmt = mysqli_stmt_init($dbc);
$stmt->prepare($q);
$id1 = 'aaaaaaa';
$id2= 'aaaaaaa';
$result = $stmt->bind_param('ii', $id1, $id2);
echo '<p>' . $result . '</p>'; // Trying to bind a string to an int returns true!
echo $dbc->error; // nothing
$stmt->execute(); // inserts record changing $id2 to zero but auto-increments primary key $id1
echo $dbc->error; // nothing
这是在Apache / 2.2.14,PHP / 5.3.1和MySQL 5.1.41的Xampp环境中运行。谁能告诉我发生了什么事?
答案 0 :(得分:0)
我肯定不是专家,但一开始看。 你有:
$id1 = 'aaaaaaa';
$id2= 'aaaaaaa';
$result = $stmt->bind_param('ii', $id1, $id2);
你的'ii'
参数表示你将绑定整数!事实上,您的$id1
和$id2
是字符串。对于你应该使用的字符串:
$result = $stmt->bind_param('ss', $id1, $id2);
希望它有所帮助!
答案 1 :(得分:0)
$ stmt-&gt; bind_param()不检查特定类型的给定变量,它只将它们转换为指定的类型。并且你的字符串'aaaaaa'被转换为int值:0。就像php那样。
如果您的变量包含有用/正确的值,则数据库插入语句是错误的检查位置。如果您的验证有效,请之前执行此操作,并尝试插入它们。
要对int进行验证,可以使用php-function is_numeric()或is_int()。