以下实例中,输入的用户名必须为字母、数字及下划线的组合,且用户名长度为 8 到 20 个字符之间:
if (preg_match("/^\w{8,20}$/", $_GET['username'], $matches))
{
$result = mysql_query("SELECT * FROM users
WHERE username=$matches[0]");
}
else
{ echo "username 输入异常";
}
当没有过滤特殊字符时,出现的SQL情况:
// 设定$name 中插入了不需要的SQL语句
$name = “Qadir’; DELETE FROM users;”;
mysql_query(“SELECT * FROM users WHERE name='{$name}'”);
以上的注入语句中,没有对 $name 的变量进行过滤,$name 中插入了不需要的SQL语句,将删除 users 表中的所有数据。
2.在PHP中,mysql_query() 不允许多个SQL语句的执行,但在 SQLite 和 PostgreSQL 则可以同时执行多条SQL语句,所以研究可以从对这些用户的数据需要进行严格的验证来入手。 防止SQL注入,研究过程中需要注意以下几个要点:
- 永远不信任用户的输入。对用户的输入进行校验,可以通过正则表达式,或限制长度;对单引号和 双”-“进行转换等。
- 不选用动态组装的sql,能够选用参数化sql或者再选用select语句进行数据库查询存取款。
- 不要选用论坛管理员权限的access数据库连接,将受限管理员权限的access数据库连接分开,供各常用
- 不得对身份机密信息进行存储、加密或散列账号密码等敏感相关信息。
- 与应用程序非常有所关联关系的信息应尽可能少地给出提示。最好选择自定义错误相关信息到原始错误相关信息进行包装。
- sql注入漏洞的检测方法一般是从旁协助工具软件或者相关网站代理平台进行软件检测。例如
相关网站代理平台有易思相关网站绝对安全代理平台软件检测实用程序。MDCSOFTSCAN等。通过采用MDCSOFT-IPS能够有效防御SQL注入、XSS攻击等。
like查询时,如果用户输入的值有””和”%”,则会出现这种情况:用户本来只是想查询”abcd”,查询结果中却有”abcd_”、 ”abcde”、”abcdf”等等;用户要查询”30%”(注:百分之三十)时也会出现问题。
在PHP脚本中可以使用addcslashes()函数来处理以上情况,如下实例
$sub = addcslashes(mysql_real_escape_string("%something_"), "%_"):
// $sub == \%something\_
mysql_query("SELECT * FROM messages WHERE subject LIKE '{$sub}%'");
针对于平台层,可以通过WAF的方式大幅减少被入侵的概率、
WAF的常见特点:
异常检测协议:拒绝不符合HTTP标准的请求
增强的输入验证:代理和服务端的验证,而不只是限于客户端验证
白名单&黑名单:白名单适用于稳定的We应用,黑名单适合处理已知问题
基于规则和基于异常的保护:基于规则更多的依赖黑名单机制,基于异常更为灵活
状态管理:重点进行会话保护
另还有:Coikies保护、抗入侵规避技术、响应监视和信息泄露保护等。
本文通过对国内外研究现状以及常见SQL注入漏洞进行分析。
从攻防两个角度分别进行研究:
针对于攻击:列举常见的SQL注入漏洞类型并且加以分析。介绍若干SQL注入自动化工具以及简单的反制,
可应用于实际渗透判断注入点的若干语句。
由此,从防御的角度:研究者针对代码层与代码层提出了若干个观点:使用特殊函数addcslashes()编写脚本插入网站中、PHP参数化处理、白/黑名单等防御技术。