使用参数化查询防止SQL注入

时间:2014-07-10 07:18:41

标签: php json parameterized-query

我正在尝试阻止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;

有人可以帮助我吗?

1 个答案:

答案 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']转换为整数

这就是我得到的一切。希望这会对你有所帮助。