SQL注入是一种常见的web攻击方式,主要是利用后端程序的漏洞,主要针对的是数据(以传统关系型数据为主)进行攻击。攻击者通过精心构造的参数,绕过服务器的验证,来执行恶意SQL语句,SQL注入会造成脱库(原始数据会被攻击者所获取) 绕过权限验证,串改、恶意删除数据,数据往往是一个网站一个系统的生命线,一旦SQL漏洞被攻击者利用通常会造成很严重的后果,我们对于SQL注入的防范。这一点需要我们的开发者加倍重视。下面是一个例子来演示SQL注入的过程。对于一个登陆验证来说,需要用户输入用户名和密码进行查询验证。查询的SQL语句如下所示:
SELECT * FROM USERS WHERE USERNAME= "$username" AND PASSWORD= "$password";
假定现在攻击者已知该网站的一个用户名:archer2018,那么攻击者可以构造密码为:"anywords=" or 1=1 此时,后端程序执行的SQL语句为:
SELECT * FROM USERS WHERE USERNAME= "archer2018" AND PASSWORD= "anywords" or 1=1 ;
这样的话,用户无论输入什么密码都会绕过验证,如果更验证一些 构造密码为:“anywords” or 1=1 ;drop table users,那么整个表都会被删掉。执行SQL语句如下所示:
SELECT * FROM USERS WHERE USERNAME= "archer2018" AND password = "anywords" OR 1=1;drop table users;
SQL注入的防范:
SQL注入发生的绝大多数情况都是直接使用用户输入参数拼接SQL语句造成的,防范SQL注入,主要的方式就是丢失避免直接使用用户输入的数据,
1.使用预编译语句,(PreparedStatement),一方面可以加速SQL的执行速度,防范SQL注入。(理解PreparedStatementf防范SQL注入的原理,首先要理解预编译语句的原理,如下图所示):
SQL 语句的编译过程,分为以下一个步骤:
(1).基本解析:包含SQL语句的语法,语义解析,以及对应的表和列是否真实存在、
(2).编译:将SQL语句编译成机器理解的中间代码格式。
(3).查询优化:编译器在所在的所有的执行方案中选择一个最优的。
(4).执行阶段:执行最终的查询方案并且吧执行的结果返回。
2.如果不可避免的要使用SQL拼装,可以对用户输入的数据进行转移,尤其是多单双引号的转义。
3.可以对用户输入数据的表单进行输入限制校验。