Code前端首页关于Code前端联系我们

如何防止SQL注入? SQL

terry 2年前 (2023-09-28) 阅读数 52 #Web安全
如何防止SQL注入?SQL的原理、分类和判断

的原理、分类和评估1. SQL注入的含义和原理

SQL注入:利用现有应用程序将(恶意)SQL命令注入后台数据库引擎执行的能力。这是SQL注入的标准定义。

SQL注入是网站上最常见、最简单的漏洞,也是一种广泛使用的数据库攻击手段。主要原因是程序员在开发允许用户与数据库交互的系统时,没有对用户输入的字符串进行严格的过滤、转义、限制或处理。结果,用户可以通过输入精心构造的字符串来非法将数据获取到数据库中。

SQL注入基本上是恶意用户在表单中输入带有SQL关键字的数据,导致数据库执行非常规代码的过程。 SQL数据库操作是通过SQL语句来进行的,执行代码和数据项都必须写在SQL语句中。这就导致如果我们在数据项中添加某些SQL语句关键字(如SELECT、DROP等),那么这些关键字很可能在数据库写入或读取数据时被执行。

2。 SQL 注入分类和评估

1。 SQL注入分类

根据数据类型不同,分为数值类型、字符类型和查询类型;根据提交方式分为GET类型、POST类型、Cookie类型和HTTP请求头注入;按照执行效果分为故障注入、联合查询注入、盲注入和堆查询注入。盲注入可以分为基于bool的注入和基于时间的注入。从查询语句来看这是一个字符类型注入,还有GET类型注入和表单注入。数值类型注入查询语句为:SELECT * FROM user WHERE id=1,搜索类型注入查询语句为:SELECT * FROM user WHERE search as '%1%'。

2。 SQL注入回顾

如果我们知道查询语句,就很容易识别是否存在注入以及注入类型。如果我们不知道问题,可以按如下方式进行判断:在URL或表单中输入单引号或其他特殊符号。如果页面出现错误,则说明该页面存在SQL注入。如果页面正常,说明部分字符被过滤或者没有注入。

如果有注射,可以进一步判断注射类型。在 URL 或表单中输入 0 或 1。如果能找到数据,就说明是数值注入。如果输入0'或者1#,查到数据,说明是字符注入。 ,该方法并不唯一。简而言之,数字注入不需要用单引号闭合前面的单引号来执行SQL语句,而字符注入需要闭合前面的单引号才能执行SQL语句。同时,下一个单报价也应该关闭,而评论是关闭下一个单报价的好方法。

GET类型注入从URL中很容易看出。例如,该网页的URL为:http://127.0.0.1/DVWA/vulnerability/sqli/?id=1。浏览器通常使用 ?表示GET方法传递的参数。 ,而使用POST传递参数并没有体现在URL中,所以如果URL ? contains,这意味着需要使用GET方法来传递参数。 如何防止SQL注入?SQL的原理、分类和判断

3。如何有效防止SQL注入

注入问题都是由数据项中的SQL关键字执行引起的。那么只检查数据项中是否有SQL关键字不就够了吗?

这几种操作确实是可行的。很多数据库管理系统都采用这种简单粗暴的过滤方法,但并没有从根本上解决问题。例如,如果某人的名字是“Drop Table”呢?对于这种情况,各个数据库都有自己的解决方案。例如 Node mySql 可以以字符串的形式提交,像这样:

insert in Student(name) value('drop table')

Fair 安全方法有很多种:

1。数据验证

首先,尽量避免使用常见的数据库名称和数据库结构。上述情况下,如果表单名称不是students,注入的代码在执行时会报错,不会发生数据丢失。 SQL注入并不像大家想象的那么容易,它需要攻击者。您必须对数据库结构有足够的了解才能成功。因此,在构建数据库时尝试使用更复杂的结构和命名方法将大大降低攻击成功的机会。

其次,使用正则表达式等字符串过滤方法来限制数据项的大小和字符数也是一种很好的保护措施。理论上,通过避免数据项中出现引号、分号等特殊字符,可以很大程度上避免SQL注入。

使用正则表达式过滤传入参数:

