附录B. 函数

在我写作本书的时候,http://php.net/quickref.php列出了共3917个函数,其中包括一些类似函数的语法结构,在此我不准备把它们从函数中区分开来,而是把它作为函数看待。

由于函数数量很大,一一说明它们的正确及安全用法是不太可能的。在此我选出了我认为最需要注意的函数。选择的标准包括使用的频繁度、使用时的危险(安全)度及我本人的经验。

对于每一个列出的函数,我都会提供推荐的使用方法。在提出这些方法时,我会把安全作为重点考虑。请在实际使用时根据你的需求进行相应调整。

当一个函数与另一个有相同的风险时,我会给出参见另一个函数的信息,而不是多余地再次描述一遍。

B.1. eval( )

eval( )函数用于对一个字符串以PHP语句方式解析运行。如:

<?php

$name = 'Chris';

$string = 'echo "Hello, $name";';

eval($string);

?>

上例中会把$string作为PHP语句来运行,因此等价于:

<?php

$name = 'Chris';

echo "Hello, $name";

?>

虽然eval( )非常有用,但是当使用了被污染数据时会非常危险。例如,在下例中,如果$name是被污染的,攻击者可以任意运行PHP代码:

<?php

$name = $_GET['name'];

eval($name);

?>

当你无法确信以PHP方式解释的字符串是否使用被污染数据时,以及在可能的情况下,我推荐你避免使用eval( )。在安全审查和同行评审中,应重点检查该函数。

B.2. exec( )

第6章中已提到,执行shell命令是非常危险的操作,在构造shell命令时使用被污染数据会导致命令注入漏洞。

尽量避免使用shell命令函数,但当你需要用它们时,请确信构造shell命令时只使用过滤及转义过的数据。

<?php

$clean = array();

$shell = array();

/* Filter Input ($command, $argument) */

$shell['command'] = escapeshellcmd($clean['command']);

$shell['argument'] = escapeshellarg($clean['argument']);

$last = exec("{$shell['command']} {$shell['argument']}", $output, $return);

?>

B.3. file( )

file( )函数是我喜欢使用的读文件方法之一。它会读取文件的每一行作为返回数组的元素。特别方便的一点是,你不需要提供一个文件句柄——你提供文件名,它会为你做好一切:

<?php

$contents = file('/tmp/file.txt');

print_r($contents);

?>

如果上面的文件有两行,则会产生类似如下的输出:

Array

(

[0] => This is line one.

[1] => This is line two.

)

使用file( )函数不是特别危险,但当你在allow_url_fopen选项打开的情况下使用时,它就能读取许多不同类型的资源如一个远程网站的内容:

<?php

$contents = file('http://example.org/');

print_r($contents);

?>

输出如下 (有删节):

Array

(

[0] => <html>

[1] => <head>

[2] => <title>Example Web Page</title>

[3] => </head>

[4] => <body>

...

[11] => </body>

[12] => </html>

)

如果file()函数调用的文件名是由被污染数据构造的,则其内容也应被看成是被污染的。这是因为使用被污染数据构造文件名可能会导致你打开一个有恶意数据的远程网站。一旦你把数据保存在一个变量中,危险就大幅增加了:

<?php

$tainted = file($_POST['filename']);

?>

$tainted数组中的每个元素与$_POST['filename']有相同的危险性——它是输入并必须要进行过滤。

在这里,其行为有可能是意想不到的——$_POST['filename']的误用可以改变file()函数的行为,因此它可以指向一个远程资源而不是本地文件。

B.4. file_get_contents( )

参见 "file( )."

B.5. fopen( )

参见 "file( )."

B.6. include

如第5章所述,include在组织化与模块化的软件设计中被普遍使用,是非常有必要的。但是,不正确的使用include会造成一个重大的代码注入安全漏洞。

在include语句中只使用已过滤数据是非常有必要的。在安全审查和同行评审中,应重点检查该函数。

B.7. passthru( )

见"exec( )."

B.8. phpinfo( )

phpinfo( )会输出有关PHP信息的页面——运行的版本号,配置信息等等。由于phpinfo( )的输出提供了非常多的信息,我建议限制对任何使用该函数的资源的访问。

如果你使用的第八章中的技巧来保护数据库验证信息,则需要确认访问者不能看到由phpinfo( )形成的输出信息,这是由于它会暴露超级全局数组$_SERVER的内容。

B.9. popen( )

参见"exec( )."

B.10. preg_replace( )

preg_replace( )用于对符合正则表达式的字符串进行替换。在某些情况下,使用被污染数据构造正则表达式部分会非常危险,因为它的e修饰符会导致在替换时把用于替换的参数作为PHP代码来对待。例如(本例为译者所加):

<?php

$str = "abcdef";

$se = "len";

$reg = "/abc/e";

echo preg_replace($reg,"strlen(\$se)",$str);

?>

会输出如下字串:

3def

当使用了e修饰符,不管是否有意为之,它会带来与eval()相同的风险。在安全审查和同行评审中,应重点检查该函数。

B.11. proc_open( )

参见 "exec( )."

B.12. readfile( )

参见 "file( )."

B.13. require

参见 "include."

B.14. shell_exec( )

参见 "exec( )."

