PHP几个防SQL注入攻击自带函数区别

SQL注入攻击是黑客攻击网站最常用的手段。如果你的站点没有使用严格的用户输入检验,那么常容易遭到SQL注入攻击。SQL注入攻击通常通过给站点数据库提交不良的数据或查询语句来实现,很可能使数据库中的纪录遭到暴露,更改或被删除。

为了防止SQL注入攻击,PHP自带一个功能可以对输入的字符串进行处理,可以在较底层对输入进行安全上的初步处理,也即Magic Quotes。(php.ini magic_quotes_gpc)。如果magic_quotes_gpc选项启用,那么输入的字符串中的单引号,双引号和其它一些字符前将会被自动加 上反斜杠。

但Magic Quotes并不是一个很通用的解决方案,没能屏蔽所有有潜在危险的字符,并且在许多服务器上Magic Quotes并没有被启用。所以,我们还需要使用其它多种方法来防止SQL注入。

许 多数据库本身就提供这种输入数据处理功能。例如PHP的MySQL操作函数中有addslashes()、mysql_real_escape_string()、mysql_escape_string()等函数,可将特殊字符和可能引起数据库操作出错的字 符转义。那么这三个功能函数之间有什么却别呢?下面我们就来详细讲述下。

虽然国内很多PHP程序员仍在依靠addslashes防止SQL注入,还是建议大家加强中文防止SQL注入的检查。addslashes的问题在 于黑客 可以用0xbf27来代替单引号,而addslashes只是将0xbf27修改为0xbf5c27,成为一个有效的多字节字符,其中的0xbf5c仍会 被看作是单引号,所以addslashes无法成功拦截。

当然addslashes也不是毫无用处,它是用于单字节字符串的处理,多字节字符还是用mysql_real_escape_string吧。

另外对于php手册中get_magic_quotes_gpc的举例:
if (!get_magic_quotes_gpc()) {
$lastname = addslashes($_POST[‘lastname’]);
} else {
$lastname = $_POST[‘lastname’];
}
最好对magic_quotes_gpc已经开放的情况下,还是对$_POST[’lastname’]进行检查一下。

再说下mysql_real_escape_string和mysql_escape_string这2个函数的区别:
mysql_real_escape_string 必须在(PHP 4 >= 4.3.0, PHP 5)的情况下才能使用。否则只能用 mysql_escape_string ,两者的区别是:mysql_real_escape_string 考虑到连接的当前字符集,而mysql_escape_string 不考虑。

总结一下:

* addslashes() 是强行加;
* mysql_real_escape_string() 会判断字符集,但是对PHP版本有要求;
* mysql_escape_string不考虑连接的当前字符集。

dz中的防止sql注入就是用addslashes这个函数,同时在dthmlspecialchars这个函数中有进行一些替换$string = preg_replace(/&((#(d{3,5}|x[a-fA-F0-9]{4}));)/, &\1,这个替换解决了注入的问题,同时也解决了中文乱码的一些问题
 

### PHP探针 SQL注入漏洞原理 PHP探针对服务器环境信息进行探测并展示,通常用于快速获取目标主机的配置详情。如果该探针程序存在未经过滤的动态SQL语句,则可能暴露出SQL注入风险。当用户通过GET或POST请求提交恶意构造的数据时,这些数据可能会被直接拼接到SQL查询中执行[^1]。 例如,在某些情况下,开发者为了方便调试而编写如下代码片段: ```php <?php $good_id = $_GET['id']; $sql = "SELECT * FROM goods WHERE id=$good_id"; $result = mysqli_query($conn, $sql); ?> ``` 上述代码中的`$_GET['id']`变量未经任何验证就嵌入到SQL字符串里,这使得攻击者能够轻松绕过正常逻辑向数据库发送任意命令。假设传入参数为 `1 UNION SELECT password FROM users--` ,则最终形成的SQL将是非法且危险的操作[^2]。 ### 利用方式分析 利用此类型的缺陷一般遵循以下几个方面特征: - **联合查询**:通过附加额外的有效负载来检索其他表内的敏感资料; - **时间延迟测试**:借助内置函数如sleep()判断是否存在可注入点; - **错误消息提取**:依据返回的具体报错内容推测内部结构; 值得注意的是,并非所有成功的尝试都会立即显现效果,有时需结合特定条件才能触发预期行为[^3]。 ### 护策略详解 #### 输入校验与转义处理 最基础也是至关重要的一步是对所有外部输入进行全面严格的检验。对于数字型字段应采用正则表达式匹配或者强制转换成整数类型;而对于字符类属性则推荐运用预编译语句配合绑定参数机制完成交互过程。此外启用PHP自带功能mysqli_real_escape_string对特殊符号做适当替换亦不失为一种有效手段,尽管它不应当单独依赖。 #### 使用ORM框架构建抽象层 现代编程提倡封装底层细节以减少人为失误几率。像Laravel所提供的Eloquent ORM可以自动管理关联关系以及止大部分常规形式下的SQL Injection问题发生。 #### 安全编码实践推广 在整个软件开发生命周期(SDLC)内贯彻安全性考量至关重要。从最初的需求文档制定阶段就应该明确规定哪些部分仅接受限定范围内的合法值,随后贯穿至设计图稿评审直至最后上线前静态应用程序安全检测环节均不可忽视。 #### 实施主动监控体系 除了事前预之外还需要建立完善的跟踪记录制度以便及时发现异常状况。例如定期审查MySQL general log寻找可疑模式匹配项可以帮助识别潜在威胁活动迹象。 ```sql SELECT * FROM mysql.general_log WHERE argument LIKE '%goods%' AND (argument LIKE '%UNION%' OR argument LIKE '%SELECT%SLEEP%') ``` 以上述脚本为例展示了如何定位涉及商品模块同时含有union关键字或是调用了延时指令的相关条目。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值