本节内容:
php打开远程文件
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看成是输入,并在使用前对它进行过滤。