B.15. system( )

参见 "exec( )."

[新闻]NHibernate 2.0.0.Beta1发布了
文章来源:http://www.cnblogs.com/czh-liyu/archive/2008/04/02/1133996.html

转载于:https://www.cnblogs.com/xfliu/archive/2008/07/01/1233386.html

[导入]php 安全基础 附录B. 函数相关推荐

  1. [导入]php 安全基础 附录C. 加密

    附录C. 加密 作为一本相关安全方面的书,通常加密是需要提及的话题.我之所以在本书的主体部分忽略了加密问题,是因为它的用途是狭窄的,而开发者应从大处着眼来考虑安全问题.过分依赖于加密常常会混淆问题的根 ...

  2. python导入模块的语法结构_python学习第五讲,python基础语法之函数语法,与Import导入模块....

    python学习第五讲,python基础语法之函数语法,与Import导入模块. 一丶函数简介 函数,就是一个代码块,这个代码块是别人写好的.我们调用就可以. 函数也可以称为方法. 1.函数语法定义 ...

  3. C语言的底层逻辑剖析函数篇(其二),0基础搞定函数,初识函数递归,超详解

    这里写目录标题 C语言的底层逻辑剖析函数篇(其二),0基础搞定函数,初识函数递归,超详解 开篇语 函数的调用(嵌套调用和链式访问) 1.嵌套调用 2.函数的链式访问 函数的声明和定义 函数声明和定义分 ...

  4. 【C 语言】文件操作 ( 文件加密解密 | 使用第三方 DES 加密解密库 | 头文件导入 | 兼容 C++ 语言 | 加密解密函数说明 )

    文章目录 一.导入第三方库头文件 二.头文件说明 1.兼容 C++ 语言 2.头文件导入限制 3.加密解密函数说明 一.导入第三方库头文件 对文件进行加密 , 将文件中的数据分成若干块 , 一块一块的 ...

  5. openresty开发系列14--lua基础语法3函数

    openresty开发系列14--lua基础语法3函数 一)function (函数) 有名函数: optional_function_scope function function_name( ar ...

  6. 【Python基础】Python 函数使用总结

    我的施工之路 目前已完成,以下五期Python专题总结: 1我的施工计划 2数字专题 3字符串专题 4列表专题 5流程控制专题 6编程风格专题 今天是Python函数专题,目录结构: Python 函 ...

  7. Python基础day05【函数应用:学生管理系统、拆包、今日总结】

    视频.源码.课件.软件.笔记:超全面Python基础入门教程[十天课程]博客笔记汇总表[黑马程序员] Python基础day05[函数(函数传参的两种形式.函数形参).拆包.引用.可变与不可变类型.引 ...

  8. Python基础day05【函数(局部变量、全局变量、多函数执行流程、函数返回值、函数参数)、拆包、引用、可变与不可变类型、函数注意事项】

    视频.源码.课件.软件.笔记:超全面Python基础入门教程[十天课程]博客笔记汇总表[黑马程序员] Python基础day05[函数(函数传参的两种形式.函数形参).拆包.引用.可变与不可变类型.引 ...

  9. [C/C++基础知识] main函数的参数argc和argv

    该篇文章主要是关于C++\C语言最基础的main函数的参数知识,是学习C++或C语言都必备的知识点.不知道你是否知道该知识?希望对大家有所帮助. 一.main()函数参数 通常我们在写主函数时都是vo ...

最新文章

  1. 开源医学图像数据集(资源整合)
  2. FPGA 中的latch 锁存器
  3. 线性回归和逻辑回归的区别_线性回归
  4. iOS UI基础-6.0 UIActionSheet的使用
  5. 触发器的创建、修改和删除
  6. 使用MongoDB进行乐观锁定重试
  7. java信号灯_java 信号灯 Semaphore
  8. 深度学习优化算法大全系列6:Adam
  9. 【ML小结2】信息论
  10. 计算机一级移动是复制粘贴吗,学会着几种复制粘贴的方法你做事会事半功倍
  11. 使用mosquitto库命令与腾讯云通信
  12. eth入门之web2 与 web3 的对比
  13. Python 计算父亲节和母亲节
  14. 我的世界服务器显示你没有权限,我的世界怎么没有权限有指令
  15. MySQL数据库 | 数据表-查询命令详细记录
  16. 【Proteus】PWM脉冲调制信号
  17. 2018年互联网暴利创业项目
  18. 科比:向火箭脱帽致敬!
  19. StarUML for Mac的安装与破解
  20. XSS钓鱼某网约车后台一探究竟,乘客隐私暴露引发思考

热门文章

  1. table分页的简单实现逻辑
  2. Servlet 应用程序事件、监听器
  3. django model filter 条件过滤,及多表连接查询、反向查询,某字段的distinct
  4. poj 1986 Distance Queries
  5. SCCM 2007系列教程之三日志文件
  6. Windows下的HEAP溢出及其利用
  7. 18.phpmyadmin 4.8.1 远程文件包含漏洞(CVE-2018-12613)
  8. Win10 jdk的安装以及环境变量的配置,及需要注意的坑
  9. Oracle-逻辑体系结构
  10. EntityFramework6.X 之 Fulent