手机浏览 RSS 2.0 订阅 膘叔的简单人生 , 腾讯云RDS购买 | 超便宜的Vultr , 注册 | 登陆
浏览模式: 标准 | 列表分类:PHP

使用PHPRPC与论坛同步登录退出

很久以前就用过PHPRPC,几年没用了,虽然一直在关注着,最近尝试着他来做了一下DZ6.0论坛,把遇到的情况与大家分享一下

首先使用PHPRPC把服务器的一些信息传递给客户端,如cookie的一些设置还有最重要的auth_key,然而即使是这样,我最后也没有同步成功。

经过仔细检查,才发现原来是authcode函数所导致。因为authcode函数里使用了一个全局变量$discuz_auth_key,这个key是在使用common.inc.php的时候根据useragent加上一定的规范而生成的。我在传递的时候把这个变量传回给了客户端,但发现通过PHPRPC生成的key与直接使用浏览器打开生成的KEY不一样。导致最后登录所生成的COOKIE无法decode,最后根据这个生成key的规范,在客户端直接生成好发送给服务端覆盖掉全局变量,使得验证通过。

(写的有点乱,其实就是对于不是从数据库里读出来的全局变量,PHPRPC访问时与直接浏览器访问时所生成的数据不一样)

然后在登录的时候因为DZ还要判断SID,如果有SID了那肯定是无法同步登录(理由和上面一样,两边生成的SID会不一样),于是先清空SID,然后再登录,由服务端生成好SID再传回来,就OK了。。。

由于这次是加载common.inc.php进行处理的,所以很多变量会在系统加载的时候生成,但由于我采用了PHPRPC,在这一步完成后,我会尝试不再加载common.inc.php,这样也可以节约开销(在用户量不大的时候无所谓,但因为每次调用PHPRPC,可能会造成在线用户数加1 这个问题。)

逐步改进,oh yeah

Tags: phprpc

pktmandy:php ajax开发中的字符集

最近在作一个uchome的小应用(只有两个input),为了增加体验要用到ajax,结果一折腾就是好几天,光调字符集问题就花了两天,以 前写asp,jsp时从来没费这么大劲.由于DW3中的default encoding没有GBK选项,用UTF-8写到库里是乱码,只能用GB2312.ajax总是在参数是中文时返回错误的结果(MySQL的 Connection是GBK,php页面用的是GB2312;header,meta,ajax的setRequestHeader也是 GB2312).
 
1.GBK和GB2312的不同
用FireFox的FireBug看到参数发送时是乱码,但在被请求页中返回的请求参数是正常的!就没有往字符集上想.就理所认为GBK ==GB2312,我从MSDN上看到的也验证了这个结果。让我们一起去看看:
大小: 51.43 K
尺寸: 500 x 17
浏览: 2000 次
点击打开新窗口浏览全图
大小: 56.06 K
尺寸: 500 x 31
浏览: 1827 次
点击打开新窗口浏览全图
 
折腾了2个多小时没想明白!去搜索一下吧:
以下来自:CSDN:http://blog.csdn.net/gashero/archive/2007/02/17/1511435.aspx

也许大家已经看惯了书上说的GBK是对GB2312的扩充,就是说,GB2312字符集中的所有字符都可以在GBK 字符集中找到。(by gashero)可是最近在一次调试Python爬虫的过程中就发现了一些字符的不同。同时大家也应该注意一些网页的默认编码字符集了。

当时正在分析的一个网页的默认编码字符集是GB2312,其中含有一个符号"·",这个常作为项目符号。在使用 GB2312进行解码时,得到的unicode字符是\u30fb,然后使用系统默认编码GBK进行打印时就提示了编码错误。即字符串"\xa1 \xa4"无法使用GB2312解码为unicode字符后再编码为GBK编码显示。(by gashero)实际测试中只要不会交换编码,那么使用同一种编码进行编码和解码就不会出问题。

后来查找得知,字符\u30fb是一种特殊的unicode字符,是一种不允许显示的字符,所以在GBK编码中就没有它的位置(by gashero)。而字符串"\xa1\xa4"使用GBK解码时得到的是\u00b7。

至此得知,虽然网页的默认编码是GB2312,但是实际上使用的是GBK编码,也使用了一些在GB2312和GBK之间不同的编码字符。所以也就导致了这个错误。

建议以后编程序的时候,遇到默认编码为GB2312的大可以直接使用GBK进行解码为unicode字符串。

明白了,我把所有有关字符集设置的地方都换成:GBK.这时通过FF的FireBug看到的请求参数正常了.问题解决了.

2.都有哪些地方要设置字符集呢?为什么要统一呢?

[原文中作者在此是引用他在csdn中的文字,我将他复制回来了,最后几段代码可看性不强,所以没有贴。。。http://blog.csdn.net/xiaofanku/archive/2008/06/25/2584856.aspx]

最近在学php,由于项目的需要!想在php中用ajax来完成一些体验(减少业务处理的单页压力).发现最近也有一位朋友为此苦恼不已.不废话了!
1.注意几个编码地方
1.1表单所在的网页的:meta
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

1.2XMLHTTPRequest GET的编码
httpRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
此处设置不对!responseText会返回empty(没有内容),如果您有FireFox并装有FireBug组件的话,点击状态栏的绿色箭头打开控件面板(非OS的,FireBug的),选中Console会看到Response选项是:
Illegal mix of collations (gbk_chinese_ci,IMPLICIT) and (latin1_swedish_ci,COERCIBLE) for operation '=
当然如果是连接数据库的话也可能跟下面的(1.4)有关系.

1.3ajax GET请求的页面(.php)header
header("Content-Type:text/html;charset=UTF-8");

1.4数据连接的编码
mysql_query("SET CHARACTER SET UTF8");

如果你的数据库是GBK的或其它的字符集,为了统一编码还要与以上三个统一起来.下面我的示例用的数据库也是GBK,从昨天开始我一起把它设成:
mysql_query("SET CHARACTER SET GBK");
可还是有时发现会返回空(empty 我用的是ResponseText),千万不要写成UTF-8噢,数据库的字符集是没有中间的"-"

2.如果还是返回空或无效的值

例如:a.html中有表单,a用XMLHTTPRequest和b.php通讯.
首先要保证b.php可以正确运行,例b.php?param=value打印出来的是你期望的值
如果a.html打印b.php返回的结果(ajax)与上面的(单独运行b.php)执行结果有出入.可以删除b.php中的空行试试!我想应该不会出现这种情况,但我有几次作demo删除后和删除前确实有出入

pengyuan xu:把几个任意格式的图片合成一个GIF动画的方法

一大早pengyuan就和我说了一些用多张图片合并成一个GIF的方案,他使用了我前段时间博客里提到的imagick的组件。

然后把代码贴给我看了一下。
这是他第一次的代码:

PHP代码
  1. <?php  
  2. $animation = new Imagick();  
  3. $animation->setFormat( "gif" );  
  4. for ($i=1; $i<4; $i++) {  
  5.     $thisimage = new Imagick();  
  6.     $thisimage->readImage($i.'.png');  
  7.     $thisimage->setImageFormat( "gif" );  
  8.     $animation->addImage($thisimage);  
  9.     $animation->setImageDelay(1000);  
  10. }  
  11. header( "Content-Type: image/gif" );  
  12. echo $animation->getImagesBlob();  

然后,他发现图片怎么也没有动,于是有了第二次的代码:

PHP代码
  1. <?php  
  2. $image=new Imagick();  
  3. $animation = new Imagick(); //建立一个对象。  
  4. $animation->setFormat( "gif" ); //设置它的类型。  
  5. $delay = 30; //设置播放速度。  
  6.   
  7. for ($i=1; $i<4; $i++) {  
  8.     $thisimage = new Imagick();  
  9.     $thisimage->readImage($i.'.jpg'); //我有三个图片分别叫:1.jpg,2.jpg,3.jpg 就是要合成他们三个。  
  10.     $thisimage->setFormat( "gif" ); //把他们都转成GIF格式。  
  11.     $animation->addImage($thisimage); //加入到刚才建立的那个gif imagick对象之中。  
  12.     $animation->setImageDelay( $delay ); //设置好播放速度。  
  13. }  
  14.   
  15. header( "Content-Type: image/gif" );  
  16. $animation->writeImages("9.gif",true); //文件存储。  

在这样的情况下,他发现GIF图片可以动了。看来保存成功了。

根据他写的代码,我作了一个小小的测试:

PHP代码
  1. <?php  
  2. $filelist = array(  
  3.     '1.jpg',  
  4.     '2.jpg',  
  5.     '3.jpg'  
  6. );  
  7.   
  8. $animation = new Imagick(); //create animation object  
  9. $animation->setFormat('gif'); // set file type  
  10.   
  11. foreach ( $filelist as $file ){  
  12.     $image = new Imagick();  
  13.     $image->readImage( $file );  
  14.     $animation->addImage( $image );  
  15.     $animation->setImageDelay(60);    
  16.     unset( $image );  
  17. }  
  18. header( "Content-Type: image/gif" );   
  19. echo$animation->getImagesBlob() );  
  20. //$animation->writeImages( time().".gif" ,true );  

代码几乎没变,除了在readImage行下面那个setFormat函数去掉了。同样生成了GIF图片,现在我把问题和解决情况和大家说一下,也希望大家少走点弯路吧

1、在animation里设置好setFormat为gif后,其他地方可以不需要设,因为最终都是通过 $animation->addImage 进入载入图片的,所以载进来肯定是GIF了
2、$animation->setImageDelay( 60 ) ,这个设置帧数的设定只能在每次AddImage后才能设定,否则会报错:没有加载图片时不能设定帧数
3、$animation->writeImages函数,不能使用writeImage,因为是多帧的,它会认为是多张图片
4、至于为什么在使用header设定文件头和echo 输出后图片没有动,我目前怀疑这是浏览器的设定关系,因为,你右键点击生成的图片另存下来时,图片是可以正常的跳动的。

解决完毕。感谢pengyuan的代码

Tags: imagick, gif

另类的想法:用imagick把pdf转成png图片格式

原文:http://hi.baidu.com/dream621/blog/item/7f60de82781b37b96d81196d.html

PHP代码
  1. /** 
  2. * 简单的用imagick把pdf转为png图片,需要调整图片内容大小的改120这个值 
  3. * 作者:lazy 
  4. * 版权:无,可随意使用.可以的话请保留作者跟出处 
  5. * 参数: 
  6. *        $PDF是pdf的路径,pdf文件要存在否则无法处理 
  7. *        $Path是要保存的图片路径,注意要有写权限 
  8. * 返回值:图片的路径(数组) 
  9. * 其它: 
  10. *        要加水印啥的请自己添加. 
  11. *        怎么安装imagick扩展可以看php手册或者google; 
  12. *        http://cn2.php.net/manual/en/class.imagick.php 
  13.  
  14. */  
  15. function pdf2png($PDF,$Path){  
  16.    if(!extension_loaded('imagick')){  
  17.        return false;  
  18.    }  
  19.    if(!file_exists($PDF)){  
  20.        return false;  
  21.    }  
  22.    $IM = new imagick();  
  23.    $IM->setResolution(120,120);  
  24.    $IM->setCompressionQuality(100);  
  25.    $IM->readImage($PDF);  
  26.    foreach ($IM as $Key => $Var){  
  27.        $Var->setImageFormat('png');  
  28.        $Filename = $Path.'/'.md5($Key.time()).'.png';  
  29.        if($Var->writeImage($Filename) == true){  
  30.            $Return[] = $Filename;  
  31.        }  
  32.    }  
  33.    return $Return;  
  34. }  
主要是思路不错就转发了

淘宝QA上关于XSS的两篇文章(据说还有后续)

不说啥了,直接上原文:
两篇文章的地址分别为:http://rdc.taobao.com/blog/qa/?p=857

http://rdc.taobao.com/blog/qa/?p=882

什么是xss漏洞

XSS又叫CSS英文缩写为Cross Site Script
中文意思为跨站脚本攻击
具体内容指的是恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,
嵌入其中Web里面的html代码会被执行,从而达到恶意用户的特殊目的.

xss的漏洞危害

  • 获取用户cookie
  • 修改页面信息
  • 浏览器劫持
  • 与其他漏洞结合(如:csrf漏洞)
  • 其他

xss漏洞实例演示

  • 略(在这里放貌似不太合适)

xss漏洞是如何产生的

以下Velocity模板VM中常见的代码

  • <span>$!productName</span>
  • <script>var from = ‘$!rundata.Parameters.getString(’from’)';</script>

对于第一种类型的代码我们可以输入变量为

<iframe src=http://hacker.com></iframe>

第一种类型的代码将变为

<span><iframe src=http://hacker.com></iframe></span>

对于第二种类型的代码我们可以输入变量为

‘;hackerFunction(document.cookie);’

第二种类型的代码将变为

<script>var from = ”;hackerFunction(document.cookie);”; </script>

以上两种类型的代码都轻易的被植入了恶意的脚本,也就是说产生了传说中的xss漏洞。

xss漏洞如何预防

1. 对于非富文本针对入参进行转义

可通过escapeHtml和JavaScript进行转义。

转义过后上面的代码将会变成

<span>&ltiframe&nbspsrc&equalshttp&colon&sol&solhacker&periodcom&gt&lt&soliframe&gt</span>

转义后用户输入的恶意脚本代码就不会被执行从而达到了预防和修复的目的。

2. 对于富文本入参进行过滤

略。

总结

本篇简要介绍了什么是xss漏洞,xss漏洞在代码中是如何产生的,简单介绍了如何去预防和修复xss漏洞。

黑盒手动测试

  • 有输入框的页面测试

               对于非富文本在输入框中输入特殊字符 <”tiehua ‘> 提交

               在提交后的页面查看源代码根据关键字tiehua查找源代码中的tiehua前后的<”>’是否已经被转义成

               &lt&quot&gt&apos 如果未被转义说明这个输入框存在xss漏洞的嫌疑(提交bug)。

               对于富文本输入框输入<img onerror=”alert(123)” src=http://xxx.com>提交页面

               如果页面有出现排版问题或者js错误说明这个输入框存在xss漏洞的嫌疑(提交bug)。

  • 页面链接参数的测试

             链接带参数的如:

             http://mall.taobao.com/?ad_id=&am_id=&cm_id=&pm_id=

            该链接包含了4个参数,对于这种的测试方法和输入框测试方法一样只不过把参数当成你的输入框进行

            提交。如:

            http://mall.taobao.com/?ad_id=<”tiehua’>&am_id=&cm_id=&pm_id=

           

           另:可能大家会说光这点不足以说服开发修改bug,很可惜本文旨在说明如何找到xss漏洞并不是说明

           如何利用xss漏洞,感兴趣的看情况线下交流呵呵。

黑盒工具测试

         推荐工具

  • Paros(免费)
  • Acunetix.Web.Vulnerability.Scanner (商业工具)     

白盒代码扫描测试

         在上一篇中我们讲到了xss漏洞产生的代码原因和解决方法如:

          <span>$!productName</span>

         此类的非富文本代码我们可以强制要求规范为:

         <span> $!stringEscapeUtil.escapeHtml ($!productName)</span>

         对于富文本的我们可以强制要求代码规范为通过过滤层过滤。

         根据以上的两条规则,我们可以从白盒代码上去进行静态扫描代码是否按照规范编写来预防和筛选xss漏洞。

Tags: xss, qa, taobao