解析php安全性问题中的:Null 字符问题

由于 PHP 的文件系统操作是基于 C 语言的函数的,所以它可能会以您意想不到的方式处理 Null 字符。 Null字符在 C 语言中用于标识字符串结束,一个完整的字符串是从其开头到遇见 Null 字符为止。 以下代码演示了类似的攻击:
Example #1 会被 Null 字符问题攻击的代码


代码如下:

<?php
$file = $_GET['file']; // "../../etc/passwd\0"
if (file_exists('/home/wwwrun/'.$file.'.php')) {
    // file_exists will return true as the file /home/wwwrun/../../etc/passwd exists
    include '/home/wwwrun/'.$file.'.php';
    // the file /etc/passwd will be included
}
?>

因此,任何用于操作文件系统的字符串(译注:特别是程序外部输入的字符串)都必须经过适当的检查。以下是上述例子的改进版本:
Example #2 验证输入的正确做法


代码如下:

<?php
$file = $_GET['file'];
// 对字符串进行白名单检查
switch ($file) {
    case 'main':
    case 'foo':
    case 'bar':
        include '/home/wwwrun/include/'.$file.'.php';
        break;
    default:
        include '/home/wwwrun/include/main.php';
}
?>

一个函数错误就可能暴露系统正在使用的数据库,或者为攻击者提供有关网页、程序或设计方面的有用信息。攻击者往往会顺藤摸瓜地找到开放的数据库端口,以及页面上某些 bug 或弱点等。比如说,攻击者可以一些不正常的数据使程序出错,来探测脚本中认证的顺序(通过错误提示的行号数字)以及脚本中其它位置可能泄露的信息。

一个文件系统或者 PHP 的错误就会暴露 web服务器具有什么权限,以及文件在服务器上的组织结构。开发者自己写的错误代码会加剧此问题,导致泄漏了原本隐藏的信息。

有三个常用的办法处理这些问题。第一个是彻底地检查所有函数,并尝试弥补大多数错误。第二个是对在线系统彻底关闭错误报告。第三个是使用 PHP 自定义的错误处理函数创建自己的错误处理机制。根据不同的安全策略,三种方法可能都适用。

(0)

