分类目录归档:程序开发

PHP官方称PHP代码源或被污染 用户下载需谨慎

转载:http://chinaz.com/Webmaster/report/03251CV52011.html

3月25日消息:据PHP官方网站发布新闻得知其wiki账号被盗,原因是wiki.php.net漏洞导致的,而wiki的账号和php代码源的SVN提交权限相关联,从而导致PHP代码受污染。

据了解,PHP5.3.6以及其后续版本的代码有可能被污染,目前只能把未受污染的代码版本确保到PHP5.3.5,下载PHP代码的用户,需谨慎。

原文内容:
The wiki.php.net box was compromised and the attackers were able to collect wiki account credentials. No other machines in the php.net infrastructure appear to have been affected. Our biggest concern is, of course, the integrity of our source code. We did an extensive code audit and looked at every commit since 5.3.5 to make sure that no stolen accounts were used to inject anything malicious. Nothing was found. The compromised machine has been wiped and we are forcing a password change for all svn accounts.
We are still investigating the details of the attack which combined a vulnerability in the Wiki software with a Linux root exploit.

内容大致是:

由于wiki账号被盗,PHP的代码源极有可能被污染,当然,PHP团队已经做最大的努力以保证自PHP5.3.5版本的代码没有收到污染,并且强迫SVN修改现有的密码。

而事件目前的状态是,他们仍然没法锁定漏洞所在,因为他们仍在排查。

一个很明显的问题是,PHP5.3.6以及其后续版本的代码可能已经被污染,目前只能把未受污染的代码版本确保到PHP5.3.5,下载PHP代码的人,要小心了。

而windows.php.net和wiki.php.net也已经暂停访问。

———————————-

作为一款被广泛使用的开发语言,经过此事,已经表明了php源码存在风险的可能,php源码的安全性令人堪忧。

使用数组语法访问的重载

PHP支持联合数组把整型或字符串的值映射到任何其它的值,这是一个关键字/值得映射模式,像在应用框架中查找字典一样,很是方便。

假设这么个例子,在海里的记录查找某个ID的记录。联合数组中少量数据放在一起,用其值如查字典般确认所需要的数据,非常快捷。但如果数据大,为查找某ID的数据而把所有的数据都加载到一个数组中就不实际了。

实际上,可以使用数组的语法轻松实现。这实际是PHP调用自定义的方法,由此方法执行相关的数据库调用,返回所对应的值。实现这些功能,定义的类需要实现ArrayAccess接口(如下):

bool offsetExists($index);

mixed offsetGet($index);

void offsetSet($index, $new_value);

void offsetUnset($index);

class userMap implements ArrayAccess
{
     private $_db;  // 只是简单的举例,这里不详述其实现

    function offsetExists($user_name)
      {
           return $this->_db->userExists($user_name);
      }

      function offsetGet($user_name)
      {
          return $this->_db->getUserID($user_name);
      }

      function offsetSet($user_name, $id)
      {
          $this->_db->setUserID($user_name, $id);
      }

      function offsetUnset($user_name)
      {
          $this->_db->unsetUser($user_name);
      }
}

$userMap = new userMap();

echo "ljlwill's ID is ". $userMap['ljlwill'];

可以看到,对象userMap的使用就像Array一样。在实际开发中,有时使用这重载功能会比冗长调用一个方法更加便捷。

PHP 5.3.4 发布

PHP 开发团队宣布 PHP 5.3.4 发布。

PHP 5.3.4 特性:
1)增加对zip 流的统计支持
2)新增 follow_location (默认启用)支持
3)增加一个 3rd parameter to get_html_translation_table
4)Implemented FR #52348, added new constant ZEND_MULTIBYTE to detect zend multibyte at runtime.
5)Multiple improvements to the FPM SAPI.
6)修复 100 多处bug

WIN7下IIS7的PHP环境配置

IIS下配置PHP环境,有CGI方式,ISAPI方式和FastCGI方式,具体它们之间明细,网上可搜索相关资料。