包引入:import java.util.regex.*;

正则表达式:private String CHECKSQL = “^(.+)sands(. + )| (.+)sor(.+)s$”;

判断是否匹配:Pattern.matches(CHECKSQL,targerStr);

具体正则表达式如下:

检测SQL元正则表达式对于字符:/(%27)|(')|(--)|(%23)|(#)/ix

用于检测 SQL 元字符的固定正则表达式:/((%3D )|( = )) [^]*((%27)|(')|(--)|(%3B)|(:))/i

典型SQL注入攻击的正则表达式: / w*((% 27 )| ('))((%6F)|o|(%4F))((%72)|r|(%52))/ix

检测 SQL 注入、UNION 查询键 单词的正则表达式 : / (( %27)|('))union/ix(%27)|(')

用于检测 MS SQL Server SQL 注入攻击的正则表达式: /exec(s|+) + (s | ){

String inj_str = "'|en|exec|插入|选择|删除|更新|

count|*|%|chr|mid|master|截断|char|声明|;|或|-| +|," ;

String inj_stra[] = split(inj_str,"|");

for (int i=0; i if (str.indexof (inj_stra [i]) ) > = 0) {

返回 true;

}

}

返回 false;

}

肮脏。 、使用各种程序文档推荐的数据库操作方法对数据项进行查询和写入操作。例如,在上面的情况下,如果我们先做一些小的改变首先使用execute()方法保证每次执行只能执行一条语句,然后以参数的形式将SQL执行语句的数据项分开,这样就可以彻底解决SQL注入或者执行的问题避免。数据转义以避免 SQL。注射。

第四份准备好的声明。使用预编译指令集,它具有处理 SQL 注入的内置能力。只需使用setXXX方法来传递值即可。

使用的好处:(1)代码的可读性和可维护性; (2)PreparedStatement尽可能提高性能; (3)最重要的一点是安全性显着提高。

原理:SQL注入仅对SQL语句的准备(编译)过程产生破坏作用,而PreparedStatement已经准备好了。执行阶段仅将输入字符串作为数据处理,不再解析和准备SQL语句。因此,这也避免了SQL注入问题。

2。权限限制

必须严格区分普通用户和系统管理员的权限。严格限制Web应用程序数据库的操作权限,给予该用户足以完成其工作的最低权限,从而最大程度地减少注入攻击对数据库造成的损害。请记住切勿使用超级用户或所有者帐户连接到数据库!当数据库受到攻击时,将损害限制在当前表的大小是明智的选择。权限限制可以防止攻击者获取数据库的其他信息,甚至利用数据库执行Shell命令等操作。

3。日志处理

如果数据库操作失败,不要试图返回原始错误日志并释放代码中的SQL语句,以防止攻击者利用这些错误信息进行SQL注入。此外,只要有可能,使用代码或数据库系统来存储查询日志也是一个好主意。显然,日志记录并不能防止攻击,但定期检查数据库执行日志可以帮助识别 SQL 语句是否在正常应用程序逻辑之外执行。日志本身是没有用的;您必须查阅其中包含的信息。毕竟,更多信息总比没有好。

4。强制使用参数化语句

在编写SQL语句时,如果用户输入的变量不直接嵌入到SQL语句中,而是通过参数传递,就可以有效防止SQL注入。攻击。换句话说,用户输入不应该直接嵌入到 SQL 语句中。相反,用户输入必须经过过滤,或者必须使用参数化指令来传递用户输入变量。参数化语句使用参数而不是在 SQL 语句中嵌入用户输入变量。该措施可以消除大多数SQL注入攻击。不幸的是,支持参数化语句的数据库引擎并不多。但数据库工程师在开发产品时应尽量使用参数化指令。

5。备份和加密

最后,最重要的是备份数据库并加密敏感内容。对于某些安全问题,可能永远没有完美的解决方案。只有采取最基本的防护措施,才能在出现问题时补救,将损失降到最低。

SQL注入不可能在一篇文章中涵盖。相信通过本文您已经掌握了SQL注入的含义和原理,以及防止SQL注入的各种方法。

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

热门