Mariadb 简明教程

MariaDB - SQL Injection Protection

接受用户输入这一简单的行为为利用者打开了方便之门。该问题主要源于对数据的逻辑管理,但幸运的是,避免这些主要缺陷相当容易。

SQL 注入的机会通常出现在用户输入名称等数据时,而代码逻辑无法分析此输入时。代码允许攻击者插入 MariaDB 语句,该语句将在数据库上运行。

总是考虑由用户输入的数据,它们可能是可疑的,并且在任何处理之前都需要进行强有力的验证。通过模式匹配执行此验证。例如,如果期望的输入是用户名,请将输入的字符限制为字母数字字符和下划线以及一定的长度。查看下面给出的示例 -

if(check_match("/^\w{8,20}$/", $_GET['user_name'], $matches)) {
   $result = mysql_query("SELECT * FROM system_users WHERE user_name = $matches[0]");
} else {
   echo "Invalid username";
}

同样,在创建输入约束时利用 REGEXP 运算符和 LIKE 从句。

考虑所有类型对输入的必要显性控制,例如 -

  1. 控制使用的转义字符。

  2. 控制输入的特定适当数据类型。将输入限制为必要的数据类型和大小。

  3. 控制输入数据的语法。不允许超出所需模式的任何内容。

  4. 控制允许的术语。将 SQL 关键字列入黑名单。

您可能不知道注入攻击的危险,或者认为它们无关紧要,但它们位居安全问题之首。此外,考虑以下两个条目的效果 -

1=1
-or-
*

允许其中任何一个与正确命令一起输入的代码可能会导致揭示数据库上的所有用户数据或删除数据库上的所有数据,并且两种注入都不是特别聪明。在某些情况下,攻击者甚至不需要花时间检查漏洞;他们只需使用简单的输入执行盲目攻击。

同样,考虑任何编程/脚本语言(与 MariaDB 配对)提供的模式匹配和正则表达式工具,它们提供了更多的控制,有时会提供更好的控制。