(参考https://www.cnblogs.com/shenbuer/p/7875419.html)
SQL注入:
SQL注入是利用程序需要接收来自客户端用户输入的变量或URL传递的参数且这些参数是组成SQL语句的一部分而欺骗server。
简单来说就是在一些需要接收外界输入语句作为参数的SQL命令中,因为用户偶然或恶意设计导致server被欺骗而运行本不符合要求的指令。
产生原因:
在我们编写的WEB应用中对数据库查询的语句处理存在安全漏洞,忽略了对输入格式的要求及检查,导致有人利用这种漏洞设计输入信息的格式以达到这些嵌入的指令被误认为是正常的SQL指令在数据库中执行,从而达到对数据库的查看修改,甚至破坏数据库等严重操作
比如:我们设计的web应用中有这么一句话,是用来验证用户名及密码从而使用数据库的:
String sql = "select * from user_table where username = ' " + userName + " ' and password = ' " + password + " ' ";
正常情况我们需要输入正确的username及password 比如填入root 123456 语句变成:
select * from user_table where username = ' root ' and password = ' 123456'
该语句符合要求,此时数据库核实该用户名及密码是否在数据库中
但如果我们输入' or 1 = 1 -- 语句变成:
select * from user_table where username = '' or 1 = 1 -- ' and password = ''
该语句理解为:username = " 或 1=1 注释:'and password = ''
因为 or 的优先级低于 =,所以该语句一定会执行1=1即语句一定为真,而 -- 是注释的意思注释掉其后的内容,所以即可达到要求从而访问数据库。
这次只是达到要求,而如果该语句是“删库~”,后果可想而知。因此防注入刻不容缓。
防止SQL注入:
一、检查变量数据类型和格式。
从一开始我们就看出来,SQL注入是针对输入信息的格式有漏洞而进行操作的,而如果我们针对输入的信息进行类型格式检测,不符合要求的不允许访问即可避免;比如我们在注册用户名时要求必须为4-20个数字字母下划线,而在输入该变量时,设置一个checkName()函数,检测输入信息是否符合该要求。但这种方法不能避免所有情况,比如一些必须允许所有字符的情况(评论文章等)
二、过滤特殊字符。
在一些必须允许所有字符的地方,可以针对特殊字符进行筛选.
三、绑定变量、使用预编译语句。
绑定变量使用预编译语句是预防SQL注入的最佳方式,使用预编译的SQL语句语义不会发生改变,在SQL语句中变量用问号?表示,这样就无法改变SQL语句的结构,也就可以避免被注入,其中最著名的有JDBC的 Statement 和 PreparedStatement
来源:https://www.cnblogs.com/x43125/p/11309410.html