现在配置的PHP 5.3.3 VC9的版本(在windows下,Apache+PHP采用VC6版本,而IIS+PHP采用VC9版本)。在php.net/download中下载installer版本,然后按提示安装,在Web Server Setup选择IIS FastCGI便非常容易安装好,win7下的IIS7便可运行PHP文件了。

小小注意:

1) Windows/Temp目录的权限设置为erverone,否则PHP不可上传文件,还有ASP,.NET等不可访问Access

2)Windows 7中PHP连接Mysql时默认只能使用IP地址连接Mysql,而无法使用localhost连接Mysql,解决方法为打开C:\Windows\System32\drivers\etc下的hosts文件,将# 127.0.0.1 localhost中的注释去除即可。或者将数据库地址设置为127.0.0.1。

ASP访问Access2003和Aceess2007

ASP访问Access 2003的连接语句:
“Provider=Microsoft.Jet.OLEDB.4.0;Data Source=” & db_path

ASP访问Access 2007的连接语句
“Provider=Microsoft.ACE.OLEDB.12.0;Data Source=” & db_path

Access 2003和Access 2007的Provider不同,其扩张名也不同,AC2003的为mdb,而AC2007的为accdb。

AC2007转换为AC2003,需检查系统是否安装micorsoft.jet.oledb数据源驱动,如果没有,可以如下方法进行安装:

先安装MDAC 2.7(未安装不可运行Access),安装目录WCU文件夹的MDAC的安装包,驱动申明使用“microsoft.jet.oledb.4.0″. MDAC 2.7做成打包文件以后选择jet引擎,安装即可。

AC2003转换为AC2007,则需检查系统是否安装microsoft.ace.oledb驱动。

还有点得注意,ASP访问access是,需将Windows/Temp目录的权限设置为erverone,否则ASP无法访问Access。

PHP has encountered an Access Violation at 03BF3FC2

今天进入php网站的时候,空白一片,只显示PHP has encountered an Access Violation at 03BF3FC2,之前PHP站一直运行正常,而现在ASP站运行正常,于是估计内存不足?

整了一番,看C盘(Win2003环境),Free space: 0 bytes。C盘一点剩余存储空间都没了!!赶紧查看并整理一番,PHP站终于可以运行了。

Chrome浏览器加载XML文档

Chrome浏览器不支持load方法加载XML文档。网上找了下,需要如下解决:

function loadXMLDoc(xml_name)
{
  var xmlDoc;

  try
  {
    xmlDoc = new ActiveXObject("Microsoft.XMLDOM");   // Support IE
  }
  catch(e)
  {
    try
    {
     // Support Firefox, Mozilla, Opera, etc
      xmlDoc = document.implementation.createDocument("", "", null) ;// 创建一个空的 XML 文档对象。
    }
    catch(e)
    {
       alert(e.message);
    }
  }

  // 加载XML文档
  try
  {
    xmlDoc.async = false;   // 关闭异步加载
    xmlDoc.load(xml_name);
  }
  catch(e)
  {
     // alert(e.message)   如果浏览器是Chrome,则会catch这个异常:Object # (a Document) has no method "load",所以,以下实现支持chrome加载XML文档(只是粗略的写下)

    var xhr = new XMLHttpRequest();
    xhr.open("GET", xml_name, false);
    xhr.send(null);
    
    xmlDoc = xhr.responseXML.documentElement;
  }

   return xmlDoc;
}

BTW,各浏览器加载XML字符串也不同。

IE使用 loadXML() 方法来解析 XML 字符串:

xmlDoc.loadXML(xml_str);

FireFox等使用DOMParser 对象解析XML字符串:

var parseXml = new DOMParser();
var doc = parseXml.parseFromString(xml_str,"text/xml");

Ajax的call方法

被以下问题郁闷了下。下面比较抽象简述下这个问题。

index.html文件

Test

test.js文件:

/**
  * 定义一个无类型的对象listInfo
  */
var listInfo = 
{
     // 属性info,为对象类型
     info : {
         name : "ljlwill"
     },

    // 方法getName
     getName : function()
     {
          // 我这个例子这样来设置setName,好像“蛮干”哈,现在我只是简化和抽象,实际项目就是要用这些规则
          Ajax.call(this.setName);

          alert(this.info["name"]);
     },

    // 方法setName
    setName: function(name)
    {
        this.info["name"] = name;    // 大家注意这个this
    }
}