相关推荐

  • 制作安全性高的PHP网站的几个实用要点

    大家都知道PHP已经是当前最流行的Web应用编程语言了.但是也与其他脚本语言一样,PHP也有几个很危险的安全漏洞.所以在这篇教学文章中,我们将大致看看几个实用的技巧来让你避免一些常见的PHP安全问题. 技巧1:使用合适的错误报告 一般在开发过程中,很多程序员总是忘了制作程序错误报告,这是极大的错误,因为恰当的错误报告不仅仅是最好的调试工具,也是极佳的安全漏洞检测工具,这能让你把应用真正上线前尽可能找出你将会遇到的问题. 当然也有很多方式去启用错误报告.比如在 php.in 配置文件中你可以设置在

  • php下过滤html代码的函数 提高程序安全性

    以下为过滤HTML代码的函数: 复制代码 代码如下: function ihtmlspecialchars($string) { if(is_array($string)) { foreach($string as $key => $val) { $string[$key] = ihtmlspecialchars($val); } } else { $string = preg_replace('/&((#(\d{3,5}|x[a-fA-F0-9]{4})|[a-zA-Z][a-z0-9]{

  • Session的工作机制详解和安全性问题(PHP实例讲解)

    我们先简单的了解一些http的知识,从而理解该协议的无状态特性.然后,学习一些关于cookie的基本操作.最后,我会一步步阐述如何使用一些简单,高效的方法来提高你的php应用程序的安全性以及稳定行. 我想大多数的php初级程序员一定会认为php默认的session机制的安全性似乎是有一定保障的,事实恰好相反 – php团队只是提供了一套便捷的session的解决方案提供给程序员使用,至于安全性的话,应该由程序员来加强,这是应用程序开发团队的责任.因为,这里面的方法很多,可以这么说吧,没有最好,只

  • PHP安全性漫谈

    一.apache server安全性设置 1.以Nobody用户运行 一般情况下,Apache是由Root 来安装和运行的.如果Apache Server进程具有Root用户特权,那么它将给系统的安全构成很大的威胁,应确保Apache Server进程以最可能低的权限用户来运行.通过修改httpd.conf文件中的下列选项,以Nobody用户运行Apache 达到相对安全的目的. User nobody Group# -1 2.ServerRoot目录的权限 为了确保所有的配置是适当的和安全的,

  • PHP中使用addslashes函数转义的安全性原理分析

    本文实例讲述了PHP中使用addslashes函数转义的安全性原理分析.分享给大家供大家参考.具体分析如下: 先来看一下ECshop中addslashes_deep的原型 复制代码 代码如下: function addslashes_deep($value) {     if (empty($value)) {         return $value;  //如为空,直接返回;     } else {         return is_array($value) ? array_map(

  • Apache下禁止特定目录执行PHP 提高服务器安全性

    如果用的是Apache服务器,还可以通过配置来禁止该目录下的PHP文件的访问,有两种方式: 方式一:.htaccess控制,适用于没有服务器管理权限. 在可写文件夹的目录下,建一个.htaccess文件,内容为: 复制代码 代码如下: <Files ~ ".php"> Order allow,deny Deny from all </Files> 方式二:修改Apache配置文件,适用于有服务器管理权限. 配置中增加如下内容: 复制代码 代码如下: <Di

  • PHP session会话的安全性分析

    从而达到方便快捷的目的,但是它在存储信息的时候往往会有一些敏感的东西,这些东西可能成为被攻击的目标,如银行的账号.信用卡事务或档案记录等.这就要求在编写代码的时候必须采取安全措施来减少攻击成功的可能性. 主要的安全措施有以下两个方面. 1.防止攻击者获取用户的会话ID. 获取会话ID的方式很多,攻击者可以通过查看明文通信来获取,所以把会话ID放在URL中或者放在通过未加密连接传输的Cookie中是很危险的:还有在URL中(作为_get()参数)传递会话ID也是不安全的,因为浏览器历史缓存中会存储

  • PHP临时文件的安全性分析

    一.简介 临时文件,顾名思义是临时产生的文件,且文件的生命周期很短. 然而,很多应用的运行都离不开临时文件,临时文件在我们电脑上无处不在,主要有以下几种形式的临时文件: 1.文件或图形编辑程序,所生成的中间文件 2.数据库查询时,生成的临时缓存文件,提供之前的结果数据而,以减少再次访问数据库的代价:通常用于远程数据库或远程xml的服务 3.文件被上传后在服务端的临时储存,其文件名为php的全局变量$_FILES['userfile']['tmp_name']的值 4.在http请求中,用于存放s

  • PHP 编程安全性小结

    规则 1:绝不要信任外部数据或输入 关于 Web 应用程序安全性,必须认识到的第一件事是不应该信任外部数据.外部数据(outside data) 包括不是由程序员在 PHP 代码中直接输入的任何数据.在采取措施确保安全之前,来自任何其他来源(比如 GET 变量.表单 POST.数据库.配置文件.会话变量或 cookie)的任何数据都是不可信任的. 对用户输入进行清理的一个简单方法是,使用正则表达式来处理它. 规则 2:禁用那些使安全性难以实施的 PHP 设置 已经知道了不能信任用户输入,还应该知

  • 浅谈php安全性需要注意的几点事项

    在放假之初,我抽时间看了<白帽子讲web安全>,吴翰清基本上把web安全中所有能够遇到的问题.解决思路归纳总结得很清晰,也是我这一次整体代码安全性的基石. 我希望能分如下几个方面来分享自己的经验 把握整站的结构,避免泄露站点敏感目录 在写代码之初,我也是像很多老源码一样,在根目录下放上index.php.register.php.login.php,用户点击注册页面,就跳转到http://localhost/register.php.并没有太多的结构的思想,像这样的代码结构,最大的问题倒不是安

随机推荐