注入漏洞代码和分析
复制代码 代码如下:<?php function customError($errno, $errstr, $errfile, $errline) { echo “<b>Error number:</b> [$errno],error on line $errline in $errfile<br>”; die(); } set_error_handler(“customError”,E_ERROR); $getfilter=”‘|(and|or)\\b.+?(>|<|=|in|like)|\\/\\*.+?\\*\\/|<\\s*script\\b|\
SQL注入是一种常见的网络安全威胁,它允许攻击者通过输入恶意的SQL语句来操纵数据库,获取、修改或删除敏感数据。在PHP中,防止SQL注入是非常重要的。以下是对标题和描述中涉及的知识点的详细说明:
1. **自定义错误处理**:
在提供的代码中,`customError` 函数被用来替代PHP的默认错误处理机制。当发生错误时,这个函数会显示一个包含错误编号、行号和文件名的错误信息,然后终止脚本执行。`set_error_handler` 函数用于设置自定义的错误处理器,`E_ERROR` 参数表示只对致命错误进行处理。
2. **过滤输入数据**:
代码中定义了三个变量 `$getfilter`, `$postfilter`, 和 `$cookiefilter`,它们包含了正则表达式,用于检查HTTP GET、POST和COOKIE变量中的潜在恶意字符串。这些正则表达式设计用来匹配SQL注入的常见模式,如单引号、逻辑运算符(AND、OR)、分隔符(>, <, =)、IN、LIKE等关键字,以及SQL注释和脚本标签。
3. **StopAttack函数**:
`StopAttack` 函数是用于检查用户输入的关键部分。它接收三个参数:输入变量的键名 `$StrFiltKey`,其值 `$StrFiltValue`,以及对应的过滤规则数组 `$ArrFiltReq`。如果输入值匹配了任何过滤规则,且没有`securityToken`请求变量,那么函数会记录日志并显示非法操作的警告,阻止恶意操作。
4. **日志记录**:
`slog` 函数用于将日志信息写入文件 `log.htm`。这有助于开发者追踪和诊断可能的攻击尝试。
5. **正则表达式的用法**:
在正则表达式中,`\b` 表示单词边界,`.` 匹配任意字符,`+` 表示前面的字符至少出现一次,`*` 表示前面的字符可以出现零次或多次。`|` 表示或的关系,用于匹配多个可能的字符串。`\\` 是对特殊字符进行转义的表示。
6. **预防SQL注入的其他策略**:
除了使用正则表达式过滤,还可以采用以下方法来防止SQL注入:
- 使用预处理语句(如PDO的`prepare()`和`execute()`)来分离SQL结构和用户输入。
- 使用参数化查询,避免直接拼接SQL字符串。
- 使用安全的数据库API,如MySQLi或PDO,它们提供自动转义功能。
- 对用户输入进行适当的类型检查和限制长度。
- 使用最小权限原则,确保应用连接数据库的角色只拥有执行所需操作的权限。
7. **安全令牌(securityToken)**:
代码中提到了`securityToken`,这是一种防止跨站请求伪造(CSRF)的常用方法。每个表单提交都应该包含一个随机生成的安全令牌,服务器端验证这个令牌来确保请求来自合法的来源。
这段代码通过自定义错误处理、输入过滤和日志记录,为PHP应用程序提供了基本的SQL注入防护。然而,为了全面防御SQL注入,应结合使用多种策略,并保持代码和库的更新,以应对不断演化的攻击手段。