存档

作者存档

Zend Session使用要点

2008年10月16日

在Zend_Session使用中需要注意以下几点

1. 关闭PHP的 session.auto_start setting. 在php.ini, 或者 .htaccess中写:
php_value session.auto_start 0

2.不要直接使用session_start() 和Zend_Session_Namespace有冲突。

3.简单方法:可以直接new一个Zend_Session_Namespace,但是这种方法需要注意不要在此代码之前输出header.

4.麻烦但是不容易出问题的方法:使用Zend_Session::setOptions() 设置为strict, 防止自动自动zend session;在bootstrap中根据具体的action的需要,启动Zend_Session::start(),然后在action中new Zend_Session_Namespace。

VN:F [1.9.22_1171]
Rating: 5.7/10 (3 votes cast)
VN:F [1.9.22_1171]
Rating: +1 (from 1 vote)

程序开发

强制使用https的apache设置

2008年10月11日
强制使用https的apache设置已关闭评论

如果我们有一个域,比如login.abc.com, 这个域我们同时接受http和https协议,但是我们希望将http协议的用户重定向到https,可以有两种做法,一种是在代码中进行重定向,zf的代码如下:

class Common_Helper_ForceHTTPS extends Zend_Controller_Action_Helper_Abstract {
  public function direct() {
    if (! isset ( $_SERVER['HTTPS'] ) && $_SERVER['HTTPS']) {
      $request = $this->getRequest ();
      $url = 'https://' . $_SERVER ['HTTP_HOST'] . $request->getRequestUri ();
      $redirector = Zend_Controller_Action_HelperBroker::getStaticHelper ( 'redirector' );
      $redirector->gotoUrl ( $url );
    }
  }
}

还有一种是进行apache配置,由于apache的配置是c代码,效率较高,我们建议用apache的配置来实现。
<IfModule mod_rewrite.c>
    RewriteEngine on
    Options +FollowSymLinks
    RewriteBase /   
RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d   
    RewriteRule ^(.*)$ index.php/$1
   
    RewriteCond $1 !^(index.php|img|css|js|secure_checkout|common_funcs.js|robots.txt)
    RewriteCond %{SERVER_PORT} 80
    RewriteRule /secure_checkout(.*)$ https://www.myURL.com/secure_checkout/$1
</IfModule>
RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d   
    RewriteRule ^(.*)$ index.php/$1
   
    RewriteCond $1 !^(index.php|img|css|js|secure_checkout|common_funcs.js|robots.txt)
    RewriteCond %{SERVER_PORT} 80
    RewriteRule /secure_checkout(.*)$ https://www.myURL.com/secure_checkout/$1
</IfModule>

VN:F [1.9.22_1171]
Rating: 9.5/10 (2 votes cast)
VN:F [1.9.22_1171]
Rating: 0 (from 0 votes)

程序开发 , ,

PHP安全防范

2008年10月7日

PHP代码安全和XSS,SQL注入等对于各类网站的安全非常中用,尤其是UGC(User Generated Content)网站,论坛和电子商务网站,常常是XSS和SQL注入的重灾区。这里简单介绍一些基本编程要点, 相对系统安全来说,php安全防范更多要求编程人员对用户输入的各种参数能更细心.

php编译过程中的安全

建议安装Suhosin补丁,必装安全补丁

php.ini安全设置

register_global = off
magic_quotes_gpc = off
display_error = off
log_error = on
# allow_url_fopen = off
expose_php = off
open_basedir =
safe_mode = on
disable_function = exec,system,passthru,shell_exec,escapeshellarg,escapeshellcmd,proc_close,proc_open,dl,popen,show_source,get_cfg_var
safe_mode_include_dir =

DB SQL预处理

mysql_real_escape_string (很多PHPer仍在依靠addslashes防止SQL注入,但是这种方式对中文编码仍然是有问题的。addslashes的问题在于黑客可以用0xbf27来代替单引号,GBK编码中0xbf27不是一个合法字符,因此addslashes只是将0xbf5c27,成为一个有效的多字节字符,其中的0xbf5c仍会被看作是单引号,具体见这篇文章)。用mysql_real_escape_string函数也需要指定正确的字符集,否则依然可能有问题。
prepare + execute(PDO)
ZendFramework可以用DB类的quote或者quoteInto, 这两个方法是根据各种数据库实施不用方法的,不会像mysql_real_escape_string只能用于mysql

