月度归档:2013年02月

PHP 安全

安全威胁:软件漏洞 用户输入 未能妥善保护的数据

1 安全配置PHP(与安全有关的配置参数)
1)disable_functions = string
作用域:PHP_INI_SYSTEM; 默认值:NULL
可以将disable_functions设置为一个希望禁用的函数名列表,各函数名之间用逗号分隔。

2)disable_classes = string
作用域:PHP_INI_SYSTEM; 默认值:NULL
可以禁止使用某些类。

3)display_errors = On | Off
作用域:PHP_INI_ALL; 默认值:On
PHP通过向浏览器窗口输出错误信息,从而暴露服务器配置或应用程序的一些详细信息。在生产环境下务必禁用。当然,也可以将错误信息保存到一个日志文件。

4)max_execution_time = integer
作用域:PHP_INI_ALL; 默认值:30
此指令指定脚本在终止前执行的秒数。这对于防止用户脚本占用过多CPU时间非常有用。如果设置为了则表示没有时间限制。

5)memory_limit = integer M
作用域:PHP_INI_ALL; 默认值:128M
此指令指定脚本可以使用的内存,以M为单位。此指令只有在配置PHP时启用 –enable-memory-limit后才可用。

6)open_basedir = string
作用域:PHP_INI_ALL; 默认值:NULL
PHP的open_basedir指令可以建立一个基目录,将限制所有文件操作只能在这个目录下进行。

7)sql.safe_mode = string
作用域:PHP_INI_SYSTEM; 默认值:0
当启用sql.safe_mode指令时,会忽略传给mysql_connect()和mysql_pconnect()的所有信息,而使用localhost作为目标主机。运行PHP的用户作为用户名,不使用密码。

8)user_dir = string
作用域:PHP_INI_SYSTEM; 默认值:NULL
此指令指定用户主目录中的一个目录名,PHP脚本必须放在这里才能执行。

2 隐藏配置细节
参阅:http://www.vfeelit.com/73.html

3 隐藏敏感数据
4 数据加密
1) PHP的加密函数
使用md5()散列函数加密数据。PHP的hash扩展支持数十种散列算法和相应变种。参见:http://us3.php.net/hash
注:为了确保PHP的哈希函数能用,在配置PHP时一般明确指定–with-mhash参数。

2) MCrypt包
MCrypt是一个PHP可用的流行数据加密包,它提供了加密和解密支持。要使用它前需要先安装mcrypt系统包:
(1)到http://mcrypt.sourceforge.net下载包的源代码
(2)编译安装这个包
(3)使用—with-mcrypt选项编译PHP

永久连接:http://blog.ifeeline.com/326.html

PHP XML操作 – SimpleXML

The SimpleXML extension provides a very simple and easily usable toolset to convert XML to an object that can be processed with normal property selectors and array iterators.

此扩展需要libxml PHP扩展,这表示需要使用 –enable-libxml,尽管这将隐式完成因为libxml是缺省开启的.

注:不仅是SimpleXML需要libxml PHP扩展,很多其它针对XML的扩展也需要。事实上libxml PHP扩展依赖系统库libxml2 libxml2-devel,所以安装PHP前要先安装这两个库,然后编译PHP时要启用libxml PHP扩展(也可以不用明确使用—enable-libxml,因为它是默认的,如果找不到系统的libxml2库,PHP编译可能出错,这时可以通过–with-libxml-dir指定系统libxml2库安装的目录)

安装
此扩展默认为启用,编译时可通过下列选项禁用: –disable-simplexml
Note: Before PHP 5.1.2, –enable-simplexml is required to enable this extension.

加载XML
1 加载文件
simplexml_load_file()函数将XML文件加载到对象:
object simplexml_load_file(string filename [, string class_name])
如果加载文件时遇到问题,则返回FALSE。如果包含可选的class_name参数,将返回该类的对象。当然,class_name会扩展SimpleXMLElement类。

