接受用户输入的简单行为打开了利用漏洞的大门.问题主要源于数据的逻辑管理,但幸运的是,避免这些主要缺陷相当容易.
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子句.
考虑全部输入的必要显式控制类型,例如 :
控制使用的转义字符.
控制输入的特定相应数据类型.将输入限制为必要的数据类型和大小.
控制输入数据的语法.不要允许任何超出所需模式的内容.
控制允许的条款.黑名单SQL关键字.
您可能不知道注入攻击的危险,或者可能认为它们无关紧要,但它们在安全列表中名列前茅关注.此外,考虑这两个条目的影响 :
1=1-or-*
允许将其中任何一个与正确的命令一起输入的代码可能会导致泄露数据库上的所有用户数据或删除数据库上的所有数据,并且两者都不会注入特别聪明.在某些情况下,攻击者甚至不花时间检查漏洞;他们使用简单的输入执行盲目攻击.
此外,考虑与MariaDB配对的任何编程/脚本语言提供的模式匹配和正则表达式工具,它们提供更多控制,有时更好的控制.