用户输入的处理

无需保留HTML标签的可以用以下方法

strip_tags, 删除string中所有html标签
htmlspecialchars,只对”<”,”>”,”;”,”’”字符进行转义
htmlentities,对所有html进行转义

必须保留HTML标签情况下可以考虑以下工具:
HTML Purifier: HTML Purifier is a standards-compliant HTML filter library written in PHP.
PHP HTML Sanitizer: Remove unsafe tags and attributes from HTML code
htmLawed: PHP code to purify & filter HTML

上传文件

用is_uploaded_file和move_uploaded_file函数,使用HTTP_POST_FILES[]数组。并通过去掉上传目录的PHP解释功能来防止用户上传php脚本。
ZF框架下可以考虑使用File_upload模块

Session,Cookie和Form的安全处理

不要依赖Cookie进行核心验证,重要信息需要加密, Form Post之前对传输数据进行哈希, 例如你发出去的form元素如下:

<pre lang="php">&lt;input type="hidden" name="H[name]" value="&lt;?php echo $Oname?&gt;"/&gt;
&lt;input type="hidden" name="H[age]" value="&lt;?php echo $Oage?&gt;"/&gt;
&lt;?php $sign = md5('name'.$Oname.'age'.$Oage.$secret); ?&gt;
&lt;input type="hidden" name="hash" value="&lt;?php echo $sign?&gt;"" /&gt;

POST回来之后对参数进行验证

$str = "";
foreach($_POST['H'] as $key=&gt;$value) {
  $str .= $key.$value;
}
if($_POST['hash'] != md5($str.$secret)) {
  echo "Hidden form data modified"; exit;
}

PHP安全检测工具(XSS和SQL Insertion)

Wapiti – Web application security auditor(Wapiti – 小巧的站点漏洞检测工具) (SQL injection/XSS攻击检查工具)
安裝/使用方法:
apt-get install libtidy-0.99-0 python-ctypes python-utidylib
python wapiti.py http://Your Website URL/ -m GET_XSS

Pixy: XSS and SQLI Scanner for PHP( Pixy – PHP 源码缺陷分析工具)
安裝: apt-get install default-jdk
Remote PHP Vulnerability Scanner(自动化 PHP页面缺陷分析, XSS检测功能较强)
PHPIDS – PHP 入侵检测系統

VN:F [1.9.22_1171]
Rating: 0.0/10 (0 votes cast)
VN:F [1.9.22_1171]
Rating: 0 (from 0 votes)

程序开发 ,

Zend Translate的使用和设置

2008年9月30日

Zend Translate的功能不错, 我们使用gettext格式作为我们翻译文件的标准格式,使用POEditor维护翻译文件,处理后的gettext文件是二进制的mo文件. 我们使用ZF的根据目录名(LOCALE_DIRECTORY)自动搜索相关译文功能,同时使用根据mo文件更新的cache提高速度,为了设置translate功能,我们在bootstrap文件有如下代码
$cache = Zend_Cache::factory('Page','File',$frontendOptions,$backendOptions);
Zend_Translate::setCache($cache);
$translate = new Zend_Translate('gettext','../data/locales/','zh',array(
    'scan' =>Zend_Translate::LOCALE_DIRECTORY
));
$translate->setLocale('auto');
Zend_Registry::set('Zend_Translate', $adapter);
Zend_Form::setDefaultTranslator($translate);

注意:在保存到 Zend_Registry 中时,键值必须是 Zend_Translate,否则,得不到应有的结果。

其中,‘scan’ =>Zend_Translate::LOCALE_DIRECTORY设定ZF在指定目录下搜索翻译mo文件。我们的目录结构为:
application
...
data
  ...
  locales
    en
    de
    fr
    zh
...

在ZF的Document中有一个Example,要求设置’auto’格式:
$translate = new Zend_Translate('gettext','path','auto',array('scan' =>Zend_Translate::LOCALE_DIRECTORY));

但是事实上根据我在ZF1.52, 1.6, 1.61中测试,这个代码是有bug的, ‘auto’并不能正确将用户浏览器语言设置为当前语言,而是将最后一个读到的文件设置为默认Locale, 这点从ZF1.61的代码中Zend_Translate_Adapter::addTranslation函数中可以看到。

