这两天网上开始疯传一个“nginx文件类型错误解析漏洞”,这个“漏洞”是这样的:

假设有如下的 URL:http://phpvim.net/foo.jpg,当访问 http://phpvim.net/foo.jpg/a.php 时,foo.jpg 将会被执行,如果 foo.jpg 是一个普通文件,那么 foo.jpg 的内容会被直接显示出来,但是如果把一段 php 代码保存为 foo.jpg,那么问题就来了,这段代码就会被直接执行。这对一个 Web 应用来说,所造成的后果无疑是毁灭性的。

关于这个问题,已有高手 laruence 做过详细的分析,这里再多啰嗦几句。

首先不管你是否有用到正则来解析 PATH_INFO,这个漏洞都是存在的。比如下面这个最基本的 nginx 配置:

1
2
3
4
5
6
location ~ \.php$ {fastcgi_pass  127.0.0.1:9000;fastcgi_index index.php;include       fastcgi_params;fastcgi_param SCRIPT_FILENAME   $document_root$fastcgi_script_name;
}

漏洞同样会出现,如 laruence 所说,实际上这个漏洞和 nginx 真的没什么关系,nginx 只是个 Proxy,它只负责根据用户的配置文件,通过 fastcgi_param 指令将参数忠实地传递给 FastCGI Server,问题在于 FastCGI Server 如何处理 nginx 提供的参数?

比如访问下面这个 URL:

1
[text] view plaincopy
  1. <span style="font-size: 14px;">http://phpvim.net/foo.jpg/a.php/b.php/c.php</span>

那么根据上面给出的配置,nginx 传递给 FastCGI 的 SCRIPT_FILENAME 的值为:

1
[text] view plaincopy
  1. <span style="font-size: 14px;">/home/verdana/public_html/unsafe/foo.jpg/a.php/b.php/c.php</span>

也就是 $_SERVER['ORIG_SCRIPT_FILENAME']。

当 php.ini 中 cgi.fix_pathinfo = 1 时,PHP CGI 以 / 为分隔符号从后向前依次检查如下路径:

1
2
3
4
[text] view plaincopy
  1. <span style="font-size: 14px;">/home/verdana/public_html/unsafe/foo.jpg/a.php/b.php/c.php
  2. /home/verdana/public_html/unsafe/foo.jpg/a.php/b.php
  3. /home/verdana/public_html/unsafe/foo.jpg/a.php
  4. /home/verdana/public_html/unsafe/foo.jpg</span>

直到找个某个存在的文件,如果这个文件是个非法的文件,so… 悲剧了~

PHP 会把这个文件当成 cgi 脚本执行,并赋值路径给 CGI 环境变量——SCRIPT_FILENAME,也就是 $_SERVER['SCRIPT_FILENAME'] 的值了。

在很多使用 php-fpm (<0.6) 的主机中也会出现这个问题,但新的 php-fpm 的已经关闭了 cgi.fix_pathinfo,如果你查看 phpinfo() 页面会发现这个选项已经不存在了,代码 ini_get(“cgi.fix_pathinfo”) 的返回值也是 “false”。

原因是似乎因为 APC 的一个 bug,当 cgi.fix_pathinfo 开启时,PATH_TRANSLATED 有可能是 NULL,从而引起内存异常,造成 php-fpm crash,所以 php-fpm 关闭这个选项。

Comments Off
May 22nd, 2010 | Filed under PHP
Tags: FastCGI, Nginx, PHP

前几天把工作平台从 Ubuntu 9.10 Karmic 更新到了 10.04 Lucid,由于 Lucid 官方源自带了 PHP5.3.2,以前使用的 dotdeb 的源就没法用了,一直很喜欢这个源的,不但提供了 PHP5.3 而且还有 php5-fpm 这个很实用的 fcgi 进程管理器,这个在官方源里面是没有的。强行上了 dotdeb 虽然也可以,不过必然有很多包会出现依赖问题,处理这些依赖关系是件很烦心的事情。哥啥都不怕,就怕麻烦~ 

对于 PHP 来说,php-fpm 还是最合适的,spawn-fcgi 这类东西就不用考虑了,我宁愿用 PHP5 内置的 FastCGI Server。
Read more…

Comments Off
Apr 30th, 2010 | Filed under PHP
Tags: Linux, PHP, Shell, Ubuntu

在 cygwin 中编译 PHP 时遇到下面的问题:

1
2
3
checking for lemon... no
configure: warning: lemon versions supported for regeneration of \libsqlite parsers: 1.0 (found: none).

解决方法:

1
2
3
wget http://www.sqlite.org/cvstrac/getfile/sqlite/tool/lemon.c
gcc -o lemon lemon.c
mv lemon /usr/local/bin

重新运行 ./configure 后,问题解决。

Comments Off
Oct 31st, 2009 | Filed under PHP
Tags: Cygwin, PHP

XP 和早期的 Windows 中,你可以通过系统新增或者修改某些类型的文件图标,但是自 Vista 以后,这个功能就被 "Default Programs" 替代了,要修改图标只能依赖一些第三方软件。如果不想使用第三方软件,则可以通过修改注册表来手动更改文件的图标,以下以 PHP 文件为例:

Read more…

1 comment
May 15th, 2009 | Filed under PHP
Tags: PHP, Windows
1
2
3
4
5
6
7
location / {root   d:/public_html;index  index.php index.html index.htm;if (!-e $request_filename) {rewrite ^/(.*)$ /myproject/public/index.php last;}
}

按照配置文件,我的项目地址是:http://localhost/myproject/public,项目是部署在子目录 /myproject/public 里面的,如果你把 document_root 直接设置为 /myproject/public,使用 http://localhost 来访问,那么上述配置删除掉 index.php 前面的目录部分,也就是 rewrite ^/(.*)$ index.php last;

Nginx 不支持 Apache 的 .htaccess 文件,所以需要在 Nginx 配置文件中编写重写规则。Apache 的绝大部分 RewriteRule 命令都可以不做修改的放到 Nginx 中直接使用。你只要把 RewriteRule 改成 rewrite,[L] 改成 last 之类的就可以了,具体可以看一下 Nginx 的 Rewrite 文档。

http://wiki.nginx.org/NginxHttpRewriteModule

题外话,Zend Framework 越来越强大,越来越复杂了,很多追求“简洁”的 Coder 们都已经开始信誓旦旦的说要放弃 ZF 。有点搞笑,这就好像我在说:飞机太快了,价钱太贵了,不适合我,还是自行车好啊!有些人对待问题的看法极端又片面,就好像看电视剧的时候,也总是要把人分为好人和坏人一样,他们的想法很单纯——我不喜欢 ZF,因为臃肿、复杂,所以它是垃圾。

1 comment
May 11th, 2009 | Filed under PHP
Tags: Nginx, PHP, Zend

Nginx 是一个轻量级的高性能 Http WebServer,以事件驱动方式编写,因此相比 Apache 而言,Nginx 更加稳定、性能更好,而且配置简单,资源占用较低。以下是我在 Windows 7 安装中 Nginx 和 PHP5.3 的步骤。

安装 PHP5

首先,从 http://windows.php.net/download/ 下载最新的 PHP 5.3 Windows 版本,这里 PHP 以 FastCGI 模式运行,所以请下载 None Thead Safe 版本。

解压至 C:\php5,把压缩包中的 php.ini-recommended,更名为 php.ini,然后打开修改几个选项:

1
2
3
4
5
6
7
8
9
10
11
error_reporting = E_ALL
display_errors = On
extension_dir = "C:\php5\ext"; 动态扩展,可以根据需要去掉 extension 前面的注释 ; 
; 如加载 PDO, MySQL
extension=php_pdo.dll
extension=php_pdo_mysql.dll; CGI 设置
cgi.fix_pathinfo = 1

Read more…

14 comments
May 10th, 2009 | Filed under PHP
Tags: Nginx, PHP, Windows

在 Akra’s DevNotes 看到的这篇文章,刚好最近两篇文章都是将乱码的,于是也搬过来了。

问题:

存储多字节字符到 MySQL,或者从 MySQL 中读取类似的数据,出现乱码。

解决方法:

在任何地方都使用 UTF-8 编码。

> 浏览器

1
[php] view plaincopy
  1. <span style="font-size: 14px;"><span style="color: #339933; padding: 0px; margin: 0px;"><</span> ?php <span style="color: #990000; padding: 0px; margin: 0px;">header</span><span style="color: #009900; padding: 0px; margin: 0px;">(</span><span style="color: #0000ff; padding: 0px; margin: 0px;">"Content-type: text/html; charset=utf-8"</span><span style="color: #009900; padding: 0px; margin: 0px;">)</span><span style="color: #339933; padding: 0px; margin: 0px;">;</span> <span style="color: #000000; font-weight: bold; padding: 0px; margin: 0px;">?></span></span>

