[导入]php 安全基础 附录B. 函数

附录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( )."

 

1133996.html?type=1

[新闻]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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/305278.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python os rename用法_Python os.rename() 方法

Python os.rename() 方法概述os.rename() 方法用于命名文件或目录&#xff0c;从 src 到 dst,如果dst是一个存在的目录, 将抛出OSError。语法rename()方法语法格式如下&#xff1a;os.rename(src, dst)参数src -- 要修改的目录名dst -- 修改后的目录名返回值该方法没有返回值实…

java匿名内部类runnable_java匿名内部类用法总结实例源码

java匿名内部类用法总结实例源码。当需要extends一个类&#xff0c;或implements一个接口的时候&#xff0c;可以直接new一个这个类或接口的对象出来&#xff0c;然后在后面加&#xff5b;&#xff5d;&#xff0c;里面写你准备写在子类里面的所有东西。这样&#xff0c;new出来…

6段Python代码刻画深度学习历史:从最小二乘法到深度神经网络

最小二乘法深度学习的一切都起源于这个数学片段&#xff08;我把它用Python 写了出来&#xff09;&#xff1a;这一方法是 1805 年巴黎数学家阿德利昂玛利埃勒让德首次提出的&#xff08;1805&#xff0c;Legendre&#xff09;&#xff0c;勒让德建立了许多重要的定理&#xff…

win7美化_Potplayer64位美化版,无棒子的tv推送

potplayer 64位是一款视频播放器&#xff0c;potplayer 64位目前正在新功能全力开发中&#xff0c;由于采用delphi编译程序kmplayer的一些弊端&#xff0c;姜龙喜先生为改进播放器本身的一些性能而重新用vc进行构架&#xff0c;有需要的伙伴们可以移步简易下载站获取&#xff0…

如何在 C# 8 中使用 Channels

在面对 生产者-消费者 的场景下&#xff0c; netcore 提供了一个新的命名空间 System.Threading.Channels 来帮助我们更高效的处理此类问题&#xff0c;有了这个 Channels 存在, 生产者 和 消费者 可以各自处理自己的任务而不相互干扰&#xff0c;有利于两方的并发处理&#x…

mockito mock void方法_使用 Junit + Mockito 实践单元测试!

一、前言相信做过开发的同学&#xff0c;都多多少少写过下面的代码&#xff0c;很长一段时间我一直以为这就是单元测试...SpringBootTestRunWith(SpringRunner.class)public class UnitTest1 {Autowiredprivate UnitService unitService;Testpublic void test() {System.out.pr…

Outlook 阅读窗格(Reading Pane)

打开 Outlook 点一下邮件&#xff0c;在右侧会有每封邮件的内容预览。突然有一天你发现它不在了知道该怎么调出来吗&#xff1f;我是刚学到的。英文: View--->Reading Pane--->Right&#xff08;右侧&#xff09; Bottom&#xff08;底部&#xff09; Off&#xf…

java web编写计算器_javaWeb 使用 jsp 和 javaBean 实现计算器功能