我们是怎么解决的呢,很简单,第一次读取时设置语言为’zh’, 然后立即设定默认locale为’auto’

VN:F [1.9.22_1171]
Rating: 0.0/10 (0 votes cast)
VN:F [1.9.22_1171]
Rating: 0 (from 0 votes)

程序开发

PO Editor的使用和配置

2008年9月30日

Zend Framework 的translate支持多种格式的翻译文件,从小型项目使用的ini文件,到专业项目使用的tmx, gettext等。google了一下,似乎linux下的gettext速度最快,编译的结果是binary格式的,于是选择了gettext格式。有个很多工具可以用来维护gettext格式,比较有名的有免费的PO Editor下载。这个PO Editor的好处是可以自动搜索某一目录下代码中所有的代码文件中需要翻译的字符串。PHP下如何设置POEditor,对于我们的项目,在”类目”->”设置”下

1. 选择”路径”,将基本路径(basedir)设为d:/xampp/audit/,新建路径”application”;

2. 选择”关键字”,我设置两个,一个是zf默认的translate函数关键字,一个是setlabel用于form的翻译;

3. 还有很关键的一点,修改配置抓取phtml中的关键字:文件->首选->解析器->选择php后->编辑,将扩展名改为:”*.php;*.phtml”,将解析器命令改为:”xgettext –force-po -o %o %C %K %F -L php”;

4. 现在开始可以自动搜索代码中的翻译文件了。

VN:F [1.9.22_1171]
Rating: 5.0/10 (1 vote cast)
VN:F [1.9.22_1171]
Rating: 0 (from 0 votes)

软件和工具

关于BOM头

2008年9月26日

要命的BOM头让我吃了两次亏,每次都是莫名奇妙地花了1,2天才找出问题。
第一次是:写ZF的errorControler设置404返回值的时候报错:
Cannot modify header information - headers already sent
检查了那个有名的ZF最后一个结束符不写的问题和setRawHeader的代码,都找不出症结所在,后来发现是BOM头捣鬼。
今天又碰到这个问题,导入系统一个excel文件,老有错,仔细检查是第一行含有bom头,所以数据老是读错,害我花了半天的时间找问题。

在Windows下用记事本之类的程序将文本文件保存为UTF-8格式时,记事本会在文件头前面加上几个不可见的字符(EF BB BF),就是所谓的BOM(Byte order Mark)。

php4/5会视BOM为一般字符输出(这是一个不可见字符),因此会出现这个header already sent的问题。应该说这是一个php的bug(22108, 42312),可喜的是,php6宣传已经没有这个问题,而在php4/5下,有两个方法可以解决这一问题:
方法一,可以在保存文件的时候设置不使用BOM头格式的UTF8文件。
dreamweaver设置如下:

UltraEdit可以设置(Configuration-> File Handling -> Save -> Write UTF-8 BOM header),
也可以直接修改C:\Windows\UEdit32.ini,增加以下两行设置
Write UTF-8 BOM=0
Write UTF-8 BOM NF=0

此外HTML代码中的codepage及charset也必须要设定,以保证编码方式正确。

方法二,以上方式可以解决自己写的代码,却不能解决用户上传的文件。这种情况下,需要在服务器端判断文件头,并截取相应的三个字符(0xEF 0xBB 0xBF),以下代码是FCKeditor的一段代码,由于考虑到可能要处理的文件较大,所以将传值函数改成传递引用:
//strip UTF8 BOM if any
function StripUtf8Bom( &$data ){
  if ( substr( $data, 0, 3 ) == "\xEF\xBB\xBF" ){
   $data=substr_replace( $data, '', 0, 3 ) ;
   return TRUE;
  }
  return FALSE;
}

关于为何能提高性能,见风雪之隅的博客介绍的php传递引用的实现

VN:F [1.9.22_1171]
Rating: 5.0/10 (1 vote cast)
VN:F [1.9.22_1171]
Rating: +2 (from 2 votes)

程序开发

XAMPP设置和使用

2008年9月25日

