就是通过把SQL命令插入到Web提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意的)SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。
具体防范措施
- 参数检查
对传入的参数进行类型检查,作用很有限,一般只能处理数字类型。
对字符串类型的注入难以控制 - 参数转义
php使用addslashes函数过滤转义,将参数中的单引号或双引号,进行转义,避免被sql注入而产生新的逻辑。可以防范大多数的攻击,但仍有部分可以避过。 - 绑定变量,使用预处理语言
预编译工作原理:采用了PreparedStatement,就会将sql语句:"select id, no from user where id=?" 预先编译好,也就是SQL引擎会预先进行语法分析,产生语法树,生成执行计划,也就是说,后面你输入的参数,无论你输入的是什么,都不会影响该sql语句的 语法结构了,因为语法分析已经完成了,而语法分析主要是分析sql命令,比如 select ,from ,where ,and, or ,order by 等等。所以即使你后面输入了这些sql命令,也不会被当成sql命令来执行了,因为这些sql命令的执行, 必须先的通过语法分析,生成执行计划,既然语法分析已经完成,已经预编译过了,那么后面输入的参数,是绝对不可能作为sql命令来执行的,只会被当做字符串字面值参数。所以sql语句预编译可以防御sql注入。 - orm(本质上也是绑定变量,使用预处理)