MySQL 面试:什么是 SQL 注入攻击?如何防止这类攻击?

下面是学习 MySQL 中的 SQL 注入攻击的提议课程:

感谢您阅读这篇文章。更多面试问题:
https://programmerscareer.com/zh-cn/software-interview-set/

主题:SQL 注入攻击简介

SQL 注入(SQLi)是网站应用安全性漏洞中最著名的类别之一。它发生在攻击者可以在输入字段中插入恶意 SQL 语句以执行或修改时。简单来说,SQLi 攻击利用网站的弱输入验证,其中 SQL 命令被解析。

这种攻击可能导致未经授权的用户列表查看、整个表的删除以及在某些情况下,攻击者可能会获得管理员权限,全部通过在数据库上运行恶意 SQL 语句来完成。SQLi 相对容易防止,但仍然发生非常频繁,并且具有令人惊讶的后果。

攻击者可以通过在被包含在 SQL 语句中的字段中插入自己的命令来操纵您的 SQL 查询。这些攻击成功时,网站应用程序未能正确验证输入之前将其包含在 SQL 查询中。

例如,想象一下一个简单的登录功能,其中用户必须输入用户名和密码。与此功能相关的 SQL 查询可能会像这样看起来:

1
SELECT * FROM users WHERE username = '[username]' AND password = '[password]';

在这种情况下,攻击者可能会提交“admin'; --”作为他们的用户名。您的查询将然后看起来像这样:

1
SELECT * FROM users WHERE username = 'admin'; --' AND password = '[password]';

在 SQL 中,从 -- 开始的任何内容都被视为注释并被忽略。因此,攻击者已经成功地绕过了密码检查并可以以 admin 身份登录。

请记,这是 SQLi 的最简单形式——存在更复杂的 SQLi 方法,它们可能会有更为严重的后果。

主题:SQL注入攻击的示例

SQL注入攻击的形态很多种。下面是一些常见的例子:

1. 显示隐藏数据:
假设我们有一个显示过滤后的产品的页面:

1
https://example.com/products?category=Books

它可能使用以下 SQL 查询:

1
SELECT * FROM products WHERE category = 'Books'

攻击者可以更改 URL 到:

1
https://example.com/products?category=Books' OR '1'='1

这可能会修改 SQL 查询为:

1
SELECT * FROM products WHERE category = 'Books' OR '1'='1'

由于 ‘1’=’1’ 总是真的,它会显示所有的产品,不仅仅是书籍。

2. 绕过应用程序逻辑:

考虑另一种情况,其中应用程序检查用户的登录凭证使用以下代码:

1
SELECT * FROM users WHERE username = '$username' AND password = '$password'

攻击者可以使用 SQLi 绕过密码检查使用以下输入:

1
2
' OR '1'='1' -- 对于用户名
randompassword 对于密码

这将看起来像:

1
SELECT * FROM users WHERE username = '' OR '1'='1' --' AND password = 'randompassword'

注释掉密码检查的 SQL 查询的部分,导致非授权的登录。

3. UNION 攻击:

UNION 操作可以用于从数据库的其他表中检索数据。例如,URL:

1
https://example.com/products?category=Books

如果查询是:

1
SELECT price, name, description FROM products WHERE category = 'Books'

攻击者可能会试:

1
https://example.com/products?category=Books' UNION SELECT username, password FROM users --

这可能会导致泄露用户凭证。

请记住,这些攻击大量依赖于后端查询结构和保护机制的存在。不是所有的网站或数据库都会受到这些精确的攻击。然而,这些示例应该能够给你一个想法,说明 SQLi 利用了不正确处理用户提供的数据来操纵 SQL 查询。

主题:了解 SQL 注入的影响

SQL 注入可能导致各种危险后果,其严重程度大量取决于攻击者侵害的用户帐户的权限和数据库的用途。下面是 SQL 注入攻击的可能影响:

1. 数据泄露:

SQL 注入攻击的最直接和危险的后果是数据泄露。如果攻击者成功利用了 SQL 注入漏洞,他们可能会获取存储在数据库中的敏感数据。这可能包括个人身份信息(PII)、财务数据、商业秘密、密码或更多内容。

