安全漏洞大揭秘:手把手教你轻松防止SQL注入


安全漏洞大揭秘:手把手教你轻松防止SQL注入文章插图
安全漏洞大揭秘:手把手教你轻松防止SQL注入!
SQL(结构化查询语言)注入是众所周知的软件弱点和安全漏洞 , 如果不是的话 , 也是最出名的漏洞之一 。 尽管享有盛名 , 但如何防止SQL注入仍然是主要漏洞之一 , 并且攻击持续增长 。
查找SQL注入根据OWASP Top 10 , 注入漏洞(其中SQL注入是其中一种)是Web应用程序安全性的头号问题 。 SQL注入在CWE Top 25中排名第六 。 其他类型的安全漏洞示例包括:

  • 指令注入(CWE-77)
  • 操作系统命令注入(CWE-78)
  • 冬眠注射(CWE-564)
  • 表达语言注入(CWE-917)
所有这些漏洞都有一个共同的属性 。 利用来自系统外部的数据 , 用户或文件输入或任何潜在危险功能来利用它们 。
幸运的是 , SQL注入可以通过工具静态和动态地检测到 。 但是 , 您永远无法确定是否全部抓住了它们 。 防止SQL注入也是减少这些漏洞的频率和影响的关键 。 结合了漏洞检测和预防功能的成熟DevSecOps流程很可能会捕获并阻止这些类型的漏洞进入已发布的产品 。
什么是SQL?SQL是一种特定于域的语言 , 旨在管理关系数据库 。 关系数据库将数据显示为行和列中的表的集合 。 每行都有一个提供与其他表的关系的键 。 这是表“user”的示例:
安全漏洞大揭秘:手把手教你轻松防止SQL注入文章插图
安全漏洞大揭秘:手把手教你轻松防止SQL注入!
与CWE Top 25中常见的漏洞枚举有关的内存错误SQL是用于管理 , 查询和处理关系数据库中数据的首选语言 。 它定义数据库创建中的表和关系 。 对于大多数日常使用 , 开发人员将SQL用于“CRUD”—创建、读取、更新和删除数据 。
为什么SQL可利用?
通用编程语言不包括对SQL的支持 。 通过数据库供应商提供的API访问数据库命令 。 在许多情况下 , SQL命令以字符串形式发送 , API会解释该字符串并将其应用于数据库 。 以下是一些简单的SQL查询:
典型的SQL查询采用以下形式:
Select (something) from (somewhere) (optional condition)以上表为例 , 从姓氏为“Smith”的行中检索电子邮件 , 使用以下SQL语句:
Select email from user where lastname = ‘Smith’输出如下:
Smith1234@mail.comJohn.smith@mail.netSmith1234@mail.com使用Web表单(见下文)从用户那里获取输入是Web应用程序中的一种常见用例 。用户在“名称”字段中输入的数据 , 例如 , 用于根据收到的输入来形成SQL查询 。考虑以下简单的Web表单:
安全漏洞大揭秘:手把手教你轻松防止SQL注入文章插图
安全漏洞大揭秘:手把手教你轻松防止SQL注入!
该软件处理表单并将值分配给变量 , 如下所示:
String formName = request.getParameter(Name);输入为“名称”的字符串用于使用该用户输入来组合查询:
String myQuery = “select message from user where email = ‘” + formName +”’;”使用此构造的查询:
Select message from user where email= ‘Smith1234@mail.com’;其输出(以上表为例)如下:
HelloHow are you希望很容易看到这一切都会出错 。 假定直接在字符串中使用用户输入 , 那么了解SQL语法的人可以轻松地操纵它来生成SQL查询 。 考虑以下示例:
使用上面相同的表格 , 有人在电子邮件字段中输入“Smith1234@mail.com”或“1” =“1” 。
相同的代码将组装以下SQL查询字符串: