浏览模式: 标准 | 列表

今天,学校一个部门网站要转移到虚拟主机上来,学校虚拟主机上已经挂了 n 多个站点,跑 ASP、PHP、JSP、ASP.NET 的站点都有。因此为了保证安全性,许多不安全的选项都没有开启。所以该网站放上来以后发现许多功能不能用了。这个网站是 PHP 的,原来跑在一台单独的 Apache 服务器上。这个网站编码属于早期的很烂的编码风格,提交的变量都不是通过 $_GET、$_POST 等变量获取,而是直接使用变量名。也就是说这种编码的网页需要在 php.ini 中打开 Register Globals 选项才能正确执行。如果它是一台单独的服务器,打开那个选项也无所谓,大不了就那一个站点被入侵。可是放在虚拟主机上就不同了。要是开了那个选项,其他的 站点也就会受到威胁了。可是要全面修改这个程序也不太可能,一是这个网站不是我开发的,我只是帮他们发布,我没有义务给他们改程序,二是程序太多,我也不 可能一个个的给他们改。于是找了个简单的办法,那个网站虽然比较烂,但有一点不错,每个程序开头都包含了一个 global.php 文件。于是在这个程序中加了一段代码。实现了跟开启 Register Globals 同样的功能。代码如下:

  1. <?php
  2. function register_globals($item, $key) {
  3.     global $$key;
  4.     $$key = $item;
  5. }
  6.  
  7. array_walk($_GET , 'register_globals');
  8. array_walk($_POST , 'register_globals');
  9. array_walk($_COOKIE , 'register_globals');
  10. array_walk($_SERVER , 'register_globals');
  11.  
  12. ...
  13. session_start();
  14. array_walk($_SESSION , 'register_globals');
  15. ...
  16. ?>

其中 array_walk($_SESSION , ‘register_globals’); 要放在 session_start(); 之后才管用。

这样子,就算被入侵了,也就这一个站点倒霉,其他站点不会跟着受牵连。

» 阅读全文

PHP5 中类默认支持 overload(重载)功能,通过这个功能可以实现自定义属性和 overload 方法。在这篇文章里主要谈的是关于 overload 方法的问题。

这里的 overload 其实跟 C++ 中的 overload 不太一样。在这里你可以通过定一个 __call 方法,来处理用户调用的在类中没有定义的方法。用户调用的方法名被作为第一个参数传给 __call 方法,而用户调用该方法的参数被作为一个数组传给 __call 方法的第二个参数。

PHP4 默认不支持 overload 对象,必须用 overload 方法来明确指定那个类需要 overload 。

PHP5 和 PHP4 的 overload __call 有些不一致的地方。PHP5 中 __call 方法有且只有 2 个参数,即 function_name 和 arguments,返回值在 __call 中用 return 语句返回。而在 PHP4 中,__call 方法有第三个可选参数,而且这个参数是引用参数,它代表返回值,如果需要返回值,只需要在 __call 方法中给第三个参数赋值即可。另外 PHP4 中的 __call 方法中,return 语句如果返回真,表示用户调用方法成功,否则表示用户调用方法失败,即用户调用的方法不存在。

PHP5 和 PHP4 的 overload __call 另外一个区别是,PHP5 中用户调用的方法名传给 __call 方法时,是有大小写区分的,而 PHP4 中用户调用的方法名传给 __call 方法时,方法名会全部转化为小写。

不管是 PHP5 还是 PHP4,overload __call 产生的虚拟方法,都不支持参数的引用传递。还有一个可能没有多少人注意的问题。官方手册和官方手册的用户注释中也没有提到这个问题。那就是 PHP4 在 overload __call 以后,该类中其它的方法在引用传递时,将不再符合手册中的描述。

» 阅读全文

12月
27

PHP big_int 中文使用参考

虽然 LAMP 组合很不错,但是如果想要架设一台同时支持 PHP、ASP、ASP.NET、JSP、Perl 的 Web 虚拟主机服务器,还是用 Windows 2003 的 IIS 6 最好。网上有很多介绍在 IIS 6 上配置 PHP 的文章,但是那些方法,不是性能不好,就是升级麻烦。下面的方法可以让你在第一次配置好后,能够非常方便的进行升级。

» 阅读全文

求一个大素数 p 很容易,用现成的素性验证算法就可以了。不过已知一个素数 p,求其本原根则很困难,因为需要将 p - 1 的素因子 q1,q2,……qk-1,qk都找出来,然后分别验证 gq1 mod p, gq2 mod p, ……gqk-1 mod p, gqk mod p,如果都不等于 1,则 g 是 p 的一个本原根。而然,如果 p 是一个很大的素数,例如 128 个 2 进制位的素数,要分解出 p - 1 的所有素因子来则是一件很困难的事情。

难道没有办法快速求一个大素数 p 及其本原根 g 的方法吗?方法肯定是有的,不然 Diffie-Hellman 算法也就没有意义了。下面就给出一个快速求大素数 p 及其本原根的算法,并给出相应的 php 的程序。

» 阅读全文