打印

[原创]php程序安全问题

本主题由 cnsst 于 2008-3-2 08:17 提升

[原创]php程序安全问题

本文出自:http://www.ixpub.net/thread-717309-1-1.html

因为最近一直在做php的项目,等到项目完成需要测试它的安全性。
所以最近一直在整理php建的站点都有哪些可以预料到的bug,然后找出可能会有的漏洞加强防范措施。
其实一般的网站被攻陷无非就是输入的字符串未进行严格过滤和上传,跨站漏洞造成的,至于服务安全,我们做程序的要插不上手,所以暂不考虑
对于字符串过滤的问题是老生长谈的了(建议千万不要在js里加验证,刚开始做的时候我就是在js里加验证的,后来别人告诉我浏览器是可以禁止js的,这样做非常不安全。不过我在想,php程序里加层验证,js里面加层验证,这样也不错,安全有加强了些许)


下面是对于一些字符串过滤的一些函数:
复制内容到剪贴板
代码:
ctype_alnum -- Check for alphanumeric character(s)
检测是否是只包含[A-Za-z0-9]

ctype_alpha -- Check for alphabetic character(s)
检测是否是只包含[A-Za-z]

ctype_cntrl -- Check for control character(s)
检查是否是只包含类是“ ”之类的字符控制字符


ctype_digit -- Check for numeric character(s)
检查时候是只包含数字字符的字符串(0-9)

ctype_graph -- Check for any printable character(s) except space
检查是否是只包含有可以打印出来的字符(除了空格)的字符串

ctype_lower -- Check for lowercase character(s)
检查是否所有的字符都是英文字母,并且都是小写的

ctype_print -- Check for printable character(s)
检查是否是只包含有可以打印出来的字符的字符串

ctype_punct -- Check for any printable character which is not whitespace or an alphanumeric character
检查是否是只包含非数字/字符/空格的可打印出来的字符

ctype_space -- Check for whitespace character(s)
检查是否是只包含类是“  ”之类的字符和空格

ctype_upper -- Check for uppercase character(s)
检查是否所有的字符都是英文字母,并且都是大写的

ctype_xdigit -- Check for character(s) representing a hexadecimal digit
检查是否是16进制的字符串,只能包括“0123456789abcdef”
还有那个跨站的问题:
复制内容到剪贴板
代码:
php里面有这个这样的函数:$_SERVER[’PHP_SELF’]
在开发的时候常会用到,一般用来引用当前网页地址,并且它是系统自动生成的全局变量
我们一般用来把数据提交到当前页面的时候会用到它
我试了下这个函数
比如提交到当前页面xiaotian.php,恩没错.
但是你在地址栏那里再在www.test/xiaotian.php后面加上/a=1
按通常的想法是显示404错误页面,可是这里是正常的
你再查看源文件,惊讶的发现原来的$_SERVER[’PHP_SELF’]竟然变成了<form action="/test/xiaotian.php/a=1">
攻击者就会利用这个函数镶入js代码.攻击者能夠获得512~4k的代码空间
对于js的利用,我想不用多说了,比如获取用户的cookie啊,改变当前页面的内容啊,改变表单提交的目的地啊
对于这样一个危险的函数我们有两种办法来防范:
1、htmlentities
用htmlentities($_SERVER[’PHP_SELF’])来替代简单的$_SERVER[’PHP_SELF’],这样即使网址中包含恶意代码,也会被“转换”为用于显示的html代码,而不是被直接嵌入html代码中执行,简单一点说,就是“<”会变成“&lt;”,变成无害的了。

2、REQUEST_URI
用$_SERVER[’REQUEST_URI’]来替代$_SERVER[’PHP_SELF’],在phpinfo()中可以看到这两个变量的区别:

_SERVER[”REQUEST_URI”] /fwolf/temp/test.php/%22%3E%3Cscrīpt%3Ealert(’xss’)%3C/scrīpt%3E%3Cfoo
_SERVER[”PHP_SELF”] /fwolf/temp/test.php/”><scrīpt>alert(’xss’)</scrīpt><foo
$_SERVER[’REQUEST_URI’]会原封不动的反映网址本身,网址中如果有%3C,那么你得到的也将会是%3C,而$_SERVER [’PHP_SELF’]会对网址进行一次urldecode操作,网址中的%3C将会变成字符“<”,所以就产生了漏洞。需要注意的是,在很多情况下,浏览器会对用户输入要提交给web服务器的内容进行encode,然后服务器端程序会自动进行decode,得到相应的原指,在我们进行post或者get操作的时候都是这样。

