为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

UYOU 2019-04-16 20:26:57
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*FROMtableAWHEREcolLIKE\'%?%\'';2.sql="SELECT*FROMtableAWHEREcolLIKE'%?%'";3.sql='SELECT*FROMtableAWHEREcolLIKE\'%'.'?'.'%\'';以上方式我经过尝试都不能使用,请问带%模糊查询如何书写SQL的prepare语句?有一种可行的方式如下:sql='SELECT*FROMtableAWHEREcolLIKE\'%'.$string.'%\'';但是失去了防注入的意义,请问有没有正确的方式给予我引导?:-D
查看完整描述

2 回答

?
红糖糍粑

TA贡献1815条经验 获得超6个赞

不能。
原来的prepare引入的目的,是为了预编译,生成执行计划,从而提高性能。本意可不是为了防止sqlinject。如果table都没有了,是无法预编译的。就没有意义了。
$sql="SELECT*FROMtableAWHEREcolLIKECONCAT('%',?,'%')";
涉及到的是PHPBindingaWildcard的知识。
补充:如果不bindparameter。可以直接拼接字符串。对引入的参数,都做一个escape就安全了。(函数:mysql_real_escape_string)
                            
查看完整回答
反对 回复 2019-04-16
?
芜湖不芜

TA贡献1796条经验 获得超7个赞

$db=newPDO(DB_DSN,DB_USERNAME,DB_PASSWORD,$pdo_options);
$query=$database->prepare('SELECT*FROMtableWHEREnameLIKE:name');
$query->bindValue(':name','%'.$name.'%',PDO::PARAM_STR);
$query->execute();
while($results=$query->fetch())
{
echo$results['name'];
}
                            
查看完整回答
反对 回复 2019-04-16
  • 2 回答
  • 0 关注
  • 324 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信