php

知识博客专集

Win7系统环境安装配置PHP开发环境 4


四、phpmyadmin安装

版本解释:phpmyadmin-3.2.5

选择版本:phpmyadmin-3.2.5-all-languages.zip

下载地址:http://www.phpmyadmin.net/home_page/downloads.php

1.安装说明

解压到d:\\wamp\\phpmyadmin

2.修改配置

打开d:\\wamp\\phpmyadmin\\libraries\\config.default.php

&cfg[\'pmaabsoluteuri\'] = ”;

修改成(填写访问phpmyadmin的绝对url):&cfg[\'pmaabsoluteuri\'] = ‘http://localhost/phpmyadmin/’;

&cfg[\'servers\'][&i][\'host\'] = ‘localhost’;

修改成(填写服务器地址,通常默认,不需要修改):&cfg[\'servers\'][&i][\'host\'] = ‘localhost’;

&cfg[\'servers\'][&i][\'user\'] = ‘root’;

修改成(填写mysql用户名,这里我们默认):&cfg[\'servers\'][&i][\'user\'] = ‘root’;

&cfg[\'servers\'][&i][\'password\'] = ”;

修改成(填写mysql密码):&cfg[\'servers\'][&i][\'password\'] = ‘mysql pwd;

&cfg[\'servers\'][&i][\'auth_type\'] = ‘cookie’;

修改成(设置认证方法,安全因素考虑,填写成cookie):&cfg[\'servers\'][&i][\'auth_type\'] = ‘cookie’;

&cfg[\'blowfish_secret\'] = ”;

修改成(设置短语密码,如果上面设置成cookie,那这里不能留空,不然登陆会提示错误):&cfg[\'blowfish_secret\'] = ‘cookie’;

3.测试

打开浏览器输入:http://localhost/phpmyadmin/ 访问和登陆

五、结尾

至此windows7下的php环境搭建完毕,大家尽情的使用吧。

Win7系统环境安装配置PHP开发环境 3


三、php安装

版本解释:vc9 专门为iis定值的脚本,使用visual studio 2008编译器编译,支持最新的微软组建,从而提高效率。

vc6 是为了其他web服务软件提供的脚本 如 apache。

thread safe 现成安全,之星时会进行线程 安全检查,以防止有心要求就启动新线程(thread)的cgi执行方式而耗尽系统资源。

non thread safe是非线程安全,在执行时不进行线程(thread)安全检查

选择版本:php5.3(5.3.1)中vc6 x86 thread safe下 zip下载

下载地址:http://windows.php.net/download/

1.安装说明

由于我们下载的的是zip压缩包,只需要将文件解压到“d:\\wamp\\php”目录下即可

2.修改配置

将e:\\wamp\\php\\php.ini-development 文件修改成php.ini

打开php.ini

; extension_dir = “ext”

修改成:extension_dir = “e:\\wamp\\php\\ext”

将947行下,这些文件前面的“;”去除

extension=php_curl.dll

extension=php_gd2.dll

extension=php_mbstring.dll

extension=php_mysql.dll

extension=php_mysqli.dll

extension=php_pdo_mysql.dll

extension=php_xmlrpc.dll

;date.timezone =

修改成(很多网站没提到这里要修改,默认为美国时间,如果不修改会报错):date.timezone = asia/shanghai

3.测试

重启apache(修改过配置文件 必须重启apache才会生效)

新建个index.php 页面,代码中输入,保存文件放到“d:\\wmap\\www\\”目录下

打开浏览器输入:http://localhost/index.php 如果能正常显示,说明php配置完毕,可以查看该页面的php信息是否正确。

(注:在改文件中输入函数可输出大量的有关php当前状态的信息,如php版本,服务器信息和环境等。)

(注:)

接着我们测试下,是否能连接到mysql

再新建个link.php,下代码中输入

&link=mysql_connect(“127.0.0.1″,”root”,”mysql安装时填写的密码”);

if(!&link) echo “mysql数据库连接失败!”;

else echo “mysql数据库连接成功!”;

mysql_close();

?>

也保存文件放到“d:\\wmap\\www\\”目录下

打开浏览器输入:http://localhost/link.php 查看

(责任编辑 大可)

Win7系统环境安装配置PHP开发环境 2


二、mysql安装

版本解释:the essentials package:不包含 embedded server and benchmark suite,有自动安装程序和配置向导,没有mysql documentation。

the complete package:包含 embedded server and benchmark suite,有自动安装程序和配置向导,有mysql documentation。

the noinstall archive:包含 embedded server and benchmark suite,没有自动安装程序和配置向导,有mysql documentation。

选择版本:mysql-essential-5.1.44-win32.msi

下载地址:http://www.mysql.com/downloads/mysql/

1.安装说明:

打开安装程序,单击“next”

选择custom,组件为默认选择,我们不做改动-“next”

路径设置为“d:\\wamp\\mysql”-“next”

安装好以后点击“finish”

跟着会出现一个配置向导-“next”

选择“detailed configuration(详细配置)”-“next”

这里有3个选项:

developer machine,将只用尽量少的内存;

server machine,将使用中等数量内存;

dedicated mysql server machine,这台服务器上面只跑mysql数据库,将占用全部的内存。

可以根据自己需求选择,这里我们选择第二种“server machine”-“next”

选择数据库用途,同样有3个选项:

mutltifunctional database多功能用途,将把数据库优化成很好的innodb存储类型和高效率的myisam存储类型;

transactional database only只用于事务处理类型,最好的优化innodb,但同时也支持myisam;

non-transactional databse only非事务处理类型,适合于简单的应用,只有不支持事务的myisam类型是被支持的。

一般选择第一种多功能的,同样我们也是。-“next”

选择innoddb的数据存放位置,一般默认就行,为了统一我填写了“wamp/mysql datafiles”-“next”

选择mysql允许的最大连接数,第一种是最大20个连接并发数,第二种是最大500个并发连接数,最后一种是自定义,自己可以根据需求选择,我选择第二个-“next”

下面是选择数据库监听的端口,一般默认是3306,如果改成其他端口,以后连接数据库的时候都要记住修改的端口,否则不能连接mysql数据库,比较麻烦,这里不做修改,用mysq的默认端口:3306-“next”

这一步设置mysql的默认编码,我们选择第三个,并在character set菜单中,选择“gbk”编码-“next”

(注:如果要用原来数据库的数据,最好能确定原来数据库用的是什么编码,如果这里设置的编码和原来数据库数据的编码不一致,在使用的时候可能会出现乱码。)

这一步是是否要把mysql设置成windows的,一般选择设成服务,这样以后就可以通过服务中启动和关闭mysql数据库。下面的复选框也勾选上,这样,在cmd模式下,不必非到mysql的bin目录下执行命令。也就是把上下2个勾都打上,中间默认-“next”

这一步是设置mysql的超级用户密码,这个超级用户非常重要,对mysql拥有全部的权限,请设置好并牢记超级用户的密码,下面有个复选框是选择是否允许远程机器用root用户连接到你的mysql服务器上面,如果有这个需求,也请勾选。这里我们使用默认选择,在new root password和confirm中输入密码。“next”

点击“execute”进行配置,稍微等待一会,圆点上的勾全部打上,就代表配置完毕。

2.修改配置:

打开d:\\wamp\\mysql\\my.ini

设置datadir为d:/wamp/mysql/data/或你所要存放数据位置的目录即可。

(责任编辑 大可)

让Windows主机在IIS支持PHP和MySQL


  一、首先把php的压缩包(这里以php4.3.2为例)解压到c:\\php-4.3.2-win32目录中,然后从其中找到一个叫php.ini-recommended的文件,把他更名为php.ini。
  
  二、打开该文件,找到extension_dir="./",将其改为extension_dir="c:\\php-4.3.2-win32\\extensions";再找到session.save_path=/tmp,将其改为session.save_path=c:\\php-4.3.2-win32\\sessions。(注:此时你需要在c:\\php-4.3.2-win32目录下建立sessions文件夹,以存放session。)
  
  三、将修改好的php.ini文件拷贝至c:\\winnt目录下,将c:\\php-4.3.2-win32下的php4ts.dll文件拷贝到c:\\winnt\\system32目录下。

  四、打开“internet服务管理器”,选择你想支持php的站点,打开属性页,点击“isapi筛选器”选项卡,点击“添加”,在弹出的“筛选器属性”窗口的“筛选器名称”中填入“php”;在“可执行文件”中填入“c:\\php-4.3.2-win32\\sapi\\php4isapi.dll”,点击确定。

  五、点击“主目录”选项卡,选择“应用程序设置”中的“配置”按钮,在弹出的“应用程序配置”窗口中点击“添加”按钮,在弹出的“添加/编辑应用程序扩展名映射”窗口中的“可执行文件”中填入“c:\\php-4.3.2-win32\\sapi\\php4isapi.dll”,“扩展名”一项填入“php”(如下图所示)。
  
  ok,一切搞定,重起iis,到你的页面文件目录下写一个phpinfo。
  
  phpinfo();
  
  1、mysql的安装双击文件解压,双击setup.exe安装,默认路径为c:\\mysql。
  
  在c:\\mysql下有一个文件my-example.cnf改名为my.cnf拷贝到c:\\下面.
  
  2、phpmyadmin的安装双击文件解压到c:\\phpmyadmin.
  
  用phped把c:\\phpmyadmin下的config.inc.php3打开,把第65行的“require("english.inc.php3");”改为“require("chinese_gb.inc.php3");”。
  
  现在你的iis已经完全支持php mysql了
  
  注:mysql不需任何设置,直接安装即可

PHP转换IP地址到真实地址


生在红旗下长在春风里,长期浸泡在河蟹社会里面所以久而久之就有了一些河蟹的思维方式,正好有一段时间在做一个.net的网站访问统计系统,顺便想着怎么“监视”下每一个留言的博主们的所在地,于是就有了如今下图所示的根据获取到的留言者的ip地址得到留言者所在的地区,当然并没有河蟹社会监视人民群众的意思,纯属了解一下各位博主所在的真实地点,万一是个美女博主不就可以让我有线索可循。

想要把ipv4地址转为真实的地址,肯定要参考ip数据库,商业的ip数据库存储在关系型数据库中,查询和使用都非常方便,但是成本不是个人和小公司愿意承受的,所以简单应用的思路就是利用一些免费的ip数据库或者一些大网站提供的查询api,他们的数据量足够我们使用了。

1. 利用纯真ip数据库

利用本地的qqwry.dat文件(搜索下载一个qqwry.dat 文件放到你的wordpress主题根目录下),优点是查询速度非常快,缺点是数据库文件要放在自己的空间内并且要偶尔更新数据库。时间关系废话不多说,下面是使用这个文件的函数,如果是在wordpress里面使用这个功能,把下面的代码写入主题下面的functions.php里面,然后在comments-list的输出<?php echo convertip(get_comment_author_ip()); ?>即可。仅管理员可见话,则调用代码<?php if ( is_user_logged_in() ) echo convertip(get_comment_author_ip()); ?>即可如果是其他程序引用,输入一个有效的ipv4地址就可以得到一个真实的地址。

如何对PHP程序中的常见漏洞进行与防护?nbsp文件怎么打开


  虚拟专用网络vpn(virtualprivatenetwork)能通过公用网络internet建立一个临时的、安全的连接,是一条穿过混乱的公用网络的安全、稳定的隧道。vpn是对企业内部网的扩展,它可以帮助远程用户、公司分支机构、商业伙伴及供应商同公司的内部网建立可信的安全连接,并数据的安全传输。许多公司使用vpn向公司外部的员工提供企业网络接如何对php程序中的常见漏洞进行与防护?nbsp文件怎么打开入。本手册将围绕vpn进行全方位的。

  但是值得说明的是,php有四个不同的数组变量用来处理用户的输入。http_get_vars数组用来处理get方式提交的变量,http_post_vars数组用于处理post方式提交的变量,http_cookie_vars数组用于处理作为cookie头提交的变量,而对于http_post_files数组(比较新的php才提供),则完全是用户用来提交变量的一种可选方式。用户的一个请求可以很容易的把变量存在这四个数组中,因此一个安全的php程序应该检查这四个数组。

  然后php程序开始处理根据“&hello”指定的文件,问题在于“&hello”不一定是一个php设置的变量,任何远程用户都可以指定它。如果我们使用下面的方式:

  file():把整个文件内容读到一个数组中

  下面是一个很明显的例子:

  正如我们前面讨论的那样,include()和require()主要是为了支持代码库,因为我们一般是把一些经常使用的函数放到一个的文件中,这个的文件就是代码库,当需要使用其中的函数时,我们只要把这个代码库包含到当前的文件中就可以了。

  文章主要从全局变量,远程文件,文件上载,库文件,session文件,数据类型和容易出错的函数这几个方面分析了php的安全性。女性性冷淡的治疗方法,并且对如何增强php的安全性提出了一些有用的。

  php自动支持基于rfc1867的文件上载,我们看下面的例子:

  因此,者可以发送任意文件给运行php的主机,在php程序还没有决定是否接受文件上载时,文件已经被存在服务器上了。

  事实上,当一个session启动时(实际上是在配置文件中设置为在第一次请求时自动启动),就会生成一个随机的“sessionid”,如果远程浏览器总是在发送请求时提交这个“sessionid”的话,session就会一直保持。这通过cookie很容易实现,也可以通过在每页提交一个表单变量(包含“sessionid”)来实现。php程序可以用session注册一个特殊的变量,它的值会在每个php脚本结束后存在session文件中,也会在每个php脚本开始前加载到变量中。下面是一个简单的例子:

  php4或更新的版本提供了对sessions的支持,它的主要作用是在php程序中保存页与页之间的状态信息。例如,当一个用户登陆进入网站,他登陆了这个事实以及谁登陆进入这个网站都被保存在session中,当他在网站中到处浏览时,所有的php代码都可以获得这些状态信息。

  最初,人们开发和发布php程序的时候,为了区别代码库和主程序代码,一般是为代码库文件设置一个“.inc”的扩展名,但是他们很快发现这是一个错误,因为这样的文件无法被php解释器正确解析为php代码。如果我们直接请求服务器上的这种文件时,我们就会得到该文件的源代码,这是因为当把php作为apache的模块使用时,php解释器是根据文件的扩展名来决定是否解析为php代码的。扩展名是站点管理员指定的,一般是“.php”,“.php3”和“.php4”。如果重要的配置数据被包含在没有合适的扩展名的php文件中,那么远程者很容易得到这些信息。

  很显然,这会显示一个文本框和提交按钮。当用户点击提交按钮时,“test.php”会处理用户的输入,当“test.php”运行时,“&hello”会包含用户在文本框输入的数据。从这里我们应该看出,者可以按照自己的意愿创建任意的全局变量。如果者不是通过表单输入来调用“test.php”,而是直接在浏览器地址栏输http://server/test.php?hello=hi&setup=no,那么,不止是“&hello”被创建,“&setup”也被创建了。

  例如:

  我们在分析php程序中的漏洞时,如果能够拿到源代码的话,那么一份容易出错的函数列表则是我们非常需要的。如果我们能够远程改变这些函数的参数的话,那么我们就很可能发现其中的漏洞。下面是一份比较详细的容易出错的函数列表:

  的表单数据正好满足了php程序所期望的变量,但是这时php程序不再处理上载的文件,而是处理“/etc/passwd”(通常会导致内容)。这种可以用于任感文件的内容。

  [容易出错的函数]

  获得执行任意指令的能力之后,者显然想提升权限或者是扩大战果,而这又需要一些服务器上没有的工具集,而文件上载又一次帮了我们这个忙。者可以使用文件上载功能上载工具,怎么治疗便秘\”把她们存在服务器上,然后利用他们执行指令的能力,使用chmod()改变文件的权限,然后执行。例如:者可以绕过防火墙或ids上载一个本地root程序,然后执行,这样就获得了root权限。

  的代码假定如果“&session_auth”被置位的话,就是从session,而不是从用户输入来置位的,如果者通过表单输入来置位的话,他就可以获得对站点的访问权。注意者必须在session注册该变量之前使用这种方法,一旦变量被放进了session,就会覆盖任何表单输入。

  开发程序的时候应该仔细地考虑的问题,例如,我们不应该在一个地方测试某个变量是否为“0”,而在另外的地方使用empty()来验证。

  [全局变量]

  最简单的解决方法就是给每个文件都指定一个php文件的扩展名,这样可以很好的防止泄露源代码的问题,但是又产生了新的问题,通过请求这个文件,者可能使本该在上下文中运行的代码运行,这可能导致前面讨论的全部。

  高难度

  session机制也为者把自己的输入保存在远程系统的文件中提供了另一个方便的地方,对于的例子来说,者需要在远程系统放置一个包含php代码的文件,如果不能利用文件上载做到的话,他通常会利用session为一个变量按照自己的意愿赋一个值,然后猜测session文件的,而他知道文件名是“php<sessionid>”,所以只需猜测目录,而目录一般就是“/tmp”。

  如果者可以控制“&theme”的话,很显然它可以利用“&theme”来读取远程系统上的任件。者的最终目标是在远程服务器上执行任意指令,但是他无法使用远程文件,因此,他必须得在远程服务器上创建一个php文件。这乍看起来好象是不可能的,但是文件上载帮了我们这个忙,如果者先在本地机器上创建一个包含php代码的文件,然后创建一个包含名为“theme”的文件域的表单,最后用这个表单通过文件上载把创建的包含php代码的文件提交给的代码,php就会把者提交的文件保存起来,并把“&theme”的值设置为者提交的文件,这样file_exists()函数会检查通过,者的代码也将执行。

  低难度

  [远程文件]

  让我们考虑一下处理文件上载的php程序,正如我们说的,文件被接收并且存在服务器上(是在配置文件中指定的,一般是/tmp),扩展名一般是随机的,类似“phpxxuoxg”的形式。php程序需要上载文件的信息以便处理它,这可以通过两种方式,一种方式是在php3中已经使用的,另一种是在我们对以前的方法提出安全公告后引入的。

  的分类只是个人的看法,但是我可以,如果你使用了php提供的所有选项的话,那么你的php将是很安全的,即使是第三方的代码也是如此,因为其中很多功能已经不能使用。

  例如:

  然后把“&libdir”设置为/>http://<;evilhost>/”,这样我们就可以在目标主机上执行的代码,“/etc”目录的内容作为结果返回到客户的浏览器中。

  需要注意的是,服务器(也就是evilhost)应该不能执行php代码,否则代码会在服务器,而不是目标服务器执行,如果你想了解具体的技术细节,请参考http://www.securereality.com.au/sradv00006.txt

  [文件上载]

  表面看起来是正确的,而且我们中有相当一部分人是这样做的,但是这段代码犯了想当然的错误,它假定“&auth”在没有设置值的时候是空的,却没有想到者可以创建任何全局变量并赋值,通过类似http://server/test.php?auth=1”的方法,我们完全可以这段代码,使它相信我们是已经认证过的。

  这个选项会php为用户输入创建全局变量,也就是说\”治疗便秘的最佳方法\”,如果用户提交表单变量“hello”,php不会创建“&content hello”,而只会创建“http_get/post_vars[hello]”。这是php中一个极其重要的选项,关闭这个选项,会给编程带来很大的不便。

  “最佳实践”来自英文bestpractice。对最佳实践的定义是一个管理学概念,认为存在某种技术、方法、过程、活动或机制可以使生产或者管理实践的结果达到最优,并减少出错的可能性。学习应用it企业安全的最佳实践,其实就是借鉴别人成功的经验,让自己在企业安全方面少走弯。在本手册中,将集合it业内关于企业安全的最佳实践,并不断更新,以期在企业安全防护方面提供帮助。

  session数据一般是保存在文件中(是可配置的,一般是“/tmp”),文件名一般是类似“sess_<sessionid>”的形式,这个文件包含变量名称,变量类型,变量值和一些其它的数据。在多主机系统中,因为文件是以运行web服务器的用户身份(一般是nobody)保存的,因此恶意的站点拥有者就可以通过创建一个session文件来获得对其它站点的访问,甚至可以检查session文件中的信息。

  作为文件上载的方法的一个变种,我们看一下下面的一段代码:

  因此,为了提高php程序的安全性,我们不能相信任何没有明确定义的变量。如果程序中的变量很多的话,这可是一项非常艰巨的任务。

  新版本的php都会自动把“&session_auth”的值设置为“shaun”,如果它们被修改的话,以后的脚本都会自动接受修改后的值,这对无状态的web来说的确是种很不错的工具,但是我们也应该小心。

  这个选项可以指定目录之外的文件操作,有效地消除了本地文件或者是远程文件被include()的,但是仍需要注意文件上载和session文件的。

  则的代码实际上是利用主机target上的unicode漏洞,执行了dir命令。

  我在介绍的所有对于缺省安装的php4都可以很好的实现,但是我已经重复了很多次,php的配置非常灵活,通过配置一些php选项,我们完全可能抵抗其中的一些。下面我按照实现的难度对一些配置进行了分类:

  一种常用的方式就是检查数组http_get[]或post_vars[]中的变量。便秘百科:老年人便秘原因和老年便秘营养食疗-,这依赖于我们的提交方式(get或post)。当php配置为打开“track_vars”选项的话(这是缺省值),用户提交的变量就可以在全局变量和提到的数组中获得。

  的代码首先检查用户的密码是否为“hello”,如果匹配的话,设置“&auth”为“1”,即通过认证。之后如果“&suth”为“1”的话,就会显示一些重要信息。

  注:这两种方法也就是我们通常说的“post”和“get”方法。

  的代码让用户从本地机器选择一个文件,当点击提交后,文件就会被上载到服务器。这显然是很有用的功能,但是php的响应方式使这项功能变的不安全。当php第一次接到这种请求,甚至在它开始解析被调用的php代码之前,它会先接受远程用户的文件,检查文件的长度是否超过“&max_file_sizevariable”定义的值,如果通过这些测试的话,文件就会被存在本地的一个临时目录中。

  由于原文比较长,而且有相当一部分是介绍文章的背景或php的基础知识,没有涉及到php安全方面的内容,因此我没有翻译。如果你想了解这方面的知识,请参考原文。

  [如何增强php的安全性]

  [数据类型]

  很显然,基于php的应用程序的主函数一般都是接受用户的输入(主要是表单变量,上载文件和cookie等),然后对输入数据进行处理,然后把结果返回到客户端浏览器。为了使php代码访问用户的输入尽可能容易,实际上php是把这些输入数据看作全局变量来处理的。

  一个很明显的问题就是确保变量的确来自session,例如,给定的代码,如果后续的脚本是下面这样的话:

  但是,我们可以肯定的说,问题还是存在的,大多数php程序还是使用老的方式来处理上载文件。php设置了四个全局变量来描述上载文件,比如说的例子:

  例如:

  黑客策略和技术一直都在进步。黑客还在继续开发新的工具和黑客方法,来恶意访问系统并你的网络,\”中医中药养生保健之道茶这样企业在开发和采取恰当的方法防御黑客的就变得非常困难。《黑客技术和策略》的技术指南将介绍黑客的内心想法,并帮助你理解恶意者的动机,也提供了一些黑客具体信息的方式,采用的方法以及企业应该采用的数据的方法。这里将会提供大量黑客技术和策的信息,例如允许黑客获取网络系统或者文件访问的系统特征探测。

  我在前面已经说了,新版本的php使用http_post_files[]来决定上载文件,同时也提供了很多函数来解决这个问题,例如有一个函数用来判断某个文件是不是实际上载的文件。这些函数很好的解决了这个问题,但是实际上肯定有很多php程序仍然使用旧的方法,很容易受到这种。

  就导致了下面的php全局变量(当然post方式也可以(甚至是cookie)):

  php中的数组是关联数组,也就是说,数组的索引是字符串型的。这意味着“&hello[000]”和“&hello[0]”也是不同的。

  注:其实这份列表还不是很全,比如“mail()”等命令也可能执行命令,所以需要自己补充一下。

  这使得支持远程文件的include(),require(),include_once()和require_once()在上下文中变得更有趣。这些函数主要功能是包含指定文件的内容,并且把它们按照php代码解释,主要是用在库文件上。

  php具有比较松散的数据类型,变量的类型依赖于它们所处的上下文。例如:“&hello”开始是字符串变量,值为“”,但是在求值时,就变成了整形变量“0”,这有时可能会导致一些意想不到的结果。如果“&hello”的值为“000”还是为“0”是不同的,empty()返回的结果也不会。

  假如你正在寻找一个漏洞扫描器,你可能已经遇到了大量的非常昂贵的商业解决方案,这些方案都有一长串的性能和优点。不幸的是,如果你和我们之中大部分人的情况一样的话,你一般根本没有运行这些奇特的系统的预算。你可能已经退而求其次,转向考虑使用像satan或saint的免费工具。然而,你可能觉得使用这些工具是一种折衷的办法,因为它们的性能设置不能与商业解决方案相比。这时候你就应该学会使用nessus!2005年12月nessus背后的公司tenablenetworksecurityinc.发布了nessus3,引进了对该产品的全面检查。在写这篇文章时候的最近版本,nessus3.2是在2008年3月发布的。nessus现在可以在多种平台上使用,包括windows、各种版本的linux、freebsd、solaris和macosx。以下是这次nessus3中的重大变化:下面将介绍如何使用nessus工具以及nessus工具的更新。

  nbsp文件怎么打开上例中“&libdir”一般是一个在执行代码前已经设置好的径,如果者能够使得“&libdir”没有被设置的话,那么他就可以改变这个径。但是者并不能做任何事情,因为他们只能在他们指定的径中访问文件languages.php(perl中的“poisonnullbyte”对php没有作用)。但是由于有了对远程文件的支持,者就可以做任何事情。例如,者可以在某台服务器上放一个文件languages.php,包含如下内容:

  虚拟化是数据中心的流行技术,它起源于20世纪60年代。它是把昂贵的计算机资源的利用最大化的方式。典型的服务器的利用率不足40%,虚拟化可以更有效地利用技术资源,并节约固定费用。虚拟化的最大优势是,它允许管理员从中央区域为个人电脑和客户设备提供软件。虚拟化不需要管理员对一般任务进行分别考虑。服务器的关机可以带动多用户的关机。

  的脚本试图打开文件“&filename”,如果失败就显示错误信息。很明显,如果我们能够指定“&filename”的话,就能利用这个脚本浏览系统中的任件。但是,这个脚本还存在一个不太明显的特性,那就是它可以从任何其它web或ftp站点读取文件。实际上,php的大多数文件处理函数对远程文件的处理是透明的。

  php中的变量不需要事先声明,它们会在第一次使用时自动创建,它们的类型也不需要指定,它们会根据上下文自动确定。从程序员的角度来看,这无疑是一种极其方便的处理方法。很显然,这也是快速开发语言的一个很有用的特点。一旦一个变量被创建了,就可以在程序中的任何地方使用。这个特点导致的结果就是程序员很少初始化变量,毕竟,当它们第一次创建时,他们是空的。

  php是一种具有丰富特性的语言,提供了大量的函数,使编程者实现某个功能很容易。但是从安全的角度来看,功能越多,要它的安全性就越难,远程文件就是说明这个问题的一个很好的例子:

  如何对php程序中的常见漏洞进行与防护?nbsp文件怎么打开,好了,废话少说,我们言归正传!

  这里我就不讨论利用文件上载来对服务器进行dos的可能性了。

在win32下用vs2008编译php扩展


  首先要下载php源代码及windows下的二进制压缩包(需要解压开后并正确配置php.ini,甚至apache),因为在编译扩展的过程中我们需要二进制压缩包里的dev/php5ts.lib文件(提示:此文件可在你本地服务器环境的php的目录下的dev目录中找到,注意php5ts.lib版本最好与你下载的源码包版本一致,避免后续的一些问题)。接着使用php源代码目录下的ext/ext_skel_win32.php来生成扩展的骨架类。但ext_skel_win32.php中说要使用cygwin,但我机器上没有装cygwin,另外发现其中实际上只使用到了sh,而我机器上装的msys里也有sh,应该可以用的吧,于是就将ext_skel_win32.php中的&cygwin_path变量设置成了msys的bin目录

  然后设置环境变量,将解压开的php二进制包目录(包含php.exe的)以及msys的bin目录加入到path环境变量中。在控制台切换到php源码ext目录下执行ext_skel_win32.php脚本以生成骨架类:

  还要将

  也括起来

  设置工程属性页中的c ->代码生成->运行库改为多线程dll(/md),将c ->高级->编译为改为编译为c 代码(/tp),链接器->附加库目录加一项php二进制包的dev目录。

  处理完这些后,还要修改php源码中zend/zend.h,将

  移动到

  q1:如果在编译时遇到这样的警告

  这是因为路径设置的问题,本人对vs2008不太熟悉,在同事帮助下解决这个问题:

  设置工程属性页-》链接器-》输入-》附加依赖项把php5ts.lib设置成绝对路径后,

  再编译即可成功!

  ,意思是说webserver不支持多线程,本人在集成套件wamp和xampp下测试,

  环境分别为,

  (mysql和其它的就不说了,测试扩展用不着就省了。)

  在wamp环境中,webserver未能通过,命令行通过

  php在xampp环境中,webserver通过,命令行通过,但是当在php脚本中,使用dl函数加载扩展时,

  这时webserver就会提示不支持多线程警告,由此可见,phpv5.2.9以下版本dl在webserver下是不支持多线程的,不知道更高版本是否支持,没测试过。

  说得有不对的地方请高手指点!

 

php模拟提交之curl


http://www.forasp.cn

php有用页面模拟post提交方式,设置好对应的参数后直接运行则模拟提交对应的数据,并输出提交给对应页面的结果.模拟提交有两种一种是curl,另一种是fsockopen方式,本次讲一下curl方式.

&curlobj=curl_init();函数的作用初始化一个curl会话,curl_init()函数唯一的一个参数是可选的,表示一个url地址。
curl_setopt_array(&curlobj,&array);以数组的形式为一个curl设置会话参数
curl_setopt(&curlobj,参数,值);为一个curl设置会话参数
curl_exec(&curlobj)函数的作用是执行一个curl会话,唯一的参数是curl_init()函数返回的句柄。
curl_close(&curlobj)函数的作用是关闭一个curl会话,唯一的参数是curl_init()函数返回的句柄。
&newcurl_obj=curl_copy_handle(&curlobj) — 拷贝一个curl连接资源的所有内容和参数
&errnum=curl_errno(&curlobj)返回一个包含当前会话错误信息的数字编号,如果没有出现错误返回0
&errmsg = curl_error(&curlobj);返回一个包含当前会话错误信息的字符串,如果没有错误则返回空
&array = curl_getinfo(&curlobj)获取一个curl连接资源句柄的信息
单个举例:index.php
<?php
&ch = curl_init();
curl_setopt(&ch,curlopt_autoreferer,"http://www.forasp.cn/");
curl_setopt(&ch,curlopt_url,"http://localhost/forasp.php");
curl_setopt(&ch,curlopt_postfields,"weburl=forasp.cn");
curl_exec(&ch);
curl_close(&ch);
?> 在forasp.php代码<?php echo &_post["weburl"];?> 运行index.php代码会输出forasp.cn
批处理会话的时候
curl_multi_init();初始化一个curl批处理句柄资源
curl_multi_add_handle(&curlmultiobj,&curlobj);向curl批处理会话中添加单独的curl句柄资源
curl_multi_close(&curlmultiobj);关闭一个批处理句柄资源
curl_multi_exec(&curlmultiobj,&flag);解析一个curl批处理句柄(第一个参数是批处理,第二个是是否正在执行)
curl_multi_getcontent — 返回获取的输出的文本流
curl_multi_info_read(&curlmultiobj,[int]);获取当前解析的curl的相关传输信息(第一个参数是批处理,第二个是可选数字指剩余的会话)
curl_multi_remove_handle(&curlmultiobj,&curlobj)移除curl批处理句柄资源中的某个句柄资源 (第一个参数是所属批处理,第二个是批处理中的某个会话
curl_multi_select — get all the sockets associated with the curl extension, which can then be "selected"
批处理举例:
<?php
&ch1 = curl_init();//建立两个curl会话
&ch2 = curl_init();
//分别为两个curl会话提供设置参数
curl_setopt(&ch1, curlopt_url, "http://www.forasp.cn/");
curl_setopt(&ch1, curlopt_header, 0);
curl_setopt(&ch2, curlopt_url, "http://forasp.cn/");
curl_setopt(&ch2, curlopt_header, 0);
//建立批处理curl会话,
&mh = curl_multi_init();
//将前面建立的两个curl会话添加到批处理会话中
curl_multi_add_handle(&mh,&ch1);
curl_multi_add_handle(&mh,&ch2);
&running=null;
//执行批处理会话
do {
    curl_multi_exec(&mh,&running);
} while (&running > 0);//直到所有会话执行完毕
//管理单个会话,和批处理会话
curl_multi_remove_handle(&ch1);
curl_multi_remove_handle(&ch2);
curl_multi_close(&mh);
?>

其他curl批处理命令
curl_version();获取curl相关的版本信息
<?php
print_r(curl_version());
?>
curl_getinfo()函数的作用是获取一个curl连接资源句柄的信息,curl_getinfo()函数有两个参数,第一个参数是curl的资源句柄,第二个参数是下面一些常量:
curlinfo_effective_url 最后一个有效的url地址
curlinfo_http_code 最后一个收到的http代码
curlinfo_filetime 远程获取文档的时间,如果无法获取,则返回值为“-1”
curlinfo_total_time 最后一次传输所消耗的时间
curlinfo_namelookup_time 名称解析所消耗的时间
curlinfo_connect_time建立连接所消耗的时间
curlinfo_pretransfer_time 从建立连接到准备传输所使用的时间
curlinfo_starttransfer_time 从建立连接到传输开始所使用的时间
curlinfo_redirect_time 在事务传输开始前重定向所使用的时间
curlinfo_size_upload 上传数据量的总值
curlinfo_size_download 下载数据量的总值
curlinfo_speed_download 平均下载速度
curlinfo_speed_upload 平均上传速度
curlinfo_header_size header部分的大小
curlinfo_header_out 发送请求的字符串
curlinfo_request_size 在http请求中有问题的请求的大小
curlinfo_ssl_verifyresult result of ssl certification verification requested by setting curlopt_ssl_verifypeer
curlinfo_content_length_download 从content-length: field中读取的下载内容长度
curlinfo_content_length_upload 上传内容大小的说明
curlinfo_content_type 下载内容的“content-type”值,null表示服务器没有发送有效的“content-type: header”
<?php
&ch = curl_init("http://www.forasp.cn/");
print_r(curl_getinfo(&ch));
?>

curl_setopt(会话对象,参数,参数值);参数设置相关详细内容:
curlopt_autoreferer自动设置header中的referer信息
curlopt_binarytransfer 在启用curlopt_returntransfer时候将获取数据返回
curlopt_cookiesession 启用时curl会仅仅传递一个session cookie,忽略其他的cookie,默认状况下curl会将所有的cookie返回给服务端。session cookie是指那些用来判断服务器端的session是否有效而存在的cookie。
curlopt_crlf 启用时将unix的换行符转换成回车换行符。
curlopt_dns_use_global_cache 启用时会启用一个全局的dns缓存,此项为线程安全的,并且默认为true。
curlopt_failonerror 显示http状态码,默认行为是忽略编号小于等于400的http信息
curlopt_file
curlopt_filetime 启用时会尝试修改远程文档中的信息。结果信息会通过curl_getinfo()函数的curlinfo_filetime选项返回。
curlopt_followlocation 启用时会将服务器服务器返回的“location:”放在header中递归的返回给服务器,使用curlopt_maxredirs可以限定递归返回的数量。
curlopt_forbid_reuse 在完成交互以后强迫断开连接,不能重用。
curlopt_fresh_connect 强制获取一个新的连接,替代缓存中的连接。
curlopt_ftp_use_eprt   true to use eprt (and lprt) when doing active ftp downloads. use false to disable eprt and lprt and use port only.
added in php 5.0.0.

curlopt_ftp_use_epsv   true to first try an epsv command for ftp transfers before reverting back to pasv. set to false to disable epsv.
curlopt_ftpappend true to append to the remote file instead of overwriting it.
curlopt_ftpascii   an alias of curlopt_transfertext. use that instead.
curlopt_ftplistonly  true to only list the names of an ftp directory.
curlopt_header  启用时会将头文件的信息作为数据流输出。
curlopt_httpget 启用时会设置http的method为get,因为get是默认是,所以只在被修改的情况下使用。
curlopt_httpproxytunnel 启用时会通过http代理来传输。
curlopt_mute 讲curl函数中所有修改过的参数恢复默认值。
curlopt_netrc 在连接建立以后,访问~/.netrc文件获取用户名和密码信息连接远程站点。
curlopt_nobody 启用时将不对html中的body部分进行输出。
curlopt_noprogress 启用时关闭curl传输的进度条,此项的默认设置为true
curlopt_nosignal 启用时忽略所有的curl传递给php进行的信号。在sapi多线程传输时此项被默认打开。
curlopt_postfields 提交的数据内容,比如"url=forasp.cn&webname=forasp.cn…"
curlopt_post 启用时会发送一个常规的post请求,类型为:application/x-www-form-urlencoded,就像表单提交的一样。
curlopt_put 启用时允许http发送文件,必须同时设置curlopt_infile和curlopt_infilesize
curlopt_returntransfer 讲curl_exec()获取的信息以文件流的形式返回,而不是直接输出。
curlopt_ssl_verifypeer false to stop curl from verifying the peer\’s certificate. alternate certificates to verify against can be specified with the curlopt_cainfo option or a certificate directory can be specified with the curlopt_capath option. curlopt_ssl_verifyhost may also need to be true or false if curlopt_ssl_verifypeer is disabled (it defaults to 2). true by default as of curl 7.10. default bundle installed as of curl 7.10.

curlopt_transfertext true to use ascii mode for ftp transfers. for ldap, it retrieves data in plain text instead of html. on windows systems, it will not set stdout to binary mode.

curlopt_unrestricted_auth 在使用curlopt_followlocation产生的header中的多个locations中持续追加用户名和密码信息,即使域名已发生改变。
curlopt_upload 启用时允许文件传输
curlopt_url  提交的数据url地址
curlopt_verbose 启用时会汇报所有的信息,存放在stderr或指定的curlopt_stderr中
curlopt_buffersize 每次获取的数据中读入缓存的大小,这个值每次都会被填满。
curlopt_closepolicy 不是curlclosepolicy_least_recently_used就是curlclosepolicy_oldest,还存在另外三个,但是curl暂时还不支持。
curlopt_connecttimeout 在发起连接前等待的时间,如果设置为0,则不等待。

PHP Session问题总结之二


运行时配置
这些函数的行为受 php.ini 的影响。

表 1. 会话配置选项

名称 默认值 可修改范围 更新纪录  
session.save_path "" php_ini_all  
session.name "phpsessid" php_ini_all  
session.save_handler "files" php_ini_all  
session.auto_start "0" php_ini_all  
session.gc_probability "1" php_ini_all  
session.gc_divisor "100" php_ini_all 自 php 4.3.2 起可用。  
session.gc_maxlifetime "1440" php_ini_all  
session.serialize_handler "php" php_ini_all  
session.cookie_lifetime "0" php_ini_all  
session.cookie_path "/" php_ini_all  
session.cookie_domain "" php_ini_all  
session.cookie_secure "" php_ini_all 自 php 4.0.4 起可用。  
session.use_cookies "1" php_ini_all  
session.use_only_cookies "1" php_ini_all 自 php 4.3.0 起可用。  
session.referer_check "" php_ini_all  
session.entropy_file "" php_ini_all  
session.entropy_length "0" php_ini_all  
session.cache_limiter "nocache" php_ini_all  
session.cache_expire "180" php_ini_all  
session.use_trans_sid "0" php_ini_all 在 php <= 4.2.3 是 php_ini_all,在 php < 5 是 php_ini_perdir。自 php 4.0.3 起可用。  
session.bug_compat_42 "1" php_ini_all 自 php 4.3.0 起可用。  
session.bug_compat_warn "1" php_ini_all 自 php 4.3.0 起可用。  
session.hash_function "0" php_ini_all 自 php 5.0.0 起可用。  
session.hash_bits_per_character "4" php_ini_all 自 php 5.0.0 起可用。  
url_rewriter.tags "a=href,area=href,frame=src,form=,fieldset=" php_ini_all 自 php 4.0.4 起可用。  

有关 php_ini_* 常量进一步的细节与定义参见附录 i。  

会话管理系统支持许多配置选项,可以在自己的 php.ini 文件中设定。这里只是个简短的概览。

session.save_handler string
session.save_handler 定义了来存储和获取与会话关联的数据的处理器的名字。默认为 files。参见 session_set_save_handler()。  

session.save_path string
session.save_path 定义了传递给存储处理器的参数。如果选择了默认的 files 文件处理器,则此值是创建文件的路径。默认为 /tmp。参见 session_save_path()。  

此指令还有一个可选的 n 参数来决定会话文件分布的目录深度。例如,设定为 \’5;/tmp\’ 将使创建的会话文件和路径类似于 /tmp/4/b/1/e/3/sess_4b1e384ad74619bd212e236e52a5a174if。要使用 n 参数,必须在使用前先创建好这些目录。在 ext/session 目录下有个小的 shell 脚本名叫 mod_files.sh 可以用来做这件事。此外注意如果使用了 n 参数并且 n 大于 0,那么将不会执行自动垃圾回收,更多信息见 php.ini。另外如果用了 n 参数,要确保将 session.save_path 的值用双引号 "quotes" 括起来,因为分隔符分号( ;)在 php.ini 中也是注释符号。  

警告  
如果将此设定为一个全局可读的目录,例如 /tmp(默认值),服务器上的其他用户有可能通过该目录的文件列表破解会话。  

注意: 在 php 4.3.6 之前,windows 用户必须修改此选项以使用 php 的会话函数。必须指定一个合法路径,例如:c:/temp。  

session.name string
session.name 指定会话名以用做 cookie 的名字。只能由字母数字组成,默认为 phpsessid。参见 session_name()。  

session.auto_start boolean
session.auto_start 指定会话模块是否在请求开始时自动启动一个会话。默认为 0(不启动)。

session.serialize_handler string
session.serialize_handler 定义用来序列化/解序列化的处理器名字。当前支持 php 内部格式(名为 php)和 wddx(名为 wddx)。如果 php 编译时加入了 wddx 支持,则只能用 wddx。默认为 php。

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

session.gc_probability integer
session.gc_probability 与 session.gc_divisor 合起来用来管理 gc(garbage collection 垃圾回收)进程启动的概率。默认为 1。详见 session.gc_divisor。  

session.gc_divisor integer
session.gc_divisor 与 session.gc_probability 合起来定义了在每个会话初始化时启动 gc(garbage collection 垃圾回收)进程的概率。此概率用 gc_probability/gc_divisor 计算得来。例如 1/100 意味着在每个请求中有 1% 的概率启动 gc 进程。session.gc_divisor 默认为 100。  

session.gc_maxlifetime integer
session.gc_maxlifetime 指定过了多少秒之后数据就会被视为“垃圾”并被清除。  

注意: 如果不同的脚本具有不同的 session.gc_maxlifetime 数值但是共享了同一个地方存储会话数据,则具有最小数值的脚本会清理数据。此情况下,与 session.save_path 一起使用本指令。

注意: 如果使用默认的基于文件的会话处理器,则文件系统必须保持跟踪访问时间(atime)。windows fat 文件系统不行,因此如果必须使用 fat 文件系统或者其他不能跟踪 atime 的文件系统,那就不得不想别的办法来处理会话数据的垃圾回收。自 php 4.2.3 起用 mtime(修改时间)来代替了 atime。因此对于不能跟踪 atime 的文件系统也没问题了。  

session.referer_check string
session.referer_check 包含有用来检查每个 http referer 的子串。如果客户端发送了 referer 信息但是在其中并未找到该子串,则嵌入的会话 id 会被标记为无效。默认为空字符串。  

session.entropy_file string
session.entropy_file 给出了一个到外部资源(文件)的路径,该资源将在会话 id 创建进程中被用作附加的熵值资源。例如在许多 unix 系统下都可以用 /dev/random 或 /dev/urandom。  

session.entropy_length integer
session.entropy_length 指定了从上面的文件中读取的字节数。默认为 0(禁用)。  

session.use_cookies boolean
session.use_cookies 指定是否在客户端用 cookie 来存放会话 id。默认为 1(启用)。  

session.use_only_cookies boolean
session.use_only_cookies 指定是否在客户端仅仅使用 cookie 来存放会话 id。。启用此设定可以防止有关通过 url 传递会话 id 的攻击。此设定是 php 4.3.0 添加的。  

session.cookie_lifetime integer
session.cookie_lifetime 以秒数指定了发送到浏览器的 cookie 的生命周期。值为 0 表示“直到关闭浏览器”。默认为 0。参见 session_get_cookie_params() 和 session_set_cookie_params()。  

session.cookie_path string
session.cookie_path 指定了要设定会话 cookie 的路径。默认为 /。参见 session_get_cookie_params() 和 session_set_cookie_params()。  

session.cookie_domain string
session.cookie_domain 指定了要设定会话 cookie 的域名。默认为无,表示根据 cookie 规范产生 cookie 的主机名。参见 session_get_cookie_params() 和 session_set_cookie_params()。

session.cookie_secure boolean
session.cookie_secure 指定是否仅通过安全连接发送 cookie。默认为 off。此设定是 php 4.0.4 添加的。参见 session_get_cookie_params() 和 session_set_cookie_params()。  

session.cache_limiter string
session.cache_limiter 指定会话页面所使用的缓冲控制方法(none/nocache/private/private_no_expire/public)。默认为 nocache。参见 session_cache_limiter()。  

session.cache_expire integer
session.cache_expire 以分钟数指定缓冲的会话页面的存活期,此设定对 nocache 缓冲控制方法无效。默认为 180。参见 session_cache_expire()。  

session.use_trans_sid boolean
session.use_trans_sid 指定是否启用透明 sid 支持。默认为 0(禁用)。  

————————————————

注意: 对于 php 4.1.2 或以下版本,可以通过加入 –enable-trans-sid 配置选项去编译来启用,从 php 4.2.0 起,trans-sid 特性总是被编译。  

基于 url 的会话管理比基于 cookie 的会话管理有更多安全风险。例如用户有可能通过 email 将一个包含有效的会话 id 的 url 发给他的朋友,或者用户总是有可能在收藏夹中存有一个包含会话 id 的 url 来以同样的会话 id 去访问站点。  

session.bug_compat_42 boolean
php 4.2.3 以及更低版本有一个未公开的特性/错误,它允许用户在 register_globals 被禁用的情况下在全局范围内初始化一个会话变量。php 4.3.0 及更高版本会在使用此特性时并且启用了 session.bug_compat_warn 时发出警告。此特性/错误可以通过关闭此选项而禁用。  

session.bug_compat_warn boolean
php 4.2.3 以及更低版本有一个未公开的特性/错误,它允许用户在 register_globals 被禁用的情况下在全局范围内初始化一个会话变量。php 4.3.0 及更高版本会在使用此特性时并且同时启用了 session.bug_compat_42 和 session.bug_compat_warn 时发出警告。  

session.hash_function integer
session.hash_function 允许用户指定生成会话 id 的散列算法。\’0\’ 表示 md5(128 位),\’1\’ 表示 sha-1(160 位)。  

注意: 这是 php 5 引进的。  

session.hash_bits_per_character integer
session.hash_bits_per_character 允许用户定义将二进制散列数据转换为可读的格式时每个字符存放多少个比特。可能值为 \’4\’(0-9,a-f),\’5\’(0-9,a-v),以及 \’6\’(0-9,a-z,a-z,"-",",")。  

注意: 这是 php 5 引进的。  

url_rewriter.tags string
url_rewriter.tags 指定在使用透明 sid 支持时哪些 html 标记会被修改以加入会话 id。默认为 a=href,area=href,frame=src,input=src,form=fakeentry,fieldset=。  

注意: 如果要符合 xhtml,去掉 form 项并在表单字段前后加上 <fieldset> 标记。  

track_vars 和 register_globals 配置选项影响到会话变量是怎样存储和恢复的。  

注意: 自 php 4.0.3 起,track_vars 总是打开的。  

资源类型
本扩展模块未定义任何资源类型。

预定义常量
以下常量由本扩展模块定义,因此只有在本扩展模块被编译到 php 中,或者在运行时被动态加载后才有效。

sid (string)
包含着会话名以及会话 id 的常量,格式为 "name=id",或者如果会话 id 已经在适当的会话 cookie 中设定时则为空字符串。  

范例
注意: 自 php 4.1.0 起,&_session 如同 &_post,&_get,&_request 等一样成为全局数组。与 &http_session_vars 不同,&_session 总是具有全局范围。因此不要对 &_session 使用 global 关键字。注意本文档已被改为在所有地方都使用 &_session。如果倾向后者,可以将 &http_session_vars 都替换成 &_session。此外注意必须在使用 &_session 之前先用 session_start() 启动会话。  

在 &_session 关联数组中的键名具有和 php 中普通变量名相同的规则,即不能以数字开头,必须以字母或下划线开头。更多细节见本手册中变量一章。  

如果 register_globals 被禁用,则只有全局关联数组 &_session 中的成员可以被注册为会话变量。被恢复的会话变量也只存在于 &_session 数组中。  

为提高安全性和代码的可读性,建议使用 &_session(或在 php 4.0.6 或更低版本中用 &http_session_vars)。使用了 &_session,就没有必要使用 session_register(),session_unregister(),session_is_registered() 函数。访问会话变量就和其它变量一样。 例 1. 用 &_session 注册变量

<?php
session_start();
// use &http_session_vars with php 4.0.6 or less
if (!isset(&_session[\'count\'])) {
&_session[\'count\'] = 0;
} else {

&_session[\'count\'] ;
}
?>  

例 2. 用 &_session 取消注册变量并且禁用了 register_globals

<?php
session_start();
// use &http_session_vars with php 4.0.6 or less
unset(&_session[\'count\']);
?>  

小心  
不要用 unset(&_session) 取消了整个 &_session 数组,这样将不能再通过 &_session 超全局数组注册变量了。  

警告  
不能在会话变量中用引用,因为没有可行的方法将引用恢复到另一个变量去。  

如果启用了 register_globals,则每个全局变量都能被注册为会话变量。在会话重新启动时,这些变量会被恢复到相应的全局变量中去。因为 php 必须知道哪些全局变量被注册为会话变量,用户需要用 session_register() 函数来注册变量。可以简单地通过在 &_session 中设定变量来免去这样做。  

小心  
在 php 4.3 之前,如果使用了 &_session 并且仅用了 register_globals,则不要使用 session_register(),session_is_registered() 或 session_unregister()。出于安全及性能原因,建议禁用 register_globals。  

如果启用了 register_globals,则全局变量和 &_session 中的条目自动指向之前注册的同一个会话实例。不过如果变量是用 &_session 注册的,则全局变量自下一个请求起才可用。  

在 php 4.2.3 和之前版本中有个缺陷。如果用 session_register() 注册了一个新的会话变量,则在全局变量范围中的条目和 &_session 中的条目在下一个 session_start() 之前没有引用到同一个值。即如果修改一个新注册的全局变量,不会在 &_session 条目中反应出来。这在 php 4.3 中已被修正。  

传递会话 id
有两种方法传递一个会话 id:  

cookie  

url 参数  

会话模块支持这两种方法。cookie 更优化,但由于不总是可用,也提供替代的方法。第二种方法直接将会话 id 嵌入到 url 中间去。  

php 可以透明地转换连接。除非是使用 php 4.2 或更新版本,需要手工在编译 php 时激活。在 unix 下,用 –enable-trans-sid 配置选项。如果此配置选项和运行时选项 session.use_trans_sid 都被激活,相对 uri 将被自动修改为包含会话 id。  

注意: php.ini 指令 arg_separator.output 允许定制参数分隔符。为完全符合 xhtml,这里用 &。  

此外,可以用常量 sid,在会话启动时被定义。如果客户端没有发送适当的会话 cookie 的话,则 sid 的格式为 session_name=session_id,否则就为一个空字符串。因此可以无条件将其嵌入到 url 中去。  

下面例子演示了怎样注册一个变量,以及怎样用 sid 正确连接到另一个页面。 例 3. 对单一用户进行页面点击计数

<?php
if (!session_is_registered(\’count\’)) {
session_register(\’count\’);
&count = 1;
} else {
&count ;
}
?>

<p>
hello visitor, you have seen this page <?php echo &count; ?> times.
</p>

<p>
to continue, <a href="/nextpage.php?<?php echo strip_tags(sid); ?>">click
here</a>.
</p>  

用 strip_tags() 来输出 sid 以避免 xss 相关的攻击。  

如果编译 php 时指定了 –enable-trans-sid,就不需要像上例那样输出 sid 了。  

注意: 非相对的 url 被假定为指向外部站点,因此没有附加 sid,因为这可能是个安全隐患将 sid 泄露给不同的服务器。  

定制会话处理器
要实现数据库存储或其它储存方法,需要用 session_set_save_handler() 来创建一组用户级别的存储函数。  

目录
session_cache_expire — return current cache expire
session_cache_limiter — get and/or set the current cache limiter
session_commit — session_write_close() 的别名
session_decode — decodes session data from a string
session_destroy — destroys all data registered to a session
session_encode — 将当前会话数据编码为一个字符串
session_get_cookie_params — get the session cookie parameters  
session_id — get and/or set the current session id
session_is_registered — find out whether a global variable is registered in a session  
session_module_name — get and/or set the current session module
session_name — get and/or set the current session name
session_regenerate_id — update the current session id with a newly generated one  
session_register — register one or more global variables with the current session  
session_save_path — get and/or set the current session save path
session_set_cookie_params — set the session cookie parameters  
session_set_save_handler — sets user-level session storage functions  
session_start — initialize session data
session_unregister — unregister a global variable from the current session  
session_unset — free all session variables  
session_write_close — write session data and end session

国内优秀PHP开源建站程序点评


  论坛:discuz
  discuz非常流行,也是中国地区最多用户使用的论坛程序,论坛搭建非常简单易用,使用风格符合中国人的口味。
  sns:ucenter home
  ucenter home是采用php mysql构建的社会化网络软件(social network software,简称sns)。 通过 ucenter home,建站者可以轻松构建一个以好友关系为核心的交流网络,用户可以使用迷你博客记录;方便快捷地发布日志、上传图片;与其好友们一起分享信息、讨论话题;了解好友最新动态。
  e-commerce:ecshop
  ecshop是一款开源免费的网上商店系统,用户可以根据自己的商务特征对ecshop进行定制,增加自己商城的特色功能。
  点评:modoer
  modoer一款php点评系统,可针对多种行业进行点评,可以自由调控点评项目,类型,采用web 2.0的建站方式,网站会员能让快速上手。
  digg:pbdigg
  pbdigg是基于php mysql的开源digg社区资讯系统,融合了社会性标签、主题评论、rss订阅等多种web2.0元素,是一个高效、快速的网站解决方案。
  wiki:hdwiki
  hdwiki是专为中文用户设计和开发的开源、高效的中文百科建站解决方案,免费、易用、功能强大,和ucenter可无缝整合。
  rss:ixna
  xna是国内开源php新闻聚合程序,支持rss多核心切换,默认支持lastrss、simplepie、magpierss,支持rdf、rss、atom,支持智能识别。
  cms:关于cms的php产品很多,这里主要介绍下面三个。
  supesite
  supesite 是一套独立的内容管理系统(cms),并且拥有对discuz!论坛信息和ucenter home个人空间信息聚合的功能,是一个不错的社区门户解决方案。
  dedecms
  dedecms是一个比较知名php cms系统,很多早期的用户都是使用这个建立网站的。
  kingcms
  kingcms是一套简单易学,操作简单的开源内容管理系统(cms),kingcms分为php mysql和asp mssql/access两种语言版本的系统。



Powered By wordpress Copyright php © 2009-2012 版权所有