当前位置:Gxlcms > PHP教程 > php连接Mysql用stmt防注入如何进行模糊查询

php连接Mysql用stmt防注入如何进行模糊查询

时间:2021-07-01 10:21:17 帮助过:33人阅读

Q1:以下代码是正确的吗?即表名和列名也可以用参数化导入吗?

$sqlLink = init_mysql();
$stmt = $sqlLink->stmt_init()
$sql = 'SELECT ? FROM ?;';
$stmt->prepare($sql);
$stmt->bind_param("ss",'colA','tableA');
$stmt->execute();

Q2:参数化防止注入,如何进行模糊查询?
1.sql = 'SELECT * FROM tableA WHERE col LIKE \'%?%\'';
2.sql = "SELECT * FROM tableA WHERE col LIKE '%?%'";
3.sql = 'SELECT * FROM tableA WHERE col LIKE \'%'.'?'.'%\'';
以上方式我经过尝试都不能使用,请问带%模糊查询如何书写SQL的prepare语句?
有一种可行的方式如下:
sql = 'SELECT * FROM tableA WHERE col LIKE \'%'.$string.'%\'';
但是失去了防注入的意义,请问有没有正确的方式给予我引导?:-D

回复内容:

Q1:以下代码是正确的吗?即表名和列名也可以用参数化导入吗?

$sqlLink = init_mysql();
$stmt = $sqlLink->stmt_init()
$sql = 'SELECT ? FROM ?;';
$stmt->prepare($sql);
$stmt->bind_param("ss",'colA','tableA');
$stmt->execute();

Q2:参数化防止注入,如何进行模糊查询?
1.sql = 'SELECT * FROM tableA WHERE col LIKE \'%?%\'';
2.sql = "SELECT * FROM tableA WHERE col LIKE '%?%'";
3.sql = 'SELECT * FROM tableA WHERE col LIKE \'%'.'?'.'%\'';
以上方式我经过尝试都不能使用,请问带%模糊查询如何书写SQL的prepare语句?
有一种可行的方式如下:
sql = 'SELECT * FROM tableA WHERE col LIKE \'%'.$string.'%\'';
但是失去了防注入的意义,请问有没有正确的方式给予我引导?:-D

  1. 不能。

原来的prepare引入的目的,是为了预编译,生成执行计划,从而提高性能。本意可不是为了防止sqlinject。如果table都没有了,是无法预编译的。就没有意义了。

  1. $sql = "SELECT * FROM tableA WHERE col LIKE CONCAT('%',?,'%')";

涉及到的是 PHP Binding a Wildcard 的知识。

补充:如果不bind parameter。可以直接拼接字符串。对引入的参数,都做一个escape就安全了。(函数: mysql_real_escape_string)

$db = new PDO(DB_DSN, DB_USERNAME, DB_PASSWORD, $pdo_options);
$query = $database->prepare('SELECT * FROM table WHERE  name LIKE :name');
$query->bindValue(':name', '%'.$name.'%', PDO::PARAM_STR);
$query->execute();
while ($results = $query->fetch())
{
   echo $results['name'];
}

人气教程排行