我们使用XAMPP作为本地开发环境,主要的原因还是非常方便地安装了我们所需要的开发环境,几乎是不需要什么设置,目前支持windows,linux,macOS和solaris,几乎涵盖了绝大多数主流开发者使用的操作系统。下面介绍windowsXP下的设置,vista的设置类似。
首先在XAMPP官方网站下载XAMPP,下载后在D盘根目录创建XAMPP目录,将解压缩后的xampp拷贝进去,执行setup-xampp.bat即可。

要启动apache,可以运行xampp目录喜爱的xampp-control.exe,也可以执行xampp-start.exe,启动apache和mysql。

配置为系统服务,使得系统重启之后自动运行。在 NT4、2000 和 XP 平台中将特定的服务器配置为系统服务。可以以下脚本:

安装 Apache 服务器为系统服务:.\xampp\apache\apache_installservice.bat
卸载 Apache 服务器的系统服务:.\xampp\apache\apache_uninstallservice.bat
安装 MySQL 服务器为系统服务:.\xampp\mysql\mysql_installservice.bat
卸载 MySQL 服务器的系统服务:.\xampp\mysql\mysql_uninstallservice.bat
安装及卸载 FileZilla FTP 服务器为系统服务:.\xampp\filezilla_setup.bat
Mercury 邮件服务器:目前还不能配置为系统服务!

PEAR的设置:

/xampp/php/go-pear,一直回车,到设置php.ini时注意使用/xampp/apache/bin/php.in而不是/xampp/php/php.ini回车,就安装好pear了
现在先检查下配置:
d:/xampp/php/pear config-show

然后按需要安装phpunit和一些重要的模块
d:/xampp/php/pear channel-discover pear.phpunit.de
d:/xampp/php/pear install log
d:/xampp/php/pecl install pdo_sqlite
d:/xampp/php/pear install xdebug
d:/xampp/php/pear install php/PHPUnit
d:/xampp/php/pear config

VN:F [1.9.22_1171]
Rating: 0.0/10 (0 votes cast)
VN:F [1.9.22_1171]
Rating: 0 (from 0 votes)

程序开发

Zend Framework的项目目录结构

2008年9月25日

参考ZF1.6版本之前建议的通用目录结构 ,或许你能找到你现在的代码所使用的目录结构。目前我们开发使用的文件结构
框架遵循Zend Framework 1.6 Proposal Project Structure如下:

<project name>/
  application/
    apis/
    config/
    controllers/
        helpers/
    layouts/
        filters/
        helpers/
        scripts/
    models/
    modules/
    views/
        filters/
        helpers/
        scripts/
    bootstrap.php
  data/
    cache/
    indexes/
    locales/
    logs/
    sessions/
    uploads/
  docs/
  library/
  public/
    css/
    js/
    images/
    .htaccess
    index.php
  scripts/
    jobs/
    build/
  temp/
  tests/

2009/7/30更新:ZF1.8的推荐项目目录结构:

根据项目的复杂度不同和需要不同,可以有不同的目录构造,Zend Framework所推荐的目录结构如这篇proposal所示。我所使用的目录结构图和ZF的规范相同,可以用zend tool直接生成:

dev:~# cd /var/www/jefflei
dev:~# zf create project .
Creating project at /var/www/jefflei

目录结构大致如示意图所示,因为比较懒,借用了别人的结构图。我们使用的有如下几点不同:

1. .htaccess, index.php是放在public目录下的,这样方便将document root设置到public目录下,增强安全性。

2. library。如果不是需要同时在多个项目中使用不同版本的Zend Framework类库,建议将ZendFramework类库放在项目目录的外面,这样减少主项目的size。

3. Modules目录下通常是application目录结构的迭代,比如:

`-- application
|  `-- controllers
|  `-- models
|  `-- views
|  `-- modules
|  |   `-- foo
|  |       `-- controllers
|  |       `-- models
|  |       `-- views
|  |       `-- Bootstrap.php  ⇐ class Foo_Bootstrap extends Zend_Application_Module_Bootstrap
|  `-- Bootstrap.php ⇐ class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
`-- public

以上部分也可以用Zend Tool来生成:

dev:~# zf create module foo
Creating the following module and artifacts:
/var/www/jefflei/application/modules/foo/controllers
/var/www/jefflei/application/modules/foo/models
/var/www/jefflei/application/modules/foo/views
/var/www/jefflei/application/modules/foo/views/scripts
/var/www/jefflei/application/modules/foo/views/helpers
/var/www/jefflei/application/modules/foo/views/filters
Updating project profile '/var/www/jefflei/.zfproject.xml'