或者使用一个 meta 标签来设置HTTP协议的响应头报文:

1
<meta http-equiv="content-type" content="text/html; charset=utf-8" />

这行 HTML 代码会通知客户端浏览器,文件类型为 html,且使用了 utf-8 编码。
header()函数所发送的 HTTP,从优先级上面看,由于先一步被浏览器所接受,所以优先级更高(不知道可不可以这么说)。
Read more…

2 comments
Mar 22nd, 2009 | Filed under PHP
Tags: Apache, MySQL, PHP, Unicode, Zend

基本思路就是向数据库发送 SQL “SET NAMES UTF8″,可根据不同的情况来编写代码。

如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[php] view plaincopy
  1. <span style="font-size: 14px;"><span style="color: #339933; padding: 0px; margin: 0px;"><</span> ?php
  2. <span style="color: #000088; padding: 0px; margin: 0px;">$params</span> <span style="color: #339933; padding: 0px; margin: 0px;">=</span> <span style="color: #990000; padding: 0px; margin: 0px;">array</span> <span style="color: #009900; padding: 0px; margin: 0px;">(</span>
  3. <span style="color: #0000ff; padding: 0px; margin: 0px;">'host'</span>     <span style="color: #339933; padding: 0px; margin: 0px;">=></span> <span style="color: #0000ff; padding: 0px; margin: 0px;">'127.0.0.1'</span><span style="color: #339933; padding: 0px; margin: 0px;">,</span>
  4. <span style="color: #0000ff; padding: 0px; margin: 0px;">'username'</span> <span style="color: #339933; padding: 0px; margin: 0px;">=></span> <span style="color: #0000ff; padding: 0px; margin: 0px;">'verdana'</span><span style="color: #339933; padding: 0px; margin: 0px;">,</span>
  5. <span style="color: #0000ff; padding: 0px; margin: 0px;">'password'</span> <span style="color: #339933; padding: 0px; margin: 0px;">=></span> <span style="color: #0000ff; padding: 0px; margin: 0px;">'******'</span><span style="color: #339933; padding: 0px; margin: 0px;">,</span>
  6. <span style="color: #0000ff; padding: 0px; margin: 0px;">'dbname'</span>   <span style="color: #339933; padding: 0px; margin: 0px;">=></span> <span style="color: #0000ff; padding: 0px; margin: 0px;">'phpvim'</span>
  7. <span style="color: #009900; padding: 0px; margin: 0px;">)</span><span style="color: #339933; padding: 0px; margin: 0px;">;</span>
  8. try <span style="color: #009900; padding: 0px; margin: 0px;">{</span>
  9. <span style="color: #000088; padding: 0px; margin: 0px;">$db</span> <span style="color: #339933; padding: 0px; margin: 0px;">=</span> Zend_Db<span style="color: #339933; padding: 0px; margin: 0px;">::</span><span style="color: #004000; padding: 0px; margin: 0px;">factory</span><span style="color: #009900; padding: 0px; margin: 0px;">(</span><span style="color: #0000ff; padding: 0px; margin: 0px;">'PDO_MYSQL'</span><span style="color: #339933; padding: 0px; margin: 0px;">,</span> <span style="color: #000088; padding: 0px; margin: 0px;">$params</span><span style="color: #009900; padding: 0px; margin: 0px;">)</span><span style="color: #339933; padding: 0px; margin: 0px;">;</span>
  10. <span style="color: #000088; padding: 0px; margin: 0px;">$db</span><span style="color: #339933; padding: 0px; margin: 0px;">-></span><span style="color: #004000; padding: 0px; margin: 0px;">query</span><span style="color: #009900; padding: 0px; margin: 0px;">(</span><span style="color: #0000ff; padding: 0px; margin: 0px;">"SET NAMES UTF8"</span><span style="color: #009900; padding: 0px; margin: 0px;">)</span><span style="color: #339933; padding: 0px; margin: 0px;">;</span>
  11. Zend_Db_Table_Abstract<span style="color: #339933; padding: 0px; margin: 0px;">::</span><span style="color: #004000; padding: 0px; margin: 0px;">setDefaultAdapter</span><span style="color: #009900; padding: 0px; margin: 0px;">(</span><span style="color: #000088; padding: 0px; margin: 0px;">$db</span><span style="color: #009900; padding: 0px; margin: 0px;">)</span><span style="color: #339933; padding: 0px; margin: 0px;">;</span>
  12. <span style="color: #009900; padding: 0px; margin: 0px;">}</span> catch <span style="color: #009900; padding: 0px; margin: 0px;">(</span>Exception <span style="color: #000088; padding: 0px; margin: 0px;">$e</span><span style="color: #009900; padding: 0px; margin: 0px;">)</span> <span style="color: #009900; padding: 0px; margin: 0px;">{</span>
  13. <span style="color: #990000; padding: 0px; margin: 0px;">exit</span><span style="color: #009900; padding: 0px; margin: 0px;">(</span><span style="color: #000088; padding: 0px; margin: 0px;">$e</span><span style="color: #339933; padding: 0px; margin: 0px;">-></span><span style="color: #004000; padding: 0px; margin: 0px;">getMessage</span><span style="color: #009900; padding: 0px; margin: 0px;">(</span><span style="color: #009900; padding: 0px; margin: 0px;">)</span><span style="color: #009900; padding: 0px; margin: 0px;">)</span><span style="color: #339933; padding: 0px; margin: 0px;">;</span>
  14. <span style="color: #009900; padding: 0px; margin: 0px;">}</span>
  15. Zend_Registry<span style="color: #339933; padding: 0px; margin: 0px;">::</span><span style="color: #004000; padding: 0px; margin: 0px;">set</span><span style="color: #009900; padding: 0px; margin: 0px;">(</span><span style="color: #0000ff; padding: 0px; margin: 0px;">'dbAdapter'</span><span style="color: #339933; padding: 0px; margin: 0px;">,</span> <span style="color: #000088; padding: 0px; margin: 0px;">$db</span><span style="color: #009900; padding: 0px; margin: 0px;">)</span><span style="color: #339933; padding: 0px; margin: 0px;">;</span>
  16. <span style="color: #666666; font-style: italic; padding: 0px; margin: 0px;">/* vim: set expandtab tabstop=4 shiftwidth=4: */</span>
  17. <span style="color: #000000; font-weight: bold; padding: 0px; margin: 0px;">?></span></span>

