Thursday, July 30, 2009

自定义Session handler时 session_id() 发送 set-cookie头的处理

自定义的Session Handler,在 session_start 之前,做了如下处理
<?php
static protected function _config()
{
session_name(SS_SESSION_NAME);

session_set_cookie_params(
SS_SESSION_EXPIRATION ? SS_SESSION_EXPIRATION + parent::$buclass->timestamp : 0,
SS_COOKIE_PATH,
SS_COOKIE_DOMAIN,
SS_COOKIE_SECURE,
SS_COOKIE_HTTPONLY
);

global $table_sessions;
self::$_table_sessions = & $table_sessions;

# 如果要通过URL传递Session ID
if (SS_SESSION_PASSSIDVIAURL)
{
$sess_id = parent::$buclass->gpc->get(SS_SESSION_NAME);
}
else
{
$sess_id = parent::$buclass->gpc->cookie(SS_SESSION_NAME);
}

if (!empty($sess_id))
{
if (!preg_match('#^[a-zA-Z0-9]+$#', $sess_id))
{
throw new Exception('不合法的SESSION ID');
}

session_id($sess_id);
}
} ?>


每次刷新页面的时候,都发现http响应中有Set-Cookie的头,设置session name的。翻了翻php手册,http://www.php.net/session_id,参数的地方,有个Note
Note: When using session cookies, specifying an id for session_id() will always send a new cookie when session_start() is called, regardless if the current session id is identical to the one being set. 


于是,每次调用 session_id($sess_id); 这句的时候,都会发送一个set-cookie头。

回到代码,代码的设计是为了考虑到URL传递Session ID的情况,所以分别允许GET方式和COOKIE方式获取session name的值。
而代码里明显可以看到,这里获取 $_GET 和 $_COOKIE的值,并不是直接用这些超级全局变量的,而是通过了一个 gpc的类对象。自己写的一个gpc变量的封装,里边把$_GET, $_POST, $_COOKIE, $_FILES, $_REQUEST的值先加了引用,然后unset了。

结果。。。默认设置情况下,unset了$_COOKIE的值,或者说unlink了$_COOKIE对cookie变量的引用,session机制无法获取 session id,从而代码里会反复地设置session 的cookie变量。

Newborn Project里,gpc的unset变量环节是独立的,也就是
系统初始化->初始化核心类->初始化gpc->初始化session->清理gpc的变量(unset)...
而这里,
系统初始化->初始化核心类->初始化gpc(外加清理gpc的变量(unset))->初始化session...

结果又出问题了。。。

暂时没想出不增加gpc类与其他类耦合度的方法


==================================================================

Update:
最终还是决定跟Newborn Project一样把unset vars的操作单提出来

<?php
static protected function _config()
{
session_name(SS_SESSION_NAME);

session_set_cookie_params(
SS_SESSION_EXPIRATION ? SS_SESSION_EXPIRATION + parent::$buclass->timestamp : 0,
SS_COOKIE_PATH,
SS_COOKIE_DOMAIN,
SS_COOKIE_SECURE,
SS_COOKIE_HTTPONLY
);
global $table_sessions;
self::$_table_sessions = & $table_sessions;

# 如果要通过URL传递Session ID
if (SS_SESSION_PASSSIDVIAURL)
{
$sess_id = parent::$buclass->gpc->get(SS_SESSION_NAME);
if (!empty($sess_id))
{
session_id($sess_id);
}
}
else
{
if (!($sess_id = parent::$buclass->gpc->cookie(SS_SESSION_NAME))==$_COOKIE[SS_SESSION_NAME])
{
session_id($sess_id);
}
}
}



<?php
public function s_init()
{
buComponent::$buclass = & $this;

$this->_init_vars();

$this->filter = buFilter::instance();
$this->cache = buCache::instance();

$this->_init_gpc();
$this->_init_cookie();

if (SS_INTERFACE == SS_INTERFACE_WEB)
{
$this->_init_session();
}
else
{
$this->db_open();
}

$this->gpc->unset_vars();
}

Runkit是个好东西

可惜对系统函数不靠谱。。。

Monday, July 27, 2009

Baidu Hi 与 MSN 互通?

2.4beta版的Hi
早先某人聊天的时候说过这个事情,但是网上一直没有任何消息
而且他给我msn消息的时候,baidu的那段宣传文字的url,还是个死链

刚才清理系统临时文件的时候,看到临时文件夹下边 Baidu\AutoUpdate\plugins 有一个 msnview 目录
打开,三个dll的版本都是 2.4.12.1 时间 7.17
msnview.xml里边
<description name = "MSN互通" author = "luxuhui@baidu.com" />

