如何在codeigniter php mysql中以字符串形式安全地调用查询

w46czmvw  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(358)

我使用的是codeigniter,我在单独的公共函数中编写了多个查询。然后我想使用这些查询中的每一个,并在另一个查询中作为字符串调用它们来处理它们。
这就是我的意思

public function first_of_many_queries(){

    $query = "  
                SELECT *
                FROM users
                WHERE id = $id 
                AND   age = $age 
                AND   gender = $gender 
                ORDER BY id DESC LIMIT 0, 1 
            ";

    return $this->db->escape_str($this->handeling_all_queries($query, 1));

}    

public function handeling_all_queries($qry, $type){

    $query = $this->db->query($qry);

    if ($query->num_rows() > 0){
        //doo stuff
    }

}

我的问题是
这种做法安全吗?是使用 $this->db->escape_str($this->handeling_all_queries($query, 1)) 足以防止sql注入和其他问题?
谢谢

7cwmlq89

7cwmlq891#

是的,一点也不安全。您可以在codeigniter中使用查询绑定。
绑定查询是另一个有用的安全过程;如果您对查询使用绑定,那么codeigniter会自动转义值,您无需手动转义。

$query = "SELECT * FROM users WHERE id = ? AND age = ? AND gender = ? ORDER BY id DESC LIMIT 0, 1";
$this->db->query($query, $id, $age , $gender);
dfddblmv

dfddblmv2#

不,不安全。使用pdo准备的语句进行安全查询:

$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
$stmt = $conn->prepare("SELECT * FROM users WHERE id = ? AND age = ? AND gender = ? ORDER BY id DESC LIMIT 0, 1");
$stmt->execute([$id, $age, $gender]);

相关问题