这是早期的解决方法,其实并不推荐这么做,因为并不是所有页面都需要 SQL 查询,上述代码放在 bootstrap 中,在不需要 SQL 连接的页面中也会开启一次数据库连接并发送 SET NAMES UTF8 ,这就浪费了资源。
Read more…

Comments Off
Mar 18th, 2009 | Filed under PHP
Tags: PHP, Unicode, Zend

Zend_Filter_Input 可以用来获得安全可靠的用户数据,简单的来说这个类就像一个黑盒,原始数据输入后,经过过滤器过滤,然后再由校验器校验,若通过了原先设定的过滤及校验规则,则最后输出可用的数据,否则给出详细的错误报告。

为了数据安全,比如转义一些特定字符,默认情况下 Zend_Filter_Input 会使用 HtmlEntities Filter 过滤所有的数据,然而不幸的是,这个 HtmlEntities 使用默认编码 ISO-8859-1,如果是中文等多字节语种,那么最后数据就会出现乱码,面目全非。

最近我在自己的项目中就遇到这个问题,其实解决方法很多,多写几行代码而已,但是因为乱码的问题由来已久,而且造成乱码的原因也非常多,找不到问题所在,那就恼火的很了,这里简单总结了一下。
Read more…

Comments Off
Mar 18th, 2009 | Filed under PHP
Tags: PHP, Unicode, Zend

以前在使用 xdebug 的时候,偶有崩溃现象,但并不是太频繁,但是自从换用 Apache2.2 以后,Apache 崩溃的频率大幅增加,换用了不同的 PHP 和 xdebug 的版本都是一样,不停的崩溃,正常的开发根本无法保证。

后来无意中发现是 php5apache2_2.dll 的问题,因为我一直使用 module 模式安装 PHP5,所以不管 PHP5 和 xdebug 换到什么版本,都没有意义,昨天将 php5 换到 CGI 模式后,配合 xdebug 一直使用到现在,Apache2 再也没有崩溃过。