还有一些其他的内容

这样显然是自动升级下来的

看看baiduhi安装目录,plugins下没有这个目录

把msnview copy过去
重启baidu hi
添加账号多了一个msn好友的radio,但是不可选


其他的地方也没发现多余的踪迹

继续看那个xml,有一段被注释掉了

<!--IPluginExtPt_TabMenu_MainPanel name = "MsnPlugin" enable= "true" sortByStatus="true"  sortByFolder="true"  sortBySpace="false"  sortByFrequency="false" sortOffline="true" bigHeadMode="true" smallHeadMode="true" noHeadMode="true" enableCard="false" supportGroup="false" enableSaveContact="false" enableSendFile="false" enableAVideo="false" enableMultiChat="false">   </IPluginExtPt_TabMenu_MainPanel-->

hmm,取消注释,继续重启


啧啧

还是不可用诶

界面管理器里也有这个设置


唔。。。


再次确认了一下插件,于是发现版本和某人的版本一样
而且xml的那部分本来就是被注释掉的
恢复那段内容
然后看了看update的目录
里边有个 plugins.db,但是baiduhi安装目录没有
hmm
copy过去,继续重启,
果然有了



登陆。。


登录后。。。

发消息。。。

悲剧的链接。。。



404 。。。


Session Handler引发的zend_mm_heap corrupted

不确定最终原因是什么
但是,从代码的结构看,与Newborn Project一样
加上了session handler之后,用kernel.class下的一个session handler类开启session handler
其他代码还没来得及改,大体都是dz2.0的结构。


只要在代码模板中调用discuz_exit或者exit,抑或是在 函数中调用,就会触发这个错误
具体是不是,还不敢确定
因为有时候stderr会写这个
有时候只是5.2 cli会弹出Windows下程序崩溃的提示,module显示unknown
5.3 cli到输出结束就一直挂起没响应,得ctrl+c
没心思去调试php这个错误来源。。。



最终解决方案是把output写进了session类的destructor里,然后kernel加了个end的方法调用exit()

网上找了很久都没有找到一个类似的情况

问题应该是session的结束和exit还有输出流的结束的顺序关系或者调用关系的冲突
但是。。懒得管了

Wednesday, July 22, 2009

Sina VPN非Windows平台登录

刚领到SecureID,按照说明把vpn的客户端装了
之前冠临说MacOS下没有VPN客户端
而安装的时候看到了 L2TP 的熟悉字眼
而且安装包的图标,貌似可以用7-zip解压
一试,果然
解压目录下有几个inf文件,一个vpnlist.txt,还有两个文件SinaL2TP.cmp和SinaL2TP.cms比较小,估计是文本,用Emeditor打开,果然

vpnlist.txt中,

[Settings]
default=自动
UpdateURL=http://***.*.sina.com/vpn/VPNfile.txt
message=  请根据您使用的网络环境选择相应的VPN目的地。                         通常,使用“自动”可智能选择恰当的网络。

[VPN Servers]
自动=***.*.sina.com
网通外网=*.***.*.sina.com
电信外网=*.***.*.sina.com
公司内网=10.2**.*.*3


让冠临新开了一个L2TP的连接,但是几次测试都不能连
L2TP相对PPTP,增加了加密传输的功能
所以,证书或者公钥。。。
翻了翻那几个文件,在SinaL2TP.cmp中看到了

PresharedKey=2**************************l

把这个值设成L2TP的公钥,就行了

手机键盘终于活了

又拆装了四五次
多了零件,不知道在哪儿的

反正能用了

只是外壳又被弄坏了
虽然不碍事

唔,zto和sto。。。

zto: 注入,Oracle
sto: 跨站+注入,Access

……

Monday, July 20, 2009

只能接(打)电话的手机。。。

打电话属于不靠谱的操作
接电话应该没问题
除此之外,啥都不行
开了自动锁键盘,自动锁机
于是。。。。。
只因一根管脚,一根管脚,一根管脚。。。

悲剧啊

拆了一中午的手机

Tuesday, July 7, 2009

Zend Guard ... 不想折腾了

把这几天记下来的东西贴上来
懒得折腾了
太麻烦了,不靠谱
Java代码里没找到验证的部分
很多验证都是在调用resource下的几个程序
而这几个程序居然用OpenSSL。。。
DSA签名啊。。。




=============================================================

RegisterWizard.class:
    String str1 = null;
    if (this.a.a())
      try
      {
        File localFile = File.createTempFile("ZGLicense", null);
        localFile.deleteOnExit();
        str1 = localFile.getPath();
        String str2 = str1;
        1 local1 = new 1(this, str2);
        getContainer().run(true, true, local1);
      }
      catch (Exception localException)
      {
        CommonUIPlugin.a(localException);
        return false;
      }
    else
      str1 = this.a.e();
