2009/12/28
Tags: pear, php
规则 1:绝不要信任外部数据或输入
关于 Web 应用程序安全性,必须认识到的第一件事是不应该信任外部数据。外部数据(outside data) 包括不是由程序员在 PHP 代码中直接输入的任何数据。在采取措施确保安全之前,来自任何其他来源(比如 GET 变量、表单 POST、数据库、配置文件、会话变量或 cookie)的任何数据都是不可信任的。
对用户输入进行清理的一个简单方法是,使用正则表达式来处理它。
规则 2:禁用那些使安全性难以实施的 PHP 设置
已经知道了不能信任用户输入,还应该知道不应该信任机器上配置 PHP 的方式。例如,要确保禁用 register_globals。如果启用了 register_globals,就可能做一些粗心的事情,比如使用 $variable 替换同名的 GET 或 POST 字符串。通过禁用这个设置,PHP 强迫您在正确的名称空间中引用正确的变量。要使用来自表单 POST 的变量,应该引用 $_POST['variable']。这样就不会将这个特定变量误会成 cookie、会话或 GET 变量。
要 检查的第二个设置是错误报告级别。在开发期间,希望获得尽可能多的错误报告,但是在交付项目时,希望将错误记录到日志文件中,而不是显示在屏幕上。为什么 呢?因为恶意的黑客会使用错误报告信息(比如 SQL 错误)来猜测应用程序正在做什么。这种侦察可以帮助黑客突破应用程序。为了堵住这个漏洞,需要编辑 php.ini 文件,为 error_log 条目提供合适的目的地,并将 display_errors 设置为 Off。
规则 3:如果不能理解它,就不能保护它
一些开发人员使用奇怪的语法,或者将语句组织得很紧凑,形成简短但是含义模糊的代码。这种方式可能效率高,但是如果您不理解代码正在做什么,那么就无法决定如何保护它。
规则 4:“纵深防御” 是新的法宝
即使使用 PHP regex 来确保 GET 变量完全是数字的,仍然可以采取措施确保 SQL 查询使用转义的用户输入。
纵深防御不只是一种好思想,它可以确保您不会陷入严重的麻烦。
网站建设
2009/11/26
Tags: pear, php, 技术文章
上周PEAR项目发布了十个稳定的包。这其中包括能标记PHP代 码和检查代码是否符合标准的PHP_CodeSniffer 0.2.0,能将类似于re2c格式的lexer文件转换为PHP5lexer格式的PHP_LexerGenerator 0.3.0,登录单元功能的Log 1.9.9 ,有多种发邮件接口的类以及其它十个包。
下面是一个详细列表:
PHP_CodeSniffer 0.2.0: 它能对PHP5脚本进行标记,并检查代码是否符合编码标准。
PHP_LexerGenerator 0.3.0: 使用一个解析器来将类似于re2c格式的lexer文件转换为PHP5 lexer格式。
PHP_ParserGenerator 0.1.2: 一个格式转换功能的类。
Selenium 0.1.5: 这是一个Selenium Rc 的PHP 客户。
Log 1.9.9: 它提供了一个出色的登录系统。
Mail 1.1.14: 它提供了一个基于PEAR库有多种接口的邮件发送类。
Text_Wiki 1.2.0RC1: 它可以将Wiki格式或BBCode格式转换为XHTML 、LateX 或纯文本格式。
HTML_QuickForm 3.2.7:它提供了一个创建,检查和处理FORM的功能
Validate_AU 0.1.0: 这是一个针对Australia的数据检查包
HTML_Menu 2.1.3: 它可以生成多样的HTML菜单
网站建设
2009/11/14
Tags: pear
go-pear.org
go-pear.org是一个WEB站点,这个站点很特殊,里面就只有一个文件,只一个单独的PHP脚本,你可以下载并且执行它。这个文件将执行最近的稳定发行包。go-pear是交互平台,可以让你你在你的服务器上面用命令行来获得PEAR。
PHP发行包里面有一个特殊的PEAR安装包,另一方面go-pear提供了一个最新稳定版的PEAR发行包。当然go-pear不知道你的目录结构,便可以计算出,来完成PEAR的安装过程。
前提:
因为go-pear是用PHP写的一个脚本,因此你必须在服务器上有一个PHP的CGI或CLI程序来执行这个脚本。默认情况下CLI程序已经随着PHP模块安装了。试着运行php v来看一下是否可用:
| PHP 5.0.0 (cli), Copyright (c) 1997-2004 The PHP GroupZend Engine v2.0, Copyright (c) 1998-2004 Zend Technologies |
注:在我的Windows平台上PHP5.1.6上面要使用php –v来执行这个命令,下面有好多命令一样。
默认情况下php命令行程序在UNIX下安装于/usr/local/bin在Windows下安装于C:\php。在Windows下PHP的CLI版程序也许叫做php-cli。
得到PEAR
如果你的PHP安装包没有包含PEAR,你可以使用go-pear做为通程序来获得PEAR。前提是你需要一个已安装的GLI或CGI版本的PHP。
你可以下载go-pear脚本并且执行它,像下面这样在命令行中执行:
$lynx sourcehttp://go-pear.org| php
这个脚本从http://go-pear.org获得脚本内容,并由PHP来执行。
如果你的系统上lynx无效,可以用其它的方法来直接获得go-pear:
$wget O-http://go-pear.org| php 使用GNUS wget
fetch ohttp://go-pear.org|php 使用fetch在FreeBSD
GET http:/go-pear.org | php 使用Perl LWP的GET工具。
在Windows平台,你可以使用PHP的URL流来获得,这个要求url_inclues在php.ini中没有被禁用。
C:\>php-cli r “include(‘http://go-pear.org’);”
还有一种就是直接用浏览器打开http://go-pear.org,把首页另存为go-pear.php然后在命令行中运行。
C:\php go-pear.php
输出也许像下面这样:
|
Welcome to go-pear!
Go-pear will install the ‘pear’ command and all the files needed by
it. This command is your tool for PEAR installation and maintenance.
Go-pear also lets you download and install the PEAR packages bundled
with PHP: DB, Net_Socket, Net_SMTP, Mail, XML_Parser, PHPUnit.
If you wish to abort, press Control-C now, or press Enter to continue:
|
注:在我的php5.1.6环境中,有一个c:\php下有go-pear.bat,我直接运行,出现选择system或local直接回车就行了。
按回车继续,出现下面的信息:
输入代理信息,如果直接上网,直接按回车就行了。
如果设置了HTTP代码环境,go-pear将检查你的http_proxy环境变量,并使用你指定的HTTPproxy来下载PEAR包,如果不是,只需要直接回车就可以了。
现在,到了最关键的地方:
Below is a suggested file layout for your new PEAR installation. Tochange individual locations, type the number in front of thedirectory. Type ‘all’ to change all of then, or simply press Enter toaccept these locations.
1. Installation prefix :/usr/local
2. Binaries directory : $prefix/bin
3. PHP code directory : $prefix/share/pear
4. Documentation base directory : $php_dir/docs
5. Data base directory : $php_dir/data
6. Tests base directory : $php_dir/tests1-
6, ‘all’ or Enter to continue: |
每一个设置都会设定一个值(prefix,bin_dir,php_dir,doc_dir,data_dir,和test_dir )
下面是这些设置的说明:
Installation prefix 你安装PEAR的根目录。下面的五个选项将使用它作为根目录。
Binaries directory. 程序和PEAR包中PHP脚本安装的地方。pear将在这里执行。记得要把这个路径加到人的PATH环境中去。
PHP code directory PHP代码安装位置。这个路径必须在php.ini的include_path中包含。
Documentation base directory文档的基本目录。,默认情况下是$php_dir/doc,每一个包的文档做为$doc_dr/Package/file来安装。
Database directory PEAR安装程序保存数据文件的地方。
Tests base directory 包旧的测试脚本安装的地方。包的名字也添加到这个路径。
当设置完这些路径,按回车确定:
| The following PEAR packages are bundled with PHP: DB, Net_Socket,Net_SMTP,Mail, XML_Parser, PHPUnit2.Would you like to install these as well? [Y/n] : |
根据配置,go-paer决定在哪里安装包,直接按回车继续:
Loading zlib: ok
Downloading package: PEAR………….ok
Downloading package: Archive_Tar……ok
Downloading package: Console_Getopt….ok
Downloading package: XML_RPC……….ok
Bootstrapping: PEAR……………….(remote) ok
Bootstrapping: Archive_Tar…………(remote) ok
Bootstrapping: Console_Getopt………(remote) ok
Downloading package: DB……………ok
Downloading package: Net_Socket…….ok
Downloading package: Net_SMTP………ok
Downloading package: Mail………….ok
Downloading package: XML_Parser…….ok
Downloading package: PHPUnit2………ok
Extracting installer………………ok
install ok:
PEAR 1.3.1install ok:
Archive_Tar 1.2install ok:
Console_Getopt 1.2install ok:
XML_RPC 1.1.0install ok:
DB 1.6.4install ok:
Net_Socket 1.0.2install ok:
Net_SMTP 1.2.6install ok:
Mail 1.1.3install ok:
XML_Parser 1.2.0install ok:
PHPUnit2 2.0.0beta2The ‘pear’ command is now at your service at /usr/local/bin/pear |
至此PEAR也就安装成功
说明一下:我自己用的是Windows系统,PHP是5.1.6
在我的PHP目录下只有一个go-pear.bat,还有一个PEAR目录,里面有一个go-pear.phar(这个应该是就是书上说的go-pear.php)
我用php C:/php/pear/go-pear.phar,倒还真执行了,
其实直接执行go-pear.bat
会出选择system或local,这个好像是为了让选择PEAR的安装配置,好像是可以装多个
直接回车后就到配置PEAR的环境的地方了,估计这里是做一下确认吧
我的确认后就直接开始安装了
但安装完后DB,XML_parser等都没装上去
我是自己招待命令 pear install DB命令安装上去的
安装成功后会在C:/php目录下产生一个pear.bat,这个文件就是pear程序,好多操作都要通过这个程序来完成。
另外就是要修改php.ini中的include_path!1!!!!
Tags: pear
原文:PHP5 Power Programming Chapter 10 . Using PEAR
PEAR是PHP的官方开源类库, PHP Extension and Application Repository 的缩写。Pear在英文中是梨子的意思。PEAR将PHP程序开发过程中常用的功能编写成类库,涵盖页面呈面、数据库访问、文件操作、数据结构、缓存操 作、网络协议等许多方面,用户可以很方便地使用。PEAR的大部分Package采用LGPL、PHP、BSD许可证,可以自由地使用源码。关于PEAR 更详细的信息,请访问pear.php.net。
“不要重复发明轮子!”PEAR是为PHP代码的重用而开发的。使用PEAR可以大大提高PHP程序的开发效率。前人已经完成的工作,我们可以直接使用,不需要重复开发,更可以保证开发代码的质量。
PEAR概念
首先介绍一个PPEAR的一些概念,即packages , releases和versioning scheme
Packages
当你从PEAR安装一些东西,就得去下载和安装一些特殊的 发行包。每一包都包含下面的信息:
包名称 例如:HTML_QuickForm
概要,描述,和主页的URL
一个或多个的维护人员
License信息
许多发行版本
Pear包和其它包(如:Linux的RPM ,Debian包,System V UNIX PKG格式)是不一样的。一个最主要的区别是PEAR包是基于多个平台设计的,不是为了一种操作系统设计的,大部分PEAR包是平台无关性的,PEAR包可以安装在支持PHP的任何平台上,包括现在流行的类UNIX系统和微软的Windows,以及苹果的MacOS X.
Releases
像PHP一样,PEAR的代码连同安装指令一起压缩到一个tar.gz或者zip文件中。PEAR包也同样是通过tar.gz(或tgz)文件来发布的,里面包含了可以被PEAR安装程序读取的安装指令。
除了这个包的细节内容外,每一个发行包都包含:
版本号
文件列表和安装指令
发行版别(stable,beta ,alpha , devel ,或者snapshot)
在安装PEAR包时,默认是安装最近稳定的发行包,例如:
| $ pear install XML_Parserdownloading XML_Parser-1.1.0.tgz …Starting to download XML_Parser-1.1.0.tgz (7,273 bytes)…..done: 7,273 bytesinstall ok: XML_Parser 1.1.0 |
通过执行命令:pear installXML_Parser,可以来安装最近的稳定的确良XML_Parser包,例子中的版本为 1.1。
为什么不把PEAR包做成像RPM包一样有多种原因,最主要的原因是,PHP是可以在各个平台上运行的,所以PEAR包也得要在各个平台上运行,这就意味 着要做一个RPM包在Windows下,Darwiin下都可以运,这个工作量是很大的,因此最佳的选择就是用PHP来执行安装程序来在各个平台上运行是 最方便的, 也是最简单的。
Version Nubmers
Version Number Format 版本号格式
PEAR一般由三个数字和一些特殊字符组成。语法如下:
| Major [ . minor [ . patch ]] [ dev | a | b | RC | pl [ N ]] |
下面是一些例子:
|
Version String
|
Major Version
|
Minor Version
|
Patch Level
|
ReleaseState‘
|
|
1
|
1
|
|
|
|
|
1b1
|
1
|
|
|
b1
|
|
1.0
|
1
|
0
|
|
|
|
1.0a1
|
1
|
0
|
|
a1
|
|
1.2.1
|
1
|
2
|
1
|
|
|
1.2.1dev
|
1
|
2
|
1
|
dev
|
|
2.0.0-dev
|
2
|
0
|
0
|
dev
|
|
1.2.1RC1
|
1
|
2
|
1
|
RC1
|
大多数PEAR包的版本号是由二个或三个数字加上一些发行状态部分,例如:”b1”
下面是一个发行状态的列表:
|
额外的
|
说明:
|
|
Dev
|
实验中,用于测试的发行版本
|
|
A
|
第一个版本,不是最终的,也许有许多BUG,并且很多API不是最终的.
|
|
B
|
第二个版本;API或多或少的稳定,但仍有一些BUG。.
|
|
RC
|
Release candidate;如果这个发行版没有问题,那么RC版将会再发行,成为最终的版本。
|
|
Pl
|
Patch level;在发行版本后做的一些修改,但不是经常的。
|
Comparing Version Numbers
有时候要对二个PEAR发行包进行比较以确定哪一个包比较新。例如,运行pear list-upgrades命令时,你安装的包的版本号将与pear.php.net上面的最新包的版本号进行比较,来确定哪一个是新的。
这个比较过程,首先是从major版本开始的,如果A的major版本号大于B,那么A比B新。如果major相同,那么minor版号将用同样的方法比较,但是如果只有B拥有minor版本号,那么B将比A新。如果A与B的minor版本号也相同,patch level将用同样的方法比较,如果patch level也相同,那么发行状态将决定结果。
比较extra段是很麻烦的事情,如果A没有extra段,而B有,不能自动的认为B是新的。dev , a ,b , RC,被认为比没有extra段旧,而pl (patch level )被认为是新的。
下面是一版本比较例子:
|
Version A
|
Version B
|
Newest?
|
Reason?
|
|
1.0
|
1.1
|
B
|
B有比较大的minor版本号
|
|
2.0
|
1.1
|
A
|
A有比较大的major版本号.
|
|
2.0.1
|
2.0
|
A
|
A有 patch level; B 没有.
|
|
2.0b1
|
2.0
|
B
|
A “beta”发行状态 “老于” 没有发行状态.
|
|
2.0RC1
|
2.0b1
|
A
|
RC比beta新在major.minor相同时.
|
|
1.0
|
1.0.0
|
B
|
这个很微妙,加了一个位让版本更新
|