1. fopen /file_get_contents 每次请求都会重新做DNS查询,并不对DNS信息进行缓存。但是CURL会自动对DNS信息进行缓存。对同一域名下的网页或者图片的请求只需要一次DNS查询。这大大减少了DNS查询的次数。所以CURL的性能比fopen /file_get_contents 好很多。
2. fopen /file_get_contents在请求HTTP时,使用的是http_fopen_wrapper,不会keeplive。而curl却可以。这样在多次请求多个链接时,curl效率会好一些。
3. fopen / file_get_contents函数会受到php.ini文件中allow_url_open选项配置的影响。如果该配置关闭了,则该函数也就失效了。而curl不受该配置的影响。
4. curl可以模拟多种请求,例如:POST数据,表单提交等,用户可以按照自己的需求来定制请求。而fopen / file_get_contents只能使用get方式获取数据。file_get_contents 获取远程文件时会把结果都存在一个字符串中 fiels函数则会储存成数组形式
因此,我还是比较倾向于使用curl来访问远程url。Php有curl模块扩展,功能很是强大。没事可以研究一下。
用到采集的时候还是比较喜欢用PHP的采集类 Snoopy
背景介绍:目前的论坛是直接使用Discuz!搭建的,版本比较古老,一直没人动过,从我接收就一直感觉是个烫手的山药,不是说处理不了(凭我浸淫php多年的经验,想来这点毛毛论坛还是可以拿下的,只是前人改过不少代码,注释也没有,于是一直懒得动),但是最近产品部说要整改论坛了,只好捡起来从头开始研究,记录下点滴。
本文先说下跟人人网连接,直接使用connect那套系统就行了,简单的很。
1,引入一个JS,比如命名为connect.js
function addScript(src) {
var scriptElement = document.createElement("script");
scriptElement.type = "text/javascript";
scriptElement.src = src;
document.getElementsByTagName("HEAD")[0].appendChild(scriptElement);
}
function connectDyload() {
addScript("http://static.connect.renren.com/js/v2.0/FeatureLoader.jsp?loaded=connectInit");
}
function connectInit() {
XN_RequireFeatures(["Base"], function(){
XN.Main.init("efc590d209f847c1ae0d830dcb99c972", "/xd_receiver.html", {"doNotUseCachedConnectState":true});
XN.Connect.c(function() {
document.location = "http://www.rrgbbs.com/toGamebbs.do?tid=&redirectUrl="+window.location.href;
});
});
}
其中,connect成功后的跳转地址,自己写了个java类,toGamebbs,这个类用来调用Discuz!的一系列验证方式,比如判断用户是不是登录过了cdb_session表,然后新用户的话,自动在后台帮助用户完成注册功能。
2.把模版中的header.html的登录块注释掉,换成connect的代码
<!--<a href="logging.php?action=login" onclick="showWindow('login', this.href);return false;">{lang activation}</a>-->
<a href="#" onclick="connectDyload();return false;">登录<img src="http://a.xnimg.cn/connect/img/login_buttons/renren/connect_light_small.png" style="vertical-align: middle;" /></a>
<a href="logging.php?action=logout&formhash={FORMHASH}">{lang logout}</a>
<pre>
3.修改全局变量template/default/templates.lang.php,把home_welcome_guest修改为上面类似的登录模块
<pre lang="php">
<p>人人网用户请直接点击<a href="#" onclick="connectDyload();return false;" class="lightlink">登录</a>,以浏览更多精彩内容,并随时发布观点,与大家交流。</p>
4.需要在本地放一个跨域文件xd_receiver.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<script src="http://static.connect.renren.com/js/v1.0/XdCommReceiver.jsp" type="text/javascript"></script>
</body>
</html>
更多renren connect的原理,可以参考官方网站 http://wiki.dev.renren.com/wiki/%E4%BA%BA%E4%BA%BAConnect
最近为了安全考虑,出了套验证机制。passport处理未登录用户的过程大致为:
1.用户访问应用服务器A
2.如果用户未登录A,自动重定向到passport服务器
3.passport验证登录成功后,返回验证票
4.应用服务器A使用验证票到passport服务器进行二次验证
5.passport二次验证成功后,返回用户名
根据上述处理过程,passport的使用方法为:
1.passport的请求地址为:passport.no.xxxx.com;
2.应用服务器请求passport页面时,需提供forward跳转参数;
3.passport接收请求,验证正确的情况下,返回验证票(ticket参数);
4.应用服务器二次验证的过程为:
1)构造HTTP REFERER请求头;
2)携带HTTP REFERER请求头,远程读取passport.no.xxxx.com/verify.php?t=$ticket(该$ticket为 passport返回的ticket)地址的内容;
3)如果passport验证成功,返回用户名,否则返回空串。
passport的使用示例如下(以MM系统为例http://mm.renren.com/index.php):
1.MM请求访问passport的地址:https://passport.no.xxxx.com/login.php?forward=http://mm.renren.com/index.php
2.passport验证成功后,将地址重定向到http://mm.renren.com/index.php/index.php?ticket=nscr3omh80rn367h5pu0dq76u0
3.MM系统处理passport验证票($ticket参数)的过程为:
function auth_check_valid($ticket){
if($ticket == "")
return false;
$opts=array(
'http'=>array(
'header'=>"Referer :".$_SERVER['REQUEST_URI']
)
);
$context = stream_context_create($opts);//构造HTTP REFERER头
$url = "https://passport.no.xxxx.com/verify.php?t=".$ticket;
$user_id = file_get_contents($url,false,$context);//二次验证,远程请求用户名
return $user_id;//返回登录用户名,需进行后续判断是否为空串
}
在接下来的文章中,我们会进一步讲解如果使用程序模拟登录验证系统,该怎么处理。
帮朋友搭建 一个shopex的开源网站,对方平台是debian的虚拟机,跟ubuntu类似,一开始直接使用目前最流行的模式php运行在fast-cgi模式下,前面挡上nginx,配置的过程百般折磨,详细的可以参照CentOS的配置,除了麻烦,总体上还算可以,最后也跑起来了,就是会有点小改动。以后再补充。
继续shopex的事情,结果很杯具的发现shopex果然比较惨,基本上在fast-cgi下没发运行,在初始化数据库的时候会很嚣张的报错,最后不得已还得装回apache。
用最原始的而且是简单有力的安装方式:
1.安装。
#apt-get install apache2 mysql-server mysql-client php5 php5-gd php5-mysql
apt-get install apache2 mysql-server mysql-client php5 libapache2-mod-php5 php5-gd php5-cli php5-mysql
2.配置
2.1配置PHP
vi /etc/php5/apache2/php.ini
找到 ;default_charset = "iso-8859-1"
把它改成 default_charset="gb2312",或者"utf-8"
2.2配置apache
2.2.1 #vi /etc/apache2/mods-enabled/php5.conf
去掉#AddType application/x-httpd-php .php 前的"#"号(最新安装的版本默认已去掉)
2.2.2 #vi /etc/apache2/mods-available/dir.conf
在DirectoryIndex中加入index.php
2.2.3 #vi /etc/apache2/conf.d/charset
改成AddDefaultCharset gb2312 ##UTF-8
3.重启
#/etc/init.d/apache2 restart
4.测试
4.1在/var/www/目录下新建show.php文件,在其中输入<?PHP phpinfo();?>
4.2在浏览器地址栏输入http://127.0.0.1/show.php,如果可以看到PHP的信息,则说明安装配置成功。
5.修改Mysql 的密码,用下面的命令:
mysqladmin -u root password 'your-password' ,使用apt-get install方式一安装会有安装界面提示输入root的密码
6.测试Mysql
mysql -u root -p
输入刚才的密码,如果可以看到mysql提示符,就说明Mysql也弄好了。
进一步需要安装ZendOptimizer,直接下载最新的tar包 ZendOptimizer-3.3.0a-linux-glibc21-i386.tar.gz
tar xvfz ZendOptimizer-3.3.0a-linux-glibc21-i386.tar.gz
cd ZendOptimizer-3.3.0a-linux-glibc21-i386
sh install.sh ##按照提示输入php.ini的具体路径,一般是 /etc/php5/apache2/php.ini,apache的运行目录即可 /usr/sbin/apache2
写代码时间久了,总是感觉接触面越来越窄,到现在估计只剩下Java还能写点东西了,PHP算作业余时间搞的,好在是弱语言类型的,每次都是现学现卖。一口气写下来,在本地debug也快,出现错误就地改正就是了,尝试过用框架,结果都是半途而废了,估计水平也就这样子了,自己搞点小玩意儿还是可以的,帮朋友做几个个人网站也行。
近半年来,总算是有点目标,学习还是马马虎虎的,最近公司的事情好多啊,只能见缝插针的学习点,感觉提高的也不快,任何事情总得动手才行。
淘宝客的一堆东西基本上快研究透彻了,想到了几个点子,准备抽时间给实现了。
剩下的学习任务很很重,搞下PHPRPC,丢掉的C++想尽可能的给捡回来,搞好英语。
memcache需要libevent进行网络的通讯才能正常工作,所以安装memcache之前需要首先安装libevent. libevent可以从这儿下载,memcache需要从google code下载。
现在万事具备,开始安装的基本过程,如下所示:
#yum install gcc //确认gcc已经安装,可以gcc -v确认
#wget http://monkey.org/~provos/libevent-1.4.5-stable.tar.gz //下载最新的稳定版本
#tar xvzf libevent-1.4.4-stable.tar.gz //解压缩
#cd libevent-1.4.4-stable
#./configure -prefix=/usr/local/libevent //开始编译
#make
#make install
接着安装memcache.
#cd /home/mysoft/
#tar -zxvf memcached-1.4.5.tar.gz
#cd memcached-1.5.0
#./configure --prefix=/usr/local/memcached --with-libevent=/usr/
#make #make install
#ls -al /usr/local/memcached/bin //验证安装
如果没有问题,现在就可以正常启动memcached了,命令如下:
/usr/local/memcached/bin/memcached -d -m 100 -u root -l 192.168.1.101 -p 11211 -c 256 -P /tmp/memcached.pid
-d选项是启动一个守护进程,
-m是分配给Memcache使用的内存数量,单位是MB,我这里是100MB,
-u是运行Memcache的用户,我这里是root,
-l是监听的服务器IP地址,如果有多个地址的话,我这里指定了服务器的IP地址192.168.1.100,
-p是设置Memcache监听的端口,我这里设置了11211,最好是1024以上的端口,我们这里统一使用11211-c选项是最大运行的并发连接数,默认是1024,我这里设置了256,按照自己服务器的负载量来设定。
-P是设置保存Memcache的pid文件,我这里是保存在/tmp/memcached.pid
常见的启动失败信息有:
AA.启动时找不到libevent库
memcached: error while loading shared libraries: libevent-1.4.so.2: cannot open shared object file: No such file or directory
解决办法1:将libevent库所在路径加入LIBRARY_PATH,在/etc/profile中加入
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/libevent/lib
解决办法2:
ln -s /libevent安装路径/libevent/lib/libevent-1.3b.so.1 /usr/lib/libevent-1.3c.so.1
详细的处理过程如下:
>locate libevent-1.4.so.2
libevent-1.4.so: /usr/local/lib/libevent-1.4.so.2
> ldd /usr/local/bin/memcached
linux-gate.so.1 => (0xb7fa4000)
libevent-1.4.so.2 => not found
libpthread.so.0 => /lib/libpthread.so.0 (0x0086e000)
libc.so.6 => /lib/libc.so.6 (0x006f7000)
/lib/ld-linux.so.2 (0x006d9000)
> LD_DEBUG=libs ./memcached -v
找到默认路径 /usr/lib/
>ln -s /usr/local/lib/libevent-1.4.so.2 /usr/lib/libevent-1.4.so.2
>ldd /usr/local/bin/memcached
linux-gate.so.1 => (0xb7ffd000)
libevent-1.4.so.2 => /usr/lib/libevent-1.4.so.2 (0xb7fdc000)
libpthread.so.0 => /lib/libpthread.so.0 (0x0086e000)
libc.so.6 => /lib/libc.so.6 (0x006f7000)
libnsl.so.1 => /lib/libnsl.so.1 (0x009f8000)
librt.so.1 => /lib/librt.so.1 (0×00887000)
libresolv.so.2 => /lib/libresolv.so.2 (0x00b29000)
/lib/ld-linux.so.2 (0x006d9000)
收工
AB.第二个可能的问题是编译memcache期间出现的,解决方案可以参考这儿
或者 在./configure 时加入参数–build=i686-pc-linux-gnu
AC.如果客户端连接不上,可能是服务器防火墙的原因,选择关闭或者增加相应的iptables文件如下:
#永久性生效,重启后不会复原
开启: chkconfig iptables on
关闭: chkconfig iptables off
#即时生效,重启后复原
开启: service iptables start
关闭: service iptables stop
#修改/etc/sysconfig/iptables文件,
添加-A RH-Firewall-1-INPUT -m state –state NEW -m tcp -p tcp –dport 11211 -j ACCEPT
使用的方式可以有很多种,常见的语言api通过官方网站都能找到,比如php的参考这儿,需要memcached插件
Java的可以选择这个spymemcached或者java memcached,其他语言的可以从这个列表中查找。
作者:Ph4nt0m Security Team
来源:http://www.ph4nt0m.org-a.googlepages.com/PSTZine_0x03_0x06.txt
==Ph4nt0m Security Team==
Issue 0x03, Phile #0x06 of 0x07
|=---------------------------------------------------------------------------=|
|=---------------------=[ 高级PHP应用程序漏洞审核技术 ]=---------------------=|
|=---------------------------------------------------------------------------=|
|=---------------------------------------------------------------------------=|
|=----------------------=[ By www.80vul.com ]=------------------------=|
|=------------------------=[ <www.80vul.com> ]=--------------------------=|
|=---------------------------------------------------------------------------=|
[目录]
1. 前言
2. 传统的代码审计技术
3. PHP版本与应用代码审计
4. 其他的因素与应用代码审计
5. 扩展我们的字典
5.1 变量本身的key
5.2 变量覆盖
5.2.1 遍历初始化变量
5.2.2 parse_str()变量覆盖漏洞
5.2.3 import_request_variables()变量覆盖漏洞
5.2.4 PHP5 Globals
5.3 magic_quotes_gpc与代码安全
5.3.1 什么是magic_quotes_gpc
5.3.2 哪些地方没有魔术引号的保护
5.3.3 变量的编码与解码
5.3.4 二次攻击
5.3.5 魔术引号带来的新的安全问题
5.3.6 变量key与魔术引号
5.4 代码注射
5.4.1 PHP中可能导致代码注射的函数
5.4.2 变量函数与双引号
5.5 PHP自身函数漏洞及缺陷
5.5.1 PHP函数的溢出漏洞
5.5.2 PHP函数的其他漏洞
5.5.3 session_destroy()删除文件漏洞
5.5.4 随机函数
5.6 特殊字符
5.6.1 截断
5.6.1.1 include截断
5.6.1.2 数据截断
5.6.1.3 文件操作里的特殊字符
6. 怎么进一步寻找新的字典
7. DEMO
8. 后话
9. 附录
一、前言
PHP是一种被广泛使用的脚本语言,尤其适合于web开发。具有跨平台,容易学习,功能强
大等特点,据统计全世界有超过34%的网站有php的应用,包括Yahoo、sina、163、sohu等大型
门户网站。而且很多具名的web应用系统(包括bbs,blog,wiki,cms等等)都是使用php开发的,
Discuz、phpwind、phpbb、vbb、wordpress、boblog等等。随着web安全的热点升级,php应
用程序的代码安全问题也逐步兴盛起来,越来越多的安全人员投入到这个领域,越来越多的应
用程序代码漏洞被披露。针对这样一个状况,很多应用程序的官方都成立了安全部门,或者雇
佣安全人员进行代码审计,因此出现了很多自动化商业化的代码审计工具。也就是这样的形
势导致了一个局面:大公司的产品安全系数大大的提高,那些很明显的漏洞基本灭绝了,那些
大家都知道的审计技术都无用武之地了。我们面对很多工具以及大牛扫描过n遍的代码,有很
多的安全人员有点悲观,而有的官方安全人员也非常的放心自己的代码,但是不要忘记了“没
有绝对的安全”,我们应该去寻找新的途径挖掘新的漏洞。本文就给介绍了一些非传统的技术
经验和大家分享。
另外在这里特别说明一下本文里面很多漏洞都是来源于网络上牛人和朋友们的分享,在
这里需要感谢他们,:)
二、传统的代码审计技术
阅读全文...
这个星期,是自从过年之后最“轻松”的一个星期了,终于不用天天忙碌着加班,回到家倒头就想睡觉,连整点吃的想法都没有这一切都变成了过去式,终于开始有点系统的时间审视以前做的所有工作,看点自己喜欢的数据,顺便吸吮一下互联网风云变幻背后的些许感冒的新知识。web2.0和ajax是今年最火薄的关键字之一了吧,javascript使用熟练的人陡然之间身价倍增,可惜我技术不精,小打小闹还凑合,高深的还是有难度,哈哈。
越来越发现apache底下的一堆的开源项目的好使,现在的项目公用lib包有接近一半是apache下面的,log4j(log4php也很好用,用在php项目中节省了不少的时间),httpclient,ant,lucene,tomcat,maven,xml,iBATIS,Jakarta等等,真是方便了不少,想想其实这些东西还是很蛮好玩的,要是没有这么多的开源的东西,自己写程序的时候一一去实现这些个基本的方法,那该多痛苦啊,去年的时候还信誓旦旦的读项目的源代码呢,结果看了几个(Httpclient,struts,lucene)就不了了之了,唉,关键是没时间,其实研究一下的话,估计写个作弊程序应该还是模拟的很好的,哈哈。
余华的《兄弟》的下终于在新浪上有连载了,今天一口气看完,不过瘾,要是有完整版的就好了,呵呵。
中午还是风和日丽呢,晚上从公司出来就感觉风呼呼的吹得人很不爽,北京今年的破天气好像很多啊,没有几天完整的风平浪静。
好多的VC涌入中国啊,要是自己拉几个人打造出一个东西来,然后想法子搞他一笔风投来那该多爽啊,不过要想出一个好点子似乎不是件容易的事情,恩。有时间爱你继续关注一下搜索引擎和几个做的比较好的开源项目(Java的&PHP的,目前自己最拿手的两个语言了)。