/**
  * 定义无类型的Ajax对象
  */
var Ajax = 
{
     // 创建XMLHttpRequest对象
    createXMLHttpRequest : function() 
   {
        var xhr;

        if (window.ActiveXObject)
        {
             var versions = ['Microsoft.XMLHTTP', 'MSXML6.XMLHTTP', 'MSXML5.XMLHTTP', 'MSXML4.XMLHTTP', 'MSXML3.XMLHTTP', 'MSXML2.XMLHTTP', 'MSXML.XMLHTTP'];

             for (var i=0; i< versions.length; i++)
             {
                  try
                  {
                       xhr = new ActiveXObject(versions(i));
                       break;
                  }
                   catch(ex)
                  {
                       continue;
                  }
             }
             
        }
        else
        {
              xhr = new XMLHttpRequest();
        }
    
        return xhr;
   },

   // call方法
   call : function(callback)
   {
       var xhr = this.createXMLHttpRequest();
       
       // 以下也一切从简
       xhr.open("GET", "index.php", true);  //异步
       
       xhr.onreadysatechange = function()
       {
           // 完成
           if (xhr.readySate == 4) 
           {
               swith (xhr.status) 
               { 
                   case : 200    // OK
                      if (typeof(callback) == "function")
                      {
                           callback.call(this, "ljlwill -- from Ajax");   // 将自身绑定到另外一个对象执行
                      } 
               }

               xhr = null;  // 销毁
           }

       }
       
       if (xhr != null) xhr.send(null);
   }

}

这时,我本意要,点击那个Test链接,先弹出“ljlwill",然后在点击一次的时候是弹出“ljlwill -- from Ajax",可是却不论如何点击,都是弹出"ljlwill"。listInfo对象的setName没有执行?里面加个alert,证明是有执行的。

其实,是这个call方法”捣鬼“。

在JavaScript中,将函数自绑定到另外一个对象上执行,有appliy和call方法,它们只是在参数方面有所不同(具体可相关资料,这里不详述)。

Function.prototype.call(thisArg, [arg1, [arg2, ] ...]),所有函数的内部this指针都会指向thisArg,从以上代码中这个thisArg为Ajax对象,非listInfo对象,这样当然改变不了name值了!

所以,把那callback.call(this, "ljlwill -- from Ajax")该为callback.call(listInfo, "ljlwill -- from Ajax"),问题解决。只是这样有一定的隐患,比如listInfo未定义,或改名,牵动的东西还蛮多!所以,可以就让Ajax对象来运行这函数,而函数的方法内部指明关联哪个对象!

以上也是个人愚见,不是有否不足,或不对,期待讨论~

PHP遍历数组

PHP拥有强大的数组处理能力。下边浅谈它如何遍历一个数组。

(1)foreach语句:

foreach($array as $value){}
foreach($array as $key => $value) {}

(2)for语句:

for($i=0, $size=count($array); $i<$size; $i++){}

// 针对关联数组
for(reset($array); $key = key($array); next($array))

(3)while语句:

reset($array);
while(list($key, $value) = each($array)) {}

以上可以看出,使用foreach语句比较简洁。但它迭代的是相应数组的一个副本,而for语句和each函数是,php迭代的是原始数组。故如果考虑速度或修改数组时,就该有相应的选择。

php常用类

在开发中,会遇到一些重复操作,其实很多PEAR帮我们做好了,以下是网上转帖整理:

图表库

下面的类库可以让你很简单就能创建复杂的图表和图片。当然,它们需要GD库的支持。

pChart – 一个可以创建统计图的库。

Libchart – 这也是一个简单的统计图库。

JpGraph – 一个面向对象的图片创建类。

Open Flash Chart – 这是一个基于Flash的统计图。

 

RSS 解析

解释RSS并是一件很单调的事情,不过幸好你有下面的类库可以帮助你方便地读取RSS的Feed。

MagpieRSS – 开源的PHP版RSS解析器,据说功能强大,未验证。