PHP CGI 中 fix_pathinfo 引起的安全隐患相关推荐

  1. Nginx + PHP CGI的fix_pathinfo安全漏洞

    具体的重现过程,用php代码修改后缀名后上传,比如说http://www.xx.com/1.jpg,访问的时候用http://www.xx.com/1.jpg/xxx.php 复制代码 这段jpg代码 ...

  2. 【Vista中系统准备工具存在隐患,自动清除用户资料】

    新闻来源:创景网 Sysprep.exe 是Windows 的"系统准备工具",OEM和企业部署中,安装完所有必须的应用程序和工具之后,可以用它来重新封装运行过的预安装Window ...

  3. iis php5.2 cgi,在PHP 5.2.6 / IIS CGI中清空$_POST数组

    我在Windows XP上使用PHP 5.2.6 w / IIS遇到了一个非常奇怪的问题(尝试过CGI和ISAPI).我正在使用默认的php.ini设置运行全新安装. 首先,假设以下(丑陋但有效)的H ...

  4. HTTP服务器的实现--CGI中POST表单。

    在CGI的定义中,对于POST类型的表单,其内容被送到CGI程序的标准输入(在C语言中是stdin),而被传送的长度被放在环境变量CONTENT_LENGTH中.因而我们要做的就是,在标准输入中读入C ...

  5. cgi mysql数据库_Perl CGI中操作Mysql数据库

    一. 安装DBI模块 步骤1: 从TOOLS栏目中下载DBI.zip,下载完后用winzip解开到一个temp目录,共有三个文件: Readme DBI.ppd DBI.tar.g 一. 安装DBI模 ...

  6. 中安威士:三大安全隐患,不得不防的企业数据问题

    随着数字技术和工作生活的逐渐融合和整合,数据开始呈指数级爆炸,大量复杂的数据信息已成为当代信息发展的重要标志.数据信息的进一步发展使大数据成为促进经济繁荣和改善社会生活的关键引擎. 虽然数据的融合将为 ...

  7. 从客户端游戏漏洞看开发中的安全隐患

    本文转自wooyun知识库0x00 前言 虽然现在的应用开发越来越趋向于web应用,大型软件也大量使用了现有的框架,随着现有框架和引擎的完善,绝大多数安全问题已经被解决.但是遇到一些定制需求时,开发人 ...

  8. HTTP中Get与Post的区别

    Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE.URL全称是资源描述符,我们可以这样认 为:一个URL地址,它用于描述一个网络上的资源,而HTT ...

  9. 浅谈HTTP中Get与Post的区别

    Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE.URL全称是资源描述符,我们可以这样认为:一个URL地址,它用于描述一个网络上的资源,而HTTP ...

最新文章

  1. 第二节课作业150206309
  2. Ethernet/IP 学习笔记五
  3. JavaScript 常用函数
  4. Git 操作简单总结:廖雪峰教程
  5. 绑定方法和非绑定方法
  6. MySQL数据库的权限管理
  7. Graph-Bert:没有我Attention解决不了的
  8. 【单目标优化求解】基于matlab遗传算法求解单目标优化问题【含Matlab源码 1320期】
  9. redis监控工具_企业级别Redis监控,细化到每个项目实例
  10. 小学生python游戏编程5----拼图游戏继
  11. 恒生校招java笔试数据库语法_2015恒生电子校招笔试详解
  12. 2022-07-08 Unity Json2——LitJson
  13. UI进阶——XMPP即时通讯
  14. C#开发工厂ERP生产管理系统源码
  15. 【场景化解决方案】OA付款审批同步到金蝶KIS
  16. 基于stm32f103c8t6的Flash地址空间的数据读取
  17. BZOJ 1189 [HNOI2007]紧急疏散evacuate 二分+最大流
  18. Maven导入依赖时jar包出现unknown
  19. 如何从ADI官网下载PCB库
  20. 各种项目的源代码网站

热门文章

  1. 彻底解决PHP Session不过期以及SessionId保持不变的问题
  2. Word中的字体大小
  3. 谈谈主机和存储连接的多路径技术
  4. PHP学习之八:执行运算符与字符加一
  5. Dev-C++ v5.11
  6. python2基本数据类型
  7. PHP.ini的register_globals参数
  8. 列了一些自己会但是不怎么精通的编程语言和知识,做个记录,空余时间加强学习...
  9. 架构评审方法和思路总结
  10. mysql数据库保存中文乱码解决参考方案