目录
引言
在 Web 应用开发的广袤天地里,开发语言宛如构建大厦的基石,其安全性直接关乎整个应用的安危。吴翰清在《白帽子讲 Web 安全》中对开发语言安全的剖析,犹如一盏明灯,照亮了我们探索语言安全风险与防护的道路。接下来,让我们一同深入解读这一关键章节。
1.PHP 安全
1.1变量覆盖
在早期的 PHP 开发环境中,若配置文件中register_globals设置为On,这就如同敞开了一扇危险的大门。此时,外部的 POST 或 GET 请求参数能够直接注册为全局变量,完全处于外部可控状态。
例如,假设在一个用户权限验证的 PHP 脚本中,存在一个未初始化的关键变量$admin,正常情况下它应该在特定逻辑中被赋值为true或false来判断用户是否为管理员。但由于register_globals = On,攻击者可以通过构造一个恶意的 GET 请求,如Example Domain,直接篡改$admin变量的值,从而实现非预期的执行逻辑,甚至可能导致越权访问,获取管理员权限。从安全角度出发,现代 PHP 开发早已摒弃了这种危险的配置方式,建议始终将register_globals设置为Off。
1.2空字节问题
PHP 在执行文件操作时,会调用底层的 C 语言库。C 语言的字符串以空字节(\0)作为结束标志,然而 PHP 的字符串结构与之不同。当 PHP 字符串中出现空字节时,就会引发严重问题。
例如,假设存在一个文件上传功能,代码意图将用户上传的文件保存到uploads/目录下,文件名由用户输入并拼接在路径后。如果攻击者在文件名中插入空字节,如test.php\0.jpg,PHP 底层调用 C 语言库进行文件操作时,获取的字符串会在空字节处截断。原本应该保存uploads/test.php\0.jpg的文件,实际可能被保存为uploads/test.php,这就导致攻击者可以绕过文件类型检查,上传恶意的 PHP 文件,进而获取服务器权限。值得庆幸的是,PHP 5.3 版本修复了这一漏洞,极大地提升了文件操作的安全性。
1.3弱类型
PHP 的一大特点是定义变量时无需显式指定类型,变量的值可以在运行过程中自由改变类型。在进行变量相等判断时,PHP 提供了严格比较(===)和松散比较(==)两种方式。松散比较在某些情况下会产生意想不到的结果。例如:
$a = "1";
$b = 1;
var_dump($a == $b); // true
var_dump($a === $b); // false
在这个例子中,$a是字符串类型,$b是整型,但在松散比较时,PHP 会自动进行类型转换,导致两者被判断为相等。在安全敏感的场景中,如密码验证,若使用松散比较,可能会让攻击者有机可乘。因此,为了确保代码的安全性,在 PHP 开发中应尽量明确变量类型,并优先使用严格比较。
1.4反序列化
在 PHP 开发中,对象序列化存储是一种常见的操作,它将对象转换为可存储或传输的格式。然而,如果对不可信数据进行反序列化,就如同打开了一个潘多拉魔盒。攻击者可以精心构造恶意对象,利用对象的魔术方法在特定时机自动调用的特性,执行任意命令。例如,假设存在一个包含用户信息的类User,其中定义了一个__destruct魔术方法用于清理资源:
class User {
public $name;
publ

最低0.47元/天 解锁文章
1460

被折叠的 条评论
为什么被折叠?



