2016-08-18 109 views
0

我有一个发送到外部网站的用户表单,并且来自该网站的响应包含唯一代码(如“a87ju89y”)。该代码对我来说很重要,所以使用准备好的语句将其输入到我的数据库中。第二阶段SQL注入

在后端我有一个运行PHP脚本,查询数据库,看看是否有新的代码这样每分钟一个cronjob:

$con = mysqli_connect($servername, $username, $password, $database); 
if (mysqli_connect_errno()){ 
echo "Failed to connect to MySQL: " . mysqli_connect_error(); 
} 
$results = mysqli_query($con, "SELECT user FROM stack ORDER BY ID"); 
$cronresults = mysqli_query($con, "SELECT run FROM kook ORDER BY ID"); 
$row = mysqli_fetch_assoc($results); 
$cron = mysqli_fetch_assoc($cronresults); 
$row2 = $row['user']; 
$cron2 = $cron['kook']; 

我的问题是,我需要一份准备好的声明简单地提取信息并阻止某种SQL注入?如果我做我该怎么做呢?

+0

第二级喷射时,另一个查询。假设你从表中选择了userdata,然后从userdata中删除了userid ='。 $ row ['userdata']',期望'userdata'是一个id,但它实际上有'0或1 = 1'。现在所有数据都将消失。请参阅https://en.wikipedia.org/wiki/SQL_injection#Second_order_SQL_injection – chris85

+0

没有什么意义,谢谢! – electricjelly

+0

几乎任何时候你传递一个值给SQL使用参数化查询,不要只传入它。 – chris85

回答

3

您不需要在这里准备好声明,因为您没有将任何数据传递到查询中。准备好的语句将查询分解为查询本身(使用占位符)和要处理的数据。这样就不会混淆什么是数据和什么是查询。

选择表中的所有行都不需要数据。

+0

太好了!真正简单的答案我很感激它! – electricjelly

1

只有在需要将值插入查询时,Prepared语句才有用。这通常是在您有一个包含要搜索的值的WHERE子句时。在你的情况下,两个查询都没有任何移动部分,所以没有任何准备好的语句可以为你做。

在一个侧面说明,你可以做一些事情来改善你的脚本:

  • 两个查询合并为一个效率:
  • 务必确认查询已运行你获取成功之前结果
  • 在SQL的末尾添加LIMIT 1如果当你在你的数据库中直接使用的数据已经将只使用第一个结果
+0

感谢您的建议!即时通讯不知道如何去约1和2任何文件,我可以参考? – electricjelly

+0

@electricjelly两个表中的'ID'字段(你指的是什么)指的是同一个东西? – BeetleJuice

+0

不,他们都只是自动编号字段两者之间没有任何联系 – electricjelly