【问题标题】:How safe is file_get_contents() while retrieving a local file path, not user inputtedfile_get_contents() 在检索本地文件路径时有多安全,而不是用户输入
【发布时间】:2019-01-05 03:04:24
【问题描述】:

我有用户输入的 HTML 内容存储在没有扩展名的文件、系统命名的文件夹而不是用户命名的文件中。

>    file_put_contents($DBStoredFolder.'/'.$DBStoredFilename, $UserInputHtml);

检索内容并打印它有多安全?

>    $content = file_get_contents($DBStoredFolder.'/'.$DBStoredFilename);
>    echo '<html><body>'.$content.'</body></html>';

没有扩展名的文件是否只能通过固定路径上的 file_get_contents 访问,然后回显,运行 PHP 代码?

我知道返回的 html 在浏览器上运行时需要受到保护,但那是另一回事。

【问题讨论】:

  • 谢谢,我做了研究,也看到了很多关于 SO 的问题,但总是引用路径和文件名,而不是内容。由于 PHP 文档说它只将结果作为字符串返回,并且它的路径是服务器确定的,我认为它是一种安全的方式。您对如何改进有什么建议吗?
  • 问题是您正在显示用户输入的 HTML。
  • @PaulCrovella 这也是我需要的,但我想确保 file_get_contents 只返回字符串上的文件并且不执行任何代码(例如:eval();) 并且可能 htmlentities() 不是够了

标签: php file security file-io file-get-contents


【解决方案1】:

一般没有办法回答这个问题。

如果您完全可以控制文件名(即,用户输入不可能干扰文件名),那么在该路径打开文件是安全的。

如果您完全控制文件的内容(即,它不可能是用户上传或用户编辑的文件),那么显示它是安全的。

如果您完全可以控制文件中的格式并且可以确定它已经是 HTML,那么在显示之前无需转义或清理内容。

但几乎总是,其中一个或多个假设并不真正有效。你如何应对不确定性完全取决于具体情况。一般来说,清理文件名、清理文件内容、清理显示、清理所有内容。

就我个人而言,我宁愿对我控制的文件名过于谨慎,也不愿冒着在不知不觉中引入用户输入的风险。

【讨论】:

  • 我可以完全控制文件名,但不能控制内容,因为它必须接受用户编辑的 HTML 和 JS。我也在预防方面,这就是为什么我想确保 file_get_contents 只返回字符串上的文件并且不执行 [Ex: eval(); 之间的任何代码。 ]。在那种情况下,文件上的 htmlentities() 是不够的。
  • PHP 只做你告诉它去做的事情。如果你不运行eval(),它不会评估。危险不在于 PHP 会突然自行运行代码;就是在浏览器中显示受污染的文件内容,然后将呈现并执行该文件所说的任何内容。
  • 感谢您的回答。没有扩展名的文件只能通过 file_get_contents 访问然后回显,运行 PHP 代码吗?我知道返回的 html 在浏览器上运行时需要受到保护,但那是另一回事。再次感谢!
猜你喜欢
  • 2010-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-09
  • 1970-01-01
相关资源
最近更新 更多