另外还有两点需要指出,第一是<form action”">这种写法虽然没有直接用到$_SERVER[’PHP_SELF’],但实际效果却是一样的,只是发生的时间错后到了用户提交之后的下一个页面,所以,form的action还是不要留空的好。第二点,除了PHP_SELF之外,其他的$_SERVER变量也许也会有类似的漏洞,比如scrīpt_URI, scrīpt_URL, QUERY_STRING, PATH_INFO, PATH_TRANSLATED等等,在使用他们之前一定要先作htmlentities之类的转换。
其次就是上传的问题:
复制内容到剪贴板
代码:
我们做的是一个交友平台,当然避免不了给广大会员的相片上传功能和博客那里的模板图片的上传功能.我们无非是要验证它的后缀名,大小
切记在验证后缀名的时候避免逻辑错误
可问题在于有网马合成工具啊,把马和图片合成在一起一个.jpg文件然后上传
对于这个问题貌似只有在服务器上安装防火墙然后才能喀嚓掉它么?

我请教到了一个函数:getimagesize
array getimagesize ( string $filename [, array &$imageinfo ] )
getimagesize() 函数将测定任何 GIF,JPG,PNG,SWF,SWC,PSD,TIFF,BMP,IFF,JP2,JPX,JB2,JPC,XBM 或 WBMP 图像文件的大小并返回图像的尺寸以及文件类型和一个可以用于普通 HTML 文件中 IMG 标记中的 height/width 文本字符串。
如果不能访问 filename 指定的图像或者其不是有效的图像,getimagesize() 将返回 FALSE 并产生一条 E_WARNING 级的错误。

用这个函数是因为一般如果是跟木马合成的话就会显示个叉叉,图片是不会正常显示的,所以说刚好可以利用这个函数判断图片的有效性.
再有就是php文件包含的几个函数
复制内容到剪贴板
代码:
比如说include(),require()和fopen(),include_once(),require_once()
这些都可以远程调用的,对于所包含调用的变量没过滤好,就可以任意包含文件从而去执行
我们除了依靠php.ini里的allow_url_fopen设为off禁止远程使用文件和open_base_dir禁止使用目录以外的文件外,
你还得事先声明好只能包含哪些文件
其实网上搜一搜,会发现有很多php的安全策略
其实看来看去无非就这么几种
多加注意就是
我只是总结了几点在我的项目中可能会出现的问题

[ 本帖最后由 小天mm 于 2008-1-4 12:41 编辑 ]
本帖最近评分记录
  • 僵尸道长 X币 +30 原创精品文章,鼓励原创! 2008-1-4 13:55
  • 网络忏悔 X币 +30 感谢您发布的原创,期待您的下篇佳作! 2008-1-4 13:50
msn:xiao.tian@hotmail.com

TOP

顶一个先!

支持!!!支持!!!支持!!!

TOP

还差一点关于程序架构以及php文件目录控制的东西。
服务器的安全虽然不归我们管,但是我们总要给人家留个后路。。。

做安全,不但要保证别人无法突破漏洞,还要尝试在别人已经在利用漏洞的时候拦截。

例如    关于后台管理目录的灵活控制。

TOP

引用:
原帖由 kxlzx 于 2008-1-4 13:50 发表
还差一点关于程序架构以及php文件目录控制的东西。
服务器的安全虽然不归我们管,但是我们总要给人家留个后路。。。

做安全,不但要保证别人无法突破漏洞,还要尝试在别人已经在利用漏洞的时候拦截。

例 ...


恩,我那个项目是没有后台的.所以这篇文章只是针对我的项目来说的啦

至于那个php文件目录控制?

能给我解释一下么?
msn:xiao.tian@hotmail.com

TOP

参考J2EE的项目,分层处理。分层过滤。
如果你写的东西只是基于你自己的项目,或许我说的你都用不上了。。。

TOP

此帖最近被评分记录
评分者: 网络忏悔 时间: 2008-1-4 13:50 奖励:X币 +30理由:感谢您发布的原创,期待您的下篇佳作!
评分者: Bugkidz 时间: 2008-1-4 13:55 奖励:X币 +30理由:原创精品文章,鼓励原创!


注意点。。。不要因为人家名字上加了MM两个字符,就可以随便给钱了。。。
偶们灌水的也很辛苦啊。。。

TOP

本回复帖属于纯原创精品灌水!
申请加精!
申请鼓励原创灌水。。。

TOP

引用:
原帖由 kxlzx 于 2008-1-4 14:07 发表
参考J2EE的项目,分层处理。分层过滤。
如果你写的东西只是基于你自己的项目,或许我说的你都用不上了。。。
如果你详细把这些说出来..考虑下给你加分.

TOP

郁闷。。。我给你投的那个关于大赛的文章里有提到。。。

TOP

大家如果有兴趣...可以看看附件中的东西.

PHP 安全指南和PHP首席程序员的PHP安全指南手册(这个是E文版本)
附件: 您所在的用户组无法下载或查看附件

TOP


感谢一直以来您对我们的支持!
当前时区 GMT+8, 现在时间是 2008-12-2 07:33 京ICP证060528 号

Designed By 17DST