开发安全之:split()安全漏洞

split() 函数不安全,因为它是已弃用的 POSIX 正则表达式函数系列的一部分,该函数系列会在遇到 null 字节时停止读取输入字符串。由于 PHP 允许字符串中包含 null 字节,因此在某些情况下使用这些函数可能很危险,应完全避免。

**例 1:**根据给出的 URL http://www.example.com/index.php?param=...,如果 URL 参数 param(代替"..."传递)与表示"零个或更多字母数字字符"的 POSIX 正则表达式 '^\[:alnum:]*$' 相匹配,则 index.php 中 php 的以下片段会将其输出到屏幕中。

<?php

pattern = '\^\[\[:alnum:\]\]\*';

string = _GET'param';

if (ereg(pattern, string)) { echo($string); }

?>

虽然Example 1 可在使用字母数字输入的情况下正常运行,但由于使用不安全的 ereg() 函数来验证受破坏的输入,因此可能会通过注入 null 字节发动 Cross-Site Scripting (XSS) 攻击。如果为 param 传递一个值,而该值包含一个有效的字母数字字符串,并后跟 null 字节和 <script> 标签(例如 "Hello123%00<script>alert("XSS")</script>"),则 ereg(pattern, string) 仍会返回 true,因为 ereg() 函数在读取输入字符串(从左至右)时会忽略 null 字节字符后面的所有内容。在此示例中,这意味着 null 字节之后注入的 <script> 标签将显示给用户并进行求值。

Recommendations

永不应该使用那些无法安全使用的函数。

如果这些函数中的任何一个出现在新的或是继承代码中,则必须删除该函数并用相应的安全函数进行取代。

split() 函数及其相关的 POSIX 正则表达式函数自 PHP 5.3.0 起已被弃用,并被更加安全的 Perl 兼容正则表达式 (PCRE) 函数代替。 对于"说明"部分中介绍的Example 1,更加安全的解决方案是使用较新的 PCRE 函数 preg_match() 以及 PCRE 格式正则表达式,而不是使用较旧的 POSIX 函数 ereg()。

PHP 文档提供了从较旧的 POSIX 正则表达式函数到较新且更安全的 PCRE 正则表达式函数的相应映射,其网址为 http://php.net/manual/en/reference.pcre.pattern.posix.php。POSIX 函数 sql_regcase() 是一个例外,因为它没有对等的 PCRE 函数,因此应完全避免。

相关推荐
龙亘川1 天前
一网统管AI平台民生业务实践:基于城市数字底座赋能公积金业务服务升级
大数据·安全·智慧城市·开源软件·数据可视化·政务
kybs19911 天前
全球灾害数据分析可视化 毕业设计-附源码66794
vue.js·spring boot·mysql·安全·django·c#·asp.net
LorryJovens1 天前
【LAAP科研】双系统具身AGI范式研究——基于LAAP认知架构与Jev概率决策模型的系统性技术调研与范式验证
人工智能·gpt·安全·架构
其实防守也摸鱼1 天前
内网穿透与反向代理:原理、工具与实战指南
android·大数据·运维·安全·网络安全·自动化·渗透
山东科恩光电1 天前
提升安全性的关键技术:安全触边在工业自动化中的应用解析
安全
LONGZETECH1 天前
一线职教实测:风光 580 汽车故障诊断仿真系统,破解实车实训四大核心痛点
人工智能·学习·安全·架构·汽车
Mikko71 天前
jackson-databind 升到 2.21.6 就安全了吗?jackson-core 是另一个坐标,它那条 high 全局库至今没收
java·后端·安全·json
赛博守夜人1 天前
反舞弊系列之十四:商业地产与零售招商中的“转租差价与免租期寻租”
安全
xiaoqiMikko1 天前
你升的是 jackson-databind,中招的是 jackson-core:一个超长 JSON key 就能吃掉 200MB 堆
java·安全