我正在尝试阻止sql注入,根据我一直在搜索的内容,使用参数化查询可以提供帮助。下面是我的PHP代码,根据其状态显示保存在数据库中的书籍,该状态是一个整数(0表示不可用,1表示可用):
public function getBooksByStatus(){
$qry=$this->stmt_init();
if($qry->prepare("SELECT bookID, title, status FROM books WHERE status= ? ORDER By title ASC")){
$qry->bind_param("i",$_GET[id]); //$_GET[id] refers to the status
$qry->execute();
echo json_encode($qry->fetch_all(MYSQL_ASSOC));
return;
}
}
在测试代码之后,它没有任何错误,但它没有返回任何内容。
这是我之前没有参数化查询的代码,实际上,它可以工作:
$qry = $this->query("SELECT bookID, title, status FROM books WHERE status= $_GET[id] ORDER By title ASC");
echo json_encode($qry->fetch_all(MYSQL_ASSOC));
return;
有人可以帮助我吗?
答案 0 :(得分:0)
我不确定PHP对于这样的事情有多敏感。但是:
$qry->bind_param("i",$_GET[id]);
首先,我会使用$ _GET ['id']纯粹。 更重要的是,我会将$ _GET ['id']转换为整数,因为你使用“i”,根据http://pl1.php.net/manual/pl/mysqli-stmt.bind-param.phpdocumentation表示整数。
$ _ GET数组总是包含字符串。
令我惊讶的最后一件事是:
$qry=$this->stmt_init();
为什么使用$ this而不是包含新mysqli对象的var名称。我想它可以有一些合乎逻辑的解释。你的课程扩展了mysqli?或者其他的东西?这对我来说似乎是不好的做法。但是它不应该对结果产生影响。
我的提示尝试将$ _GET ['id']转换为整数
这就是我得到的一切。希望这会对你有所帮助。