RegisterWizardPage1.class
  private RegisterWizardPage1 a;
a.a(); -> 返回 a.n
a.n:
 this.n = this.b.getSelection();
a.e(); -> 返回 a.r
a.r:
     this.r = str1;
----->
String str1 = this.l.getText().trim();

所以,a.e() 返回输入的文件名
        int i = GuardLicense.a(str1, GuardConsole.b().newOutputStream(), null);
GuardConsole.b():单件模式初始化对象
直接看 GuardLicense.class 的
  public static int a(String paramString, OutputStream paramOutputStream, IProgressMonitor paramIProgressMonitor)
    int i2 = ZendUtility.g;
// -> ZendUtility.g 一个static 的 int
String str = new File(ZendEncoder.a().d()).getParent();

// -> ZendEncoder.a().d() : .a()初始化对象,.d()是继承 ZendUtility 的 d()方法
代码如下
      String str1 = GuardCorePlugin.a().getBundle().getSymbolicName();
      StringBuffer localStringBuffer = new StringBuffer();
      localStringBuffer.append("/resources/");
      localStringBuffer.append(c());
// 这里c()返回的是 GuardEngine的文件名,Windows下加了 .exe 的扩展名
      String str2 = localStringBuffer.toString();
      URL localURL = FileLocator.find(Platform.getBundle(str1), new Path(str2), null);
      if (localURL != null)
      {
        localURL = FileLocator.resolve(localURL);
        String str3 = localURL.getFile();
        this.b = new Path(str3).toOSString();
      }
// 后边这个等着查javadoc吧

回来
    String str = new File(ZendEncoder.a().d()).getParent();
    File localFile1 = new File(str, "zend_guard.zl");
    File localFile2 = null;
    File localFile3 = new File(paramString);
    boolean bool = localFile1.getCanonicalPath().equals(localFile3.getCanonicalPath());
按照File的参数判断,str这个应该是取resources目录的绝对路径,或者类似的

下边的代码是处理文件存在的时候,将文件备份成***.bak文件
    if ((localFile1.exists()) && (!(bool)))
    {
      localFile2 = new File(localFile1.getAbsolutePath() + ".bak");
      localFile1.renameTo(localFile2);
      localFile1 = new File(str, "zend_guard.zl");
    }




































========================================================================================

从Java代码里很难找到验证相关的代码
看了看resources下的几个exe文件
都有license验证的提示

Ollydbg载入,看字符串参考
满眼全是 OpenSSL相关的东西

phpchina的sample license的内容,看着像是不对称加密的数据

相对而言,zendenc_sign的文件最小,内容较少
考虑调试这个东西


但是,从提示看
license的验证更像是验证证书的签名和有效性
而后的加密,貌似就是用这个分发的证书再对文件做签名

很诡异

如果真是证书的方式,那就可以不用考虑了
伪造证书、签名肯定不靠谱

Sunday, July 5, 2009

Zend Guard ?

升级了 jd-gui 到 0.2.10版,支持直接解包jar了(虽然只是简单的zip而已,但是毕竟方便了不少)
看了看老版本的license,结构貌似很复杂
继续在core下找,看到了一个 LicenseFileParser和一个LicenseFileWrite的 class文件
然后core.resource下的几个exe和dll,居然都是vc6debug模式编译的,连壳都没加
hmm...

继续?

Thursday, July 2, 2009

zend studio 7.0 beta的keygen写出来了。。。

十多行代码的函数
分析的时间超过了5天
但是官方的key却没法通过之前根据java代码重写的验证算法

anyway,

注册成功了 :P


感谢傅奎的支持和帮助



Zend Studio
Professional Edition

Build ID: 20090621

Licensed to: sskaje
Expires on: Never

Copyright (c) 1998-2008 Zend Technologies Ltd. All rights reserved.
Visit http://www.zend.com

This product is based on Eclipse technology.
Visit http://www.eclipse.org

Wednesday, July 1, 2009

送走了28 。。。

团队里边唯一一个离开北京的
除去提前回家的linxinsnow,其他人基本都来了

00的sherman,01的萧剑风,02的傅奎,redhat,04的小塞,05的我,wwwjfy,也云,seer和这次fb的主角 28度的冰 以及07的大企鹅,生物学叫兽,小猴子,瞧瞧,Fipl,神的孩子

还有提前回去了的罗老师

算是ISCC史上最全的一次内部聚会了
甚至可以说是最强的。。。。


只是28将成为离开北京,为国家安全。。。。。。。。


我们会以28为荣的。。。