2. 数据修改:

SQL 注入不仅仅是关于查看数据的事情。攻击者可能会使用它来修改或删除数据库中的数据——这可能范围从更改价格或平衡到删除整个表。

3. 丢失的可追溯性和非否认性:

SQL 注入可能会导致丢失的可追溯性和非否认性。攻击者可能会在数据库上执行操作,并以其他用户(或者管理员)的身份进行。这可能会使追踪操作的过程变得困难,创造了非否认性问题。

4. 损害商业的声誉:

成功的 SQL 注入攻击可能会严重损害业务的声誉。客户信任商业处理其数据,并且一旦发生数据泄露,可能会损失这种信任。

5. 法律后果:

根据侵害的数据和司法管辖区,SQL 注入攻击可能会导致法律后果,例如罚金、诉讼或两项都有。

这些后果显示了 SQL 注入攻击的重要性,并且在接下来的课程中,我们将深入探讨如何防止它们。

主题:防止 SQL 注入攻击

防止 SQL 注入攻击的关键是确保应用程序和数据库之间的数据流是安全和有保证的。下面是可以用来帮助防止 SQL 注入攻击的技术:

1. 使用准备好的语句(参数化查询):

最有效的方法是使用准备好的语句。定义了参数的准备好的语句确保参数被绑定到查询中,并且不是查询的一部分,这意味着攻击者不能影响查询结构。这有效地消除了所有的 SQL 注入攻击。大多数网络语言现在都支持准备好的语句。

2. 使用存储过程:

与准备好的语句类似,存储过程也分离了数据和命令和查询。然而,存储过程还具有额外的好处,例如提高性能和可重用的代码。

3. 输入验证:

虽然这种方法自身不足以防止 SQL 注入攻击,但它仍然是必要的步骤。通过验证用户输入,我们确保它符合长度、类型、语法和业务规则的特性。

4. 最小权限原则:

不要为用户帐户提供更多的权限,它们所需要的。例如,如果帐户仅用于在应用程序中执行选择语句,就不要为其提供删除表的能力。如果攻击者侵害了有限的帐户,则可能会限制其造成的损害。

5. 定期更新和补丁:

保持数据库管理系统(DBMS)和所有软件的更新和补丁,并使用最新的安全修复。

这些是可以用来确保数据库的安全性并防止 SQL 注入攻击的几个防护技术。

中文翻译:

主题:防止 SQL 注入的最佳实践

除了上述防止措施外,下面是更多的最佳实践,可帮助避免 SQL 注入漏洞:

1. 数据转义:

数据转义是指将数据处理为原始数据,而不是作为 SQL 查询的一部分。这可以通过使用特定的函数来转义特殊字符,例如引号,或者通过使用预编译语句来隐式处理。

2. 详细错误处理:

黑客经常依赖数据库的错误消息来获取数据库的结构信息。最佳实践是避免直接向终端用户暴露这些错误,相反,使用通用错误消息并将详细错误信息记录到一个安全的文件中,开发人员可以参考这些详细信息。

3. 使用 Web 应用程序防火墙 (WAF):

Web 应用程序防火墙可以检查进入数据的数据并识别恶意 SQL 代码。它们不能替代良好的编码实践,但它们可以作为额外的防线。

4. 定期代码审查:

定期进行代码审查,其中安全是其中一个主题。这可以帮助确保安全编码实践被遵循并捕获潜在的问题。

5. 进行测试并使用安全工具:

定期测试应用、数据库和基础设施的安全性。有许多自动化工具可用,可以扫描 SQL 注入和其他漏洞。

记住,安全是一个过程,不是一个状态。定期更新技能和知识,了解新的漏洞和攻击技术,并定期审核和改进应用是维护强大安全性的一部分。

主题:测试 SQL 注入漏洞

测试 SQL 注入漏洞是确保应用和数据库的安全性的关键部分。它可以手动进行或者使用自动化工具进行。下面是详细说明:

