中文站

SQL注入攻击原理是什么?如何防护SQL注入?

SQL注入(SQL Injection)是一种常见的 Web 安全漏洞,攻击者利用这个漏洞,可以获取或修改一些敏感数据,或者利用潜在的数据库漏洞进行攻击。本文主要介绍了SQL注入攻击原理、SQL 注入漏洞分类和防护方法。

1.SQL注入攻击原理

SQL注入是发生于应用程序与数据库层的安全漏洞。注入的漏洞本质是代码和数据未分离,通过在用户可控参数中注入SQL语法,程序未对输入的指令进行合法性判断,注入进去的恶意指令就会被数据库服务器误认为是正常的SQL指令而运行,破坏原有 SQL 结构,达到编写程序时意料之外结果的攻击行为。

以下示例存在 SQL 注入漏洞:

由于上面在拼接 SQL 语句的时候,并未对用户的参数进行检查,假如用户输入的参数 是精心构造的,像如下的值。

由于上面在拼接 SQL 语句的时候,并未对用户的参数进行检查,假如用户输入的参数 是精心构造的,像如下的值。

2.SQL 注入漏洞分类

按照数据库返回的结果可以分为回显注入和盲注

回显注入:攻击者可以直接在当前界面内容中获取想要的内容或者通过报错信息 获取想要的内容。

盲注:数据库查询结果无法从直观页面中获取,攻击者通过使用数据库逻辑或使 数据库执行延时等方法获取想要的内容。

另外,按照SQL注入按照参数类型可分为两种:数字型和字符型。字符型SQL注入需要单引号来闭合。

3.SQL 注入漏洞危害

(1)泄露数据库中敏感数据给未授权用户,SQL 注入漏洞可以绕过一些认证,可能导致用户名、账号、密码、手机号码、身份证号码等用户信息的泄露;

(2)通过一些精心构造的注入手法,可能会获取到管理员的后台密码,甚至获得非法提权和用户系统的权限;

(3)据结构被黑客探知,得以做进一步攻击;

(4)黑客可能会在系统中添加恶意链接、恶意代码等,进行恶意篡改。

4.SQL 注入漏洞防护

针对 SQL 注入漏洞的防护,主要是要意识到这种漏洞的存在,不信任任何来自客户端 的数据。可以通过过滤一些 SQL 关键字的方式进行防护,比如“select”、“insert”这一类 关键字,“`” (反引号) 、“ ””(双引号)、“--”( SQL 注释开头)这一类保留字符等。当然因为各种编码和绕过技术,手工进行过滤是不够的,容易遗漏,比较安全的方式是采用语言 预置的功能,例如,用 Java 的 PreparedStatment 进行 SQL 操作。

当然,现在还有很多框架类的数据操作工具可以给我们帮助,常见的数据库持久化框架,都会自动完成对相关数据的过滤和校验。最后,千万不要使用字符串拼接的方式进行 SQL 语句的组装和操作。 

参考文献:《云原生应用架构实践》 网易云基础服务架构团队著

https://sq.163yun.com/blog/article/220978758884847616

相关阅读:

如何防护XSS漏洞?

如何处理DNS劫持?

入侵检测系统简介