SQL注入是一种攻击的危险。虽然这是非常危险的,防御比XSS困难得少。
SQL注入可以看出:https: / /恩。维基百科。org / / sql_injection维基
SQL注入漏洞的
原因是要
连接SQL
参数,也就是说,用于
输入的
查询参数直接连接到SQL语句中,从而导致SQL注入漏洞。
1。经典sql注入演示
我们看到:从id = 2的
用户中选择ID;
如果语句是通过SQL字符串拼接获得的,例如,字符串,选择id,用户ID+id;
id是一个用户输入参数。如果用户输入是2,那么就会看到一个数据。如果用户输入为2或1=1,则需要SQL注入攻击。
如您所见,上面的语句(从id = 2或1 = 1的用户中选择id,NO)
检查用户表中的所有记录。
这是典型的sql注入。
再看一个专栏。
我们看到,SQL注入可以直接从表中
删除sqlinject!看到它的危害!
2。注射2的原因。SQL
SQL注入的原因,表面上看,因为拼接字符串,这使得SQL语句,不预编译的SQL语句和绑定变量。
但更深层的原因是,用户输入的字符串是作为SQL语句
执行的。
例如,上面的字符串选择ID,用户ID+ id中的否;
我们希望用户输入的id值仅是一个字符串面值,它在传入数据库中执行。但是,当输入为2或1=1时,或1 = 1不作为id =的值,而是作为SQL语句使用,因此本质上是作为
命令执行用户的输入数据。
三.SQL注入防御
1 >基本上知道预编译和绑定变量的SQL语句是防范SQL注入的最佳方式。但深层原因还没有完全弄明白。
在id =的用户中选择id,否;
PreparedStatement PS = conn.preparestatement(SQL);
Ps.setInt (1, ID);
Ps.executeQuery();
如上图所示,这是SQL语句的预编译和绑定变量的一个典型应用,为什么这能防止SQL注入
原因是:PreparedStatement将SQL语句:选择ID,没有从用户的id是预编译,这是SQL引擎会进行语法分析,语法树生成执行计划的生成,也就是说,在你输入的参数,不管你输入的是什么,做而不是SQL语句的语法结构,因为语法分析已经完成,和语法分析主要是SQL命令,如选择,,,,,,,,等等。所以即使你进入这些SQL命令,而不会像SQL命令,因为SQL命令,必须通过语法分析,方案的生成,由于语法分析已完成,已预编译,然后后面的参数输入的SQL命令的执行,这是绝对不可能的,只会是一个字符串参数,所以SQL语句编译抵御SQL注入。
2>, but not all scenarios can be precompiled using SQL statements. 有些场景必须是串联的。此时,我们严格地检查参数的数据
类型,并使用一些安全
功能来SQL注入。
例如,在用户id为id+id的
情况下,字符串select;
当我们接收到用户输入参数时,我们严格地检查id,只检查int类型。复杂的情况可以用正则表达式来判断。这也可以防止SQL注入。
安全功能的使用,例如:
mysqlcodec编解码器=新mysqlcodec(
模式。标准);
名为ESAPI.encoder(),EncodeForSQL(编的
名字);
字符串从
用户名中选择否;
ESAPI.encoder(),EncodeForSQL(编的名字)
这个
函数将编码一些包含在名称中的特殊字符,这样SQL引擎就不会以SQL命令的名称来执行语法分析。
注:
在实际工程中,我们通常使用的各种框架,如Hibernate、iBATIS、MyBatis等。他们一般
默认SQL预编译。iBATIS / MyBatis,如果用在# {姓名}的形式,那么它是SQL预编译,并使用$ {姓名}不是SQL预编译。
以上是sql注入防御法的总结,希望能对您以后的
学习有所帮助。