jsp 和 javaBean 实现计算器功能try {calculator.calculate();} catch (Exception e) {out.write(e.getMessage());}%>简单的计算器第一个参数运算符-*/第二个参数结果package de.bvb.domain;import java.math.BigDecimal;public class Calculator {private String firstNum…

人为什么会出轨?麻省理工学院告诉你:男女配对的真相

该实验出自麻省理工学院著名经济学家Dan Ariely的《The Upside of Irrationality》。结果很有趣&#xff0c;在我们的生活中也尤为常见。实验人员找来100位正值青春年华的大学生&#xff0c;男女各半。然后制作了100张卡片&#xff0c;卡片上写了从1到100总共一百个数字。单数的…

当 .NET 5 遇上OpenTelemetry,会碰撞出怎样的火花?

OpenTelemetry 介绍我在之前的几篇文章都介绍了 OpenTelemetry, 你可以在这里找到OpenTelemetry - 云原生下可观测性的新标准深入研究.NET 5的开放式遥测OpenTelemetry是谷歌和微软共同推进的云原生监控的新规范&#xff0c; 兼容OpenTracing和OpenCensusOpenTelemetry的终极目…

教程大派送

都是华夏的 喜欢的拿去远程控制任我行脱壳 - [Money] 链接地址 :[url]http://download.77169.com/donghua/Crcak/xgyc.zip[/url]让你QQ永远不被***盗走 - [antty] 链接地址: [url]http://download.77169.com/donghua/hackQQ/qqfd.zip[/url]BT下载之疯狂抓鸡 - [奶茶] 链接地址:…

kotlin中mainactivity无法直接调用xml中的控件_使用52North 客户端接口调用OGC WPS服务...

52North是一个来自研究机构、工业界和公共行政管理界的研究者组成的开放国际合作组织&#xff0c;他们通过协作研发流程促进地理信息学创新。具体来说他们开发新的地理信息概念和技术&#xff0c;例如用于管理时空测量数据&#xff0c;以及通过网络共享地理处理技术。他们评估新…

python 密码学 模块_python学习-itsdangerous模块-黑马程序员技术交流社区

博客链接地址&#xff1a;http://www.zhuyannan.top/itsdangerous-加密你的数据/如果你想向不可信的环境发送数据&#xff0c;但又担心数据被别人利用&#xff0c;就可以使用 itsdangerous来加密签名你的数据。接收者可以破译内容&#xff0c;来看看你的包裹里有什么&#xff0…

明天放假,我放价!一个国庆假期教你学会数学建模

原价298元&#xff0c;国庆放价&#xff01;248元即可报名学习&#xff01;数学建模涉及的内容比较广泛&#xff0c;比如碎纸片问题中所涉及的图像识别及神经网络、小区开放问题中所涉及的车流模拟仿真、还有“互联网”时代的出租车资源配置中所涉及的运筹调度。或许数学建模的…

微软开源可扩展存储引擎Extensible Storage Engine

喜欢就关注我们吧&#xff01;昨日&#xff0c;微软副总裁 Scott Van Vliet 在推特上表示&#xff0c;可扩展存储引擎 Extensible Storage Engine&#xff08;ESE&#xff09;现已开源。可扩展存储引擎 Extensible Storage Engine&#xff08;ESE&#xff0c;也称 JET Blue&…

.NET应用程序中异步调用Web Service的几种方法 come from: veryhappy(wx.net)

测试程序界面 图一&#xff0c;调用前界面 图二&#xff0c;调用后界面 详细代码实现 闲言少叙&#xff0c;直接进入主题吧。首先一个声明一个类&#xff08;将来在客户端与服务器间传递&#xff09;&#xff1a; public classClass1 { private int _ID; priv…

完美国际真数苹果_如果给你推荐一款很贵,但好用的苹果手机壳,你会买吗?...

【引言】说到全球最热门的手机&#xff0c;大家都知道一定是iPhone啦&#xff0c;作为系统和功能整合得最优秀的手机&#xff0c;不足的地方也非常明显&#xff0c;比如外壳不耐剐蹭&#xff0c;维修成本很高......&#xff0c;所以大多数果粉都会选择保护壳或者贴膜来保护自己…

水域大小 Java_leetcode —— 面试题 16.19. 水域大小

你有一个用于表示一片土地的整数矩阵land&#xff0c;该矩阵中每个点的值代表对应地点的海拔高度。若值为0则表示水域。由垂直、水平或对角连接的水域为池塘。池塘的大小是指相连接的水域的个数。编写一个方法来计算矩阵中所有池塘的大小&#xff0c;返回值需要从小到大排序。示…

python数组的切片操作_对Python 数组的切片操作

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里技术人对外发布原创技术内容的最大平台&…

使用缓存防击穿,解决微信”被动回复用户消息”重试回复问题

背景做微信公众号开发的时候&#xff0c;其中有个接收普通消息、接收事件推送 API。有这么条规则&#xff0c; ”微信服务器在五秒内收不到响应会断掉连接&#xff0c;并且重新发起请求&#xff0c;总共重试三次。假如服务器无法保证在五秒内处理并回复&#xff0c;可以直接回…