2 加载字符串
object simplexml_load_string(string data)

3 加载XML DOM文档
simplexml_import_dom()函数将DOM文档的节点转换为SimpleXML的节点。

解析XML

<?xml version='1.0' standalone='yes'?>
<movies>
 <movie>
  <title>PHP: Behind the Parser</title>
  <characters>
   <character>
    <name>Ms. Coder</name>
    <actor>Onlivia Actora</actor>
   </character>
   <character>
    <name>Mr. Coder</name>
    <actor>El Act</actor>
   </character>
  </characters>
  <plot>
   So, this language. It's like, a programming language. Or is it a
   scripting language? All is revealed in this thrilling horror spoof
   of a documentary.
  </plot>
  <great-lines>
   <line>PHP solves all my web problems</line>
  </great-lines>
  <rating type="thumbs">7</rating>
  <rating type="stars">5</rating>
 </movie>
</movies>

// 使用var_dump()输出
object(SimpleXMLElement)#1 (1) {
  ["movie"]=>
  object(SimpleXMLElement)#2 (5) {
    ["title"]=>
    string(22) "PHP: Behind the Parser"
    ["characters"]=>
    object(SimpleXMLElement)#3 (1) {
      ["character"]=>
      array(2) {
        [0]=>
        object(SimpleXMLElement)#5 (2) {
          ["name"]=>
          string(9) "Ms. Coder"
          ["actor"]=>
          string(14) "Onlivia Actora"
        }
        [1]=>
        object(SimpleXMLElement)#6 (2) {
          ["name"]=>
          string(9) "Mr. Coder"
          ["actor"]=>
          string(6) "El Act"
        }
      }
    }
    ["plot"]=>
    string(162) "
   So, this language. It's like, a programming language. Or is it a
   scripting language? All is revealed in this thrilling horror spoof
   of a documentary.
  "
    ["great-lines"]=>
    object(SimpleXMLElement)#4 (1) {
      ["line"]=>
      string(30) "PHP solves all my web problems"
    }
    ["rating"]=>
    array(2) {
      [0]=>
      string(1) "7"
      [1]=>
      string(1) "5"
    }
  }
}

从输出结果可以看到,XML文档被转换成了对象和数组操作,如果子节点相同(多于1个)就转换成数组的操作方式(数组元素内再封装成一个对象,其实可以全部看做是先封装成数组),另外,节点的属性也被转存成数组,这样操作就非常便利。

最常用的操作:
打开XML文档或保存到XML文档

simplexml_load_file()
simplexml_load_string()
simplexm_import_dom()

定位到子节点

// 例子
$xml = simplexml_load_string($xmlstr);
$xml->movice-> title; //定位到title节点,返回它的文本值,与$xml->movice[0] -> title[0]相同
$xml->movice->characters->character[0]; //定位到第一个character
$xml->movice->rating[0][‘type’]; //定位到第一个rating节点的type属性

读取或设置节点值

echo $xml->movice-> title;  //直接获得节点值
$xml->movice-> title =  “Hello SimpleXML”; //直接赋值

读取或设置属性值

echo $xml->movice->rating[0][‘type’];
$xml->movice->rating[0][‘type’]  =  “Set Attribute.”;

添加或删除节点(属性)

// 添加 或 删除 节点(属性)都非常容易
添加:直接造一个,然后赋值
删除:直接unset()

当然,也可以SimpleXMLElement的addChild()或addAttribute(),获取节点或属性,还可以使用children() 和 attributes()。

另外,如果要获取XML的名空间,需要用getNamespaces()方法,要获取节点的名称,需要使用getName()方法,如果要获取有多少个子元素,需要用count()方法。要把当前的XML输出字符串,需要使用asXML()。

这个扩展大部分内容就是如上那些,它使得操作XML非常简单,真正体现了简单。

永久连接: http://blog.ifeeline.com/319.html