【问题标题】:Check referrer?检查推荐人?
【发布时间】:2010-12-10 19:24:13
【问题描述】:

我遇到了问题。我有这个代码:

$theUrl = $_GET["url"];
include("$theUrl.php");

这样获取url,例如:http://mywebsite.com/index.php?url=test

但是如果有人放进去怎么办:

http://mywebsite.com/index.php?url=http://theirwebsite.com/someEvilscript

如何避免这种情况?我只想执行我服务器上的脚本,而不是来自其他网站的脚本。感谢您的帮助。

【问题讨论】:

  • 你的意思是这不会发生?
  • 基本上答案很简单。不要做那样的事情。永远不要相信用户输入...
  • @ajreal:它会发生。在您发布的文档中:if "URL fopen wrappers" are enabled in PHP (which they are in the default configuration), you can specify the file to be included using a URL...
  • 是的,但一定有办法解决问题...
  • 基本上答案很简单。通过 HTTP 包含是有史以来最愚蠢的事情

标签: php remote-file-inclusion


【解决方案1】:

处理此问题的一个好方法是定义可以包含的文件的白名单。如果该列表中没有任何内容,则应将其视为邪恶并且永远不会包括在内。

例如:

<?php
$allowed = array('file1', 'file2', 'file3');

if (in_array($_GET["url"], $allowed)) {
    // You can include
} else {
   // Error message and dont include
}
?>

注意:正如评论中所建议的,允许列表可以通过扫描允许的目录来动态填充。

【讨论】:

  • 一种选择是先扫描目录并获取所有文件的列表,然后检查请求的文件是否在该列表中...这样您就不需要硬-将链接编码在...
【解决方案2】:

你真的不应该有任何看起来像那样的代码。我的意思是真的。你想用这个来达到什么目的?我敢肯定还有另一种没有风险的方法(让我们说一般的丑陋)。

就像 HoLyVieR 建议的那样,将可包含的内容列入白名单是确保当前代码安全的关键。

【讨论】:

    【解决方案3】:

    您为什么不在您的网站上创建test.php,并在链接中使用http://mywebsite.com/test.php?这样,如果需要,您可以在 test.php(和其他脚本)中包含您的初始化脚本。

    【讨论】:

      猜你喜欢
      • 2011-01-03
      • 1970-01-01
      • 2017-07-15
      • 2011-09-07
      • 1970-01-01
      • 2010-11-27
      • 2014-02-26
      • 2021-05-28
      • 2011-08-21
      相关资源
      最近更新 更多