SQL注入防御方法综述

SQL注入防御方法综述
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注入防御法的总结,希望能对您以后的学习有所帮助。
免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部