dev:~# zf create controller index index-action-included=1 foo

另外一些大型项目一般都会另外单独建立extension目录,运行项目之间共享common的代码,大致结构如下:

;;;;extensions?;;;;
;   extensions/
;       <extension_name>
;           application/
;               configs/
;                   ownroute.ini
;                   extension.ini
;               controllers/
;                   helpers/
;               views/
;                   filters/
;                   helpers/
;                   scripts/
;               layouts/
;                   filters/
;                   helpers/
;                   scripts/
;               models/
;           docs/
;           data/
;               indexes/
;               locales/
;               logs/
;               uploads/
;           library/
;           override_public/
;               scripts/
;               styles/
;               images/
;;;;extensions?;;;;
VN:F [1.9.22_1171]
Rating: 10.0/10 (2 votes cast)
VN:F [1.9.22_1171]
Rating: 0 (from 0 votes)

程序开发 ,

Nginx下zend framework的设置

2008年9月25日

在Linux环境下增加一段虚拟服务器的设置,设置nginx.conf如下

   server {
        listen 80;
        server_name audit.local;
        root /app/audit/public;
        access_log  /app/audit/logs/audit.access.log main;
        error_log   /app/audit/logs/audit.error.log;
        location / {
            index  index.php;
        # If file not found, redirect to Zend handling, we can remove the (if) here and go directly rewrite
            if (!-f $request_filename){
                rewrite ^/(.+)$ /index.php?$1& last;
            }
        }
        location ~* ^.+\.(js|ico|gif|jpg|jpeg|pdf|png|css)$ {
          access_log   off;
          expires      7d;
        }
        location ~ .*\.php?$ {
            fastcgi_pass   127.0.0.1:36;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }
        error_page  404             http://audit.local/error;
   }

你也可以参考apache下zend framework的设置

VN:F [1.9.22_1171]
Rating: 1.0/10 (1 vote cast)
VN:F [1.9.22_1171]
Rating: +1 (from 1 vote)

系统管理 , , ,

Zend Framework的设置(apache)

2008年9月24日
  1. 编辑C:WINDOWSSystem32driversetchosts文件,增加一个域,如127.0.0.1  audit.local
  2. 修改apache的configure文件,在xampp环境下就是在d:/xampp/apache/conf目录下,首先编辑httpd.conf,开启rewrite模块:将这行的注释去掉:LoadModule rewrite_module modules/mod_rewrite.so然后编辑extra/http-vhosts.conf文件,增加如下行:
    <VirtualHost *:80>
        DocumentRoot "D:/xampp/htdocs/"
        ServerName localhost
        ErrorLog logs/localhost.error_log
        CustomLog logs/localhost.access_log common
    </VirtualHost>
    <VirtualHost *:80>
        DocumentRoot "D:/xampp/audit/public/"
        ServerName audit.local
        ErrorLog logs/audit.error_log
        CustomLog logs/audit.access_log common
       
        RewriteEngine off
        <Location />
            RewriteEngine on
            RewriteCond %{REQUEST_FILENAME} !-f
            RewriteRule !.(js|ico|gif|jpg|jpeg|pdf|png|css)$ /index.php
        </Location>
        <directory "D:/xampp/audit/public">
    #Allow server side include,cgi, disable directory index
          Options FollowSymLinks Includes ExecCGI
          Order allow,deny
          Allow from all
        </directory>
    </VirtualHost>
    然后去掉NameVirtualHost这行的注释,重新启动apache,就可以开始使用了更多关于apache rewrite rule的写法和说明。
    如果在nginx服务器上,参考nginx下的zend framework的设置
  3. 下载zend framework并安装到php/lib目录下
  4. 建立项目的文件目录,你可以用最基本的zend framework quick start中推荐的结构,也可以直接使用我们项目使用的ZF1.6标准目录结构

此文发布时ZF的版本为1.6.1

VN:F [1.9.22_1171]
Rating: 0.0/10 (0 votes cast)
VN:F [1.9.22_1171]
Rating: 0 (from 0 votes)

程序开发 , ,