PHP安全编程:打开远程文件的风险
2012-05-09 00:00
1716 查看
PHP有一个配置选项叫allow_url_fopen,该选项默认是有效的。它允许你指向许多类型的资源,并像本地文件一样处理。例如,通过读取URL你可以取得某一个页面的内容(HTML):
当被污染数据用于include和require的文件指向时,会产生严重漏洞。实际上,我认为这种漏洞是PHP应用中最危险的漏洞之一,这是因为它允许攻击者执行任意代码。尽管严重性在级别上要差一点,但在一个标准文件系统函数中使用了被污染数据的话,会有类似的漏洞产生:
该例使用户能操纵file_get_contents( )的行为,以使它获取远程资源的内容。考虑一下类似下面的请求:
http://example.org/file.php?file ... mple.org%2Fxss.html
这就导致了$content的值被污染的情形,由于这个值是通过间接方式得到的,因此很可能会忽视这个事实。这也是深度防范原则会视文件系统为远程的数据源,同时会视$content的值为输入,这样你的过滤机制会潜在的起到扭转乾坤的作用。
由于$content值是被污染的,它可能导致多种安全漏洞,包括跨站脚本漏洞和SQL注入漏洞。例如,下面是跨站脚本漏洞的示例:
解决方案是永远不要用被污染的数据去指向一个文件名。要坚持过滤输入,同时确信在数据指向一个文件名之前被过滤即可:
尽管无法保证$content中的数据完全没有问题,但这还是给出了一个合理的保证,即你读取的文件正是你想要读取的文件,而不是由攻击者指定的。为加强这个流程的安全性,你同样需要把$content看成是输入,并在使用前对它进行过滤。
上面的流程提供了防范多种攻击的强有力的方法,同时在实际编程中推荐使用。
PHP安全编程:register_globals的安全性
PHP安全编程:不要让不相关的人看到报错信息
PHP安全编程:网站安全设计的一些原则
PHP安全编程:可用性与数据跟踪
PHP安全编程:过滤用户输入
PHP安全编程:对输出要进行转义
PHP安全编程:表单与数据安全
PHP安全编程:从URL的语义进行攻击
PHP安全编程:文件上传攻击的防御
PHP安全编程:跨站脚本攻击的防御
PHP安全编程:跨站请求伪造CSRF的防御
PHP安全编程:关于表单欺骗提交
PHP安全编程:HTTP请求欺骗
PHP安全编程:不要暴露数据库访问权限
PHP安全编程:防止SQL注入
PHP安全编程:cookie暴露导致session被劫持
PHP安全编程:session固定获取合法会话
PHP安全编程:session劫持的防御
PHP安全编程:防止源代码的暴露
PHP安全编程:留心后门URL
PHP安全编程:阻止文件名被操纵
PHP安全编程:文件包含的代码注入攻击
PHP安全编程:文件目录猜测漏洞
PHP安全编程:打开远程文件的风险
PHP安全编程:shell命令注入
PHP安全编程:暴力破解攻击
PHP安全编程:密码嗅探与重播攻击
PHP安全编程:记住登录状态的安全做法
PHP安全编程:共享主机的源码安全
PHP安全编程:更优的会话数据安全
PHP安全编程:会话数据注入
PHP安全编程:主机文件目录浏览
PHP安全编程:PHP的安全模式
<?php $contents = file_get_contents('http://www.nowamagic.net/'); ?>
当被污染数据用于include和require的文件指向时,会产生严重漏洞。实际上,我认为这种漏洞是PHP应用中最危险的漏洞之一,这是因为它允许攻击者执行任意代码。尽管严重性在级别上要差一点,但在一个标准文件系统函数中使用了被污染数据的话,会有类似的漏洞产生:
<?php $contents = file_get_contents($_GET['filename']); ?>
该例使用户能操纵file_get_contents( )的行为,以使它获取远程资源的内容。考虑一下类似下面的请求:
http://example.org/file.php?file ... mple.org%2Fxss.html
这就导致了$content的值被污染的情形,由于这个值是通过间接方式得到的,因此很可能会忽视这个事实。这也是深度防范原则会视文件系统为远程的数据源,同时会视$content的值为输入,这样你的过滤机制会潜在的起到扭转乾坤的作用。
由于$content值是被污染的,它可能导致多种安全漏洞,包括跨站脚本漏洞和SQL注入漏洞。例如,下面是跨站脚本漏洞的示例:
<?php $contents = file_get_contents($_GET['filename']); echo $contents; ?>
解决方案是永远不要用被污染的数据去指向一个文件名。要坚持过滤输入,同时确信在数据指向一个文件名之前被过滤即可:
<?php $clean = array(); /* Filter Input ($_GET['filename']) */ $contents = file_get_contents($clean['filename']); ?>
尽管无法保证$content中的数据完全没有问题,但这还是给出了一个合理的保证,即你读取的文件正是你想要读取的文件,而不是由攻击者指定的。为加强这个流程的安全性,你同样需要把$content看成是输入,并在使用前对它进行过滤。
<?php $clean = array(); $html = array(); /* Filter Input ($_GET['filename']) */ $contents = file_get_contents($clean['filename']); /* Filter Input ($contents) */ $html['contents'] = htmlentities($clean['contents'], ENT_QUOTES, 'UTF-8'); echo $html['contents']; ?>
上面的流程提供了防范多种攻击的强有力的方法,同时在实际编程中推荐使用。
延伸阅读
此文章所在专题列表如下:PHP安全编程:register_globals的安全性
PHP安全编程:不要让不相关的人看到报错信息
PHP安全编程:网站安全设计的一些原则
PHP安全编程:可用性与数据跟踪
PHP安全编程:过滤用户输入
PHP安全编程:对输出要进行转义
PHP安全编程:表单与数据安全
PHP安全编程:从URL的语义进行攻击
PHP安全编程:文件上传攻击的防御
PHP安全编程:跨站脚本攻击的防御
PHP安全编程:跨站请求伪造CSRF的防御
PHP安全编程:关于表单欺骗提交
PHP安全编程:HTTP请求欺骗
PHP安全编程:不要暴露数据库访问权限
PHP安全编程:防止SQL注入
PHP安全编程:cookie暴露导致session被劫持
PHP安全编程:session固定获取合法会话
PHP安全编程:session劫持的防御
PHP安全编程:防止源代码的暴露
PHP安全编程:留心后门URL
PHP安全编程:阻止文件名被操纵
PHP安全编程:文件包含的代码注入攻击
PHP安全编程:文件目录猜测漏洞
PHP安全编程:打开远程文件的风险
PHP安全编程:shell命令注入
PHP安全编程:暴力破解攻击
PHP安全编程:密码嗅探与重播攻击
PHP安全编程:记住登录状态的安全做法
PHP安全编程:共享主机的源码安全
PHP安全编程:更优的会话数据安全
PHP安全编程:会话数据注入
PHP安全编程:主机文件目录浏览
PHP安全编程:PHP的安全模式
相关文章推荐
- PHP安全编程之打开远程文件的风险
- php打开远程文件的方法和风险及解决方法
- php打开远程文件的方法和风险及解决方法
- PHP安全-远程文件风险
- PHP中打开或包含远程文件时要注意的问题
- PHP安全编程:文件上传攻击的防御
- PHP安全编程之文件包含的代码注入攻击
- PHP安全编程:文件目录猜测漏洞
- php判断远程文件或网站是否能打开
- PHP安全编程:文件包含的代码注入攻击
- PHP安全编程之文件上传攻击的防御
- PHP安全编程:主机文件目录浏览(转)
- PHP安全编程:文件包含的代码注入攻击
- PHP安全编程:主机文件目录浏览
- PHP文件操作 之打开远程文件
- PHP安全编程之主机文件目录浏览
- PHP安全编程:主机文件目录浏览
- PHP安全编程:文件上传攻击的防御
- PHP 安全手册 第七条 文件上传操作进行规避一些风险
- 关于office 2013的使用,在打开word文件的时候,需要进入安全模式才能启动WORD的解决办法