SimplePie – 这是一个非常快速,而且易用的RSS和Atom 解析库。

 

缩略图生成

phpThumb – 功能很强大,如何强大还是自己去体会吧。

 

支付

你的网站需要处理支付方面的事情?需要一个和支付网关的程序?下面这个程序可以帮到你。

PHP Payment Library – 支持Paypal, Authorize.net 和2Checkout (2CO)

OpenID

PHP-OpenID – 支持OpenID的一个PHP库。OpenID是帮助你使用相同的用户名和口令登录不同的网站的一种解决方案。如果你对OpenID不熟悉的话,你可以到这里看看:http://openid.net.cn/

 

数据为抽象/对象关系映射ORM

ADOdb – 数据库抽象

Doctrine – 对象关系映射Object relational mapper (ORM) ,需要 PHP 5.2.3+ 版本,一个非常强大的database abstraction layer (DBAL).

Propel – 对象关系映射框架- PHP5

Outlet – 也是关于对象关系映射的一个工具。

注:对象关系映射(Object Relational Mapping,简称ORM)是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。本质上就是将数据从一种形式转换到另外一种形式。这也同时暗示者额外的执行开销;然而,如果ORM作为一种中间件实现,则会有很多机会做优化,而这些在手写的持久层并不存在。更重要的是用于控制转换的元数据需要提供和管理;但是同样,这些花费要比维护手写的方案要少;而且就算是遵守ODMG规范的对象数据库依然需要类级别的元数据。

 

PDF 生成器

FPDF – FPDF这个PHP Class允许你采用纯PHP(更确切地说就是不需要使用PDFlib)来生成PDF文件。它所具有的特点包括:可选择的unit大小,页面格式和页边距;页眉和页脚管理;自动分页;自动换行与文本自动对齐;支持JPEG与PNG图片格式;支持着色和文件超链接;支持TrueType,Type1与 encoding;支持页面压缩。

HTML2PDF — 能够把一个HTML文本转换成一个打印机友好的PDF文件。这个PHP脚本构建在FPDF PHP脚本之上。

 

TCPDF — 是一个用于快速生成PDF文件的PHP5函数包。TCPDF基于FPDF 进行扩展和改进。支持UTF-8,Unicode,HTML和XHTML。

 
html2ps  — 能够把带有图片,复杂表格(包含rowspan/colspan) ,layer/p和css样式的HTML转换成Postscript与PDF。 html2ps对CSS2.1支持非常好,并且很好地兼容不正确的HMTL。它甚至能够转换几乎是采用CSS设计的网站如msn.com。

 

HTML_ToPDF — 能够把任何HTML文档转换成在任何平台和打印机下界面格式都一样的PDF文档。它包括支持图片转换,使用样式表来定制PDF文件和错误处理。

 
dompdf — 是一个HTML到PDF的转换工具。它的核心是一个遵循大部份CSS2.1样式的Rendering引擎。dompdf采用样式驱动,它能够下载并读取外部样式,整个样式标签和单个HTML元素的样式属性。它同样支持目当大部份HTML属性。

 
cPdfWriter — 是一个能够输出PDF文档的PHP5 class。基于TCPDF,FPDF和其它相关脚本。

 
pdf-newspaper — 是一个开源的PHP应用程序,它能够将RSS供稿转换成报纸格式的PDF文档。

 

Excel 相关

你的站点需要生成Excel?没有问题,下面这两个类库可以让你轻松做到这一点。

php-excel – 这是一个非常简单的Excel文件生成类。

PHP Excel Reader – 可以解析并读取XLS文件中的数据。

 

E-Mail 相关

不喜欢PHP的mail函数?觉得不够强大?下面的PHP邮件相关的库绝对不会让你失望。

Swift Mailer – 免费的超多功能的PHP邮件库。

PHPMailer – 超强大的邮件发送类。

 

单元测试

如果你在使用测试驱动的方法开发你的程序,下面的类库和框架绝你能帮助你的开发。

SimpleTest – 一个PHP的单元测试和网页测试的框架。

PHPUnit – 来自xUnit 家族,提供一个框架可以让你方便地进行单元测试的案例开发。并可非常容易地分析其测试结果。