1.PDO预处理是首选。

  你可以把他看成是要运行的sql的已经编译过的模板,它可以用变量参数进行定制

  它有两个显著优点:

    1.1:查询仅需解析一次,但可以用相同或者不同参数执行多次。换句话说如果要以不同的参数执行同样的语句执行多次,利用PDO可以大大降低应用程序的速度。

    1.2:提供给预处理的语句不需要携带引号,所以可以有效防止sql的注入。但是如果查询的其他部分是由未转义的输入来构建的,则仍存在sql注入的风险。

    1.3:另外pdo预处理无效的地方:

      1.3.1:limit语句

      1.3.2 : like %?%.  不能这么使用,占位符必须代表整个字符。所以可以这样 like ?,然后传入参数为这样的格式:%iloveyou%;

2.在处理参数之前先decode两次。防止url编码注入。

  为什么这么做呢?我暂时也不太理解,这个博客上有相关说明。特此向博主致敬!牛人,总结的真好。
  http://drops.wooyun.org/tips/968

3.然后过滤引号,括号,和一些sql关键词(最好是urldecode两次后),比如union,select,concat等,最好能匹配单词边界,有些sql注入可能使用替换关键词的办法如:seSelectlect,这样即使select被过滤了,然后又来个select。

下面是我自己写的一个sql过滤正则替换函数,在多次漏洞盒子报告错误后,我利用它做了成功的sql注入防御:

 public function removeSql($keyword){
        $temKeywords = urldecode(urldecode(trim($keyword)));
        $sqlKeywords = array("/\badd\b/i","/\(/","/\)/","/\balter\b/i","/\bupdate\b/i","/\bdelete\b/i","/\bselect\b/i","/\band\b/i","/\bor\b/i","/\bbetween\b/i","/\bgroup\b/i","/\bdrop\b/i","/\bfrom\b/i","/\bhaving\b/i","/\border\b/i","/\blike\b/i","/\bchange\b/i","/\blimit\b/i","/\bdistinct\b/i","/\'/","/\"/","/%27/i","/0x27/i","/\bmid/i","/\bdatabase\(\)/i","/\bin\b/i","/\bconcat/i","/char\(.*?\)/i","/%/","/\bunion\b/i","/\=/","/\s+/");
        $sqlReplacement = "";
        $resKeyword = preg_replace($sqlKeywords,$sqlReplacement,$temKeywords);
        return $resKeyword;
    }

做了这些处理就能抵御大部分的sql注入了。具体更多的看这篇博文:http://drops.wooyun.org/tips/968

关于防止sql注入的几个知识点的更多相关文章

  1. sql注入原理+mysql相关知识点

    什么是SQL注入 sql就是经常说的数据库,而sql注入就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令.SQL注入是比较常见的网络攻击 ...

  2. 有关SQL注入的一些小知识点

    1.判断注入点: 本质原理是找一个需要后台处理后,提交给数据库的点,我理解为用户可以控制并输入后台数据库的变量,比如我们DVWA SQL injection 的ID  ,我们可以通过闭合单引号,#注释 ...

  3. SQL注入之MySQL报错注入整理

    看大佬们的文章看得我虎躯一震,精神抖擞,于是心血来潮,整理一下MySQL报错注入常见的手段和方法,再举几个例子 <代码审计:企业级Web代码安全架构>一书中介绍过报错注入十大方法,依次是: ...

  4. sql注入知识点整理(基础版)

    sql注入知识点整理(基础版) 基本步骤 判断是否报错 判断闭合符号 判断注入类型 构建payload 手工注入或者编写脚本 基本注入类型 报错型注入 floor公式(结果多出一个1):and (se ...

  5. SQL注入基本知识点总结

    SQL注入基本知识 information_schema    MySQL 中存储所有数据库名.所有表名.所有字段名的系统数据库叫 information_schema ,这是在 MySQL 数据库初 ...

  6. sql注入知识点

    需找sql注入点1\无特定目标inurl:.php?id= 2\有特定目标:inurl:.php?id= site:target.com 3\工具爬取spider,对搜索引擎和目标网站的链接进行爬取 ...

  7. C# sql语句拼接时 like情况的防sql注入的用法

    今天下午同事问我一个比较基础的问题,在拼接sql语句的时候,如果遇到Like的情况该怎么办. 我原来的写法就是简单的拼接字符串,后来同事问我如果遇到sql注入怎么办.我想了下,这确实是个问题. 刚在网 ...

  8. SQL注入原理及绕过安全狗

    1.什么是SQL注入攻击 SQL注入攻击指的是通过构造特殊的输入作为参数插入到Web表单的输入域或页面请求的查询字符串,欺骗服务器执行恶意的SQL命令 http://www.xxx.com/list. ...

  9. SQL注入关联分析

    在Web攻防中,SQL注入绝对是一个技能的频繁项,为了技术的成熟化.自动化.智能化,我们有必要建立SQL注入与之相关典型技术之间的关联规则.在分析过程中,整个规则均围绕核心词进行直线展开,我们简单称之 ...

随机推荐

  1. 【Python学习笔记之一】Python关键字及其总结

    前言 最近在学习Java Sockst的时候遇到了一些麻烦事,我觉得我很有必要重新研究学习Python这种脚本语言,参考大神的经验,淘到了一本学习Python的好书<"笨方法" ...

  2. ”TCP连接“究竟是什么意思?

    我们经常听到"建立TCP连接","服务器的连接数量有限"等,但仔细一想,连接究竟是个什么东西,是和电话一样两端连起一根线?似乎有点抽象不是么? 1. 久违的分组 ...

  3. CSV导出大量数据

    $csvname = $csvname . '.csv'; header('Content-Type: application/vnd.ms-excel;charset=GB2312'); heade ...

  4. LinkedHashMap 源码解析

    概述: LinkedHashMap实现Map继承HashMap,基于Map的哈希表和链该列表实现,具有可预知的迭代顺序. LinedHashMap维护着一个运行于所有条目的双重链表结构,该链表定义了迭 ...

  5. JS设计模式(二) 惰性模式

    惰性模式:减少代码每次执行时的重复性判断,通过重新定义对象来避免原对象中的分支判断,提高网站性能. 例如针对不同浏览器的事件注册方法: var AddEvent = function(dom, typ ...

  6. Kia's Calculation hdu4726

    Kia's Calculation Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  7. jdbc与mybatis区别

    jdbc的缺点: 1.频繁创建连接,浪费资源 2.SQL语句硬编码,不利于维护 3.传参是硬编码,不利于维护 4.结果集是硬编码,不利于维护 但是mybatis很好的解决了这些问题.

  8. 在Kubernetes集群中使用calico做网络驱动的配置方法

    参考calico官网:http://docs.projectcalico.org/v2.0/getting-started/kubernetes/installation/hosted/kubeadm ...

  9. hadoop(二)搭建伪分布式集群

    前言 前面只是大概介绍了一下Hadoop,现在就开始搭建集群了.我们下尝试一下搭建一个最简单的集群.之后为什么要这样搭建会慢慢的分享,先要看一下效果吧! 一.Hadoop的三种运行模式(启动模式) 1 ...

  10. 不同Activity之间传递线程

    场景:Android由Activiy A创建Activiy B时 ,A创建的线程B中依然需要调用,这时候需要在两个activity之间传递线程的信息. 解决: 方式一:线程自己维护自己的静态句柄(比较 ...