1. 手动测试:

手动测试涉及使用技术来注入特殊字符到应用的输入中并观察应用的反应。例如,输入单引号 ' 到文本字段中。如果应用抛出 SQL 错误,这可能表明应用受 SQL 注入攻击的影响。另一方面,如果应用运行良好并显示输入的字符,这可能表明应用正确处理输入。

记住,SQL 注入可能会以多种形式出现,并且详尽的手动测试可能涉及试验许多输入。

2. 自动测试与安全工具:

还有许多自动化工具可用,用于帮助检测 SQL 注入漏洞。这些工具可以爬行应用并测试各种输入,节省时间并提供详细的评估。它们可以测试已知的 SQL 注入技术并生成报告,显示可能的漏洞。

例如,SQLMap、Havij 和 Netsparker。

虽然测试和自动化工具可能非常有用,但它们并不完全可靠。即使工具未发现任何漏洞,这并不意味着应用是安全的。建议结合这些方法与上述防止技术和最佳实践。

主题:SQL 注入的审查和评估

审查:

  1. SQL 注入攻击: 这是一种攻击方法,攻击者通过注入恶意 SQL 代码来操纵 SQL 查询,通过用户输入进行。
  2. 防范措施: 主要手段包括预编译语句、存储过程、输入验证和强制最小特权,并定期更新系统。
  3. 最佳实践: 这包括数据转义、详细错误处理、使用 Web 应用程序防火墙 (WAF)、定期代码审查和使用安全工具。
  4. 检测漏洞: 手动测试可能会涉及试验许多输入。自动化工具如 SQLMap 也可以帮助检测可能的漏洞。

现在,让我们进行评估。

评估:

下面是一些简短的问题。这些问题是为了测试我们讨论的概念的理解和应用。

  1. 系统可能会显示 SQL 注入攻击的特征是哪些?
  2. 如何使用预编译语句来防范 SQL 注入攻击?
  3. 为什么详细错误处理和不向终端用户暴露数据库错误是重要的?
  4. 描述至少两种应该遵循的最佳实践来保护自身免受 SQL 注入攻击的。

  1. 系统可能会显示 SQL 注入攻击的特征是哪些?
    答:系统可能会对 SQL 注入攻击感兴趣,如果它们直接使用未经过清理或验证的用户输入来构建 SQL 查询,或者如果它们向终端用户暴露数据库错误,或者如果它们不使用参数化查询或预编译语句。可能的征兆包括用户输入中的单引号导致错误,或者特定的输入提供了访问或数据检索,该访问或数据检索不应该可能。
  2. 如何使用预编译语句来防范 SQL 注入攻击?
    答:预编译语句分离 SQL 查询结构和用户提供的数据。这阻止攻击者通过更改查询结构来操纵查询,因为用户输入不被视为 SQL 命令的一部分,使 SQL 注入攻击无效。
  3. 为什么详细错误处理和不向终端用户暴露数据库错误是重要的?
    答:向终端用户暴露数据库错误可以为攻击者提供有用的信息关于数据库结构或应用设计,这可以用于攻击。另外,详细错误处理是防范 SQL 注入攻击的重要部分,因为它们允许系统友好地处理问题并可能提供日志或其他机制来警告可能的攻击。
  4. 描述至少两种应该遵循的最佳实践来保护自身免受 SQL 注入攻击的。
    答:其中包括:
  • 使用预编译语句或参数化查询:这确保用户提供的输入不会更改 SQL 查询的结构不利地。
  • 输入验证:输入应该被验证为具有正确的形式之前使用。例如,如果系统期望整数,它应该确认输入确实是整数。
  • 其他最佳实践包括详细错误处理、定期系统更新、强制最小特权原则和更多。

English post: https://programmerscareer.com/mysql-interview7/
作者:Wesley Wei – Twitter Wesley Wei – Medium
注意:本文为作者原创,转载请注明出处。

MySQL 面试:产生死锁的必要条件有哪些?如何解决死锁? MySQL 面试:MySQL 的索引什么情况下会失效?

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×