php搜索框防止SQL注入

php搜索框防止SQL注入

  • 作者:Geticsen
  • 时间:2019-11-25
  • 358人已阅读
简介 刚开始我发现自己的搜索是有问题的,这个问题在我写完之后是没有立即发现的后来想起来有SQL注入这回事才发现这个问题于是立马修复了

刚开始我发现自己的搜索是有问题的,这个问题在我写完之后是没有立即发现的后来想起来有SQL注入这回事才发现这个问题于是立马修复了

一下是第一次直接写的语句:

 // 查询数据集
 $sql = "SELECT *  FROM geticsen_article  WHERE article_is_publish=1 and article_source_id=0 and article_title like '%".$keywords."%' or article_summary like '%".$keywords."%' order by id desc";
 $articles = Db::query($sql);
 $types =  Db::name("label")->where("label_parent_id","=","0")->column('id,label_name');

这个是有很大问题的如果对于传过来的$keywords没有过滤极容易被SQL注入

例如下面:

image.png

对于输入的keywords 为 545' or 1=1  or id like '444 组合而成的SQL就是如下了:


SELECT * FROM geticsen_article WHERE article_is_publish=1 and article_source_id=0 and article_title like '%545' or 1=1  or id like '444%' or article_summary like '%545' or 1=1  or id like '444%'order by id desc

由于 or 1=1的存在 使得所有的文章都会被选择出来,另外一个字段 id 是猜测的其实大部分数据库的id 是不会改成别名的

对于这种情况我们需要对SQL中的keywords进行过滤,一下是具体代码:

 $check = preg_match('/select|insert|update|delete|\'|\\*|\*|\.\.\/|\.\/|union|into|load_file|outfile/i',$keywords);
 if(!$check){
       // 查询数据集
       $sql = "SELECT *  FROM geticsen_article  WHERE article_is_publish=1 and article_source_id=0 and article_title like '%".$keywords."%' or article_summary like '%".$keywords."%' order by id desc";
       $articles = Db::query($sql);
 }else{
       resultBackJson(403,"forbiden",'');
 }

当我们再次输入刚刚的注入SQL的时候是被拦截下来了


image.png

以上是一个简单的用例实际的场景实在太多。

文章评论


    2019-12-06Geticsen

    [熊猫]

    回复
Top