这段代码是否容易受到黑客攻击?

时间:2009-07-31 08:03:49

标签: php security url variables

我对在线网络应用程序非常陌生。我使用的是php,我得到了这段代码:

if(isset($_GET['return']) && !empty($_GET['return'])){
return = $_GET['return'];
header("Location: ./index.php?" . $return);    
} else {
header("Location: ./index.php");    

}

$return变量是URL变量,黑客可以轻松更改。

例如,我从$return

获取www.web.com/verify.php?return=profile.php变量

我有什么需要注意的吗?我应该在这一行中使用htmlentities:

header("Location: ./index.php?" . htmlentities($return));    

是否容易受到黑客攻击?

我应该怎样做才能防止黑客攻击?

6 个答案:

答案 0 :(得分:5)

除了第2行的拼写错误(应该是$ return = $ _GET ['return'];)你应该$return = urlencode($return)来确保$ return是一个有效的QueryString,因为它作为参数传递给索引.PHP。

然后,

index.php应验证返回是用户有权访问的有效URL。我不知道你的index.php是如何工作的,但是如果它只是显示一个页面,那么你最终会得到像index.php?/ etc / passwd或类似的东西,这可能确实是一个安全问题。

修改:您获得了哪些安全漏洞?我可以看到两个可能的问题,具体取决于index.php如何使用返回值:

  • 如果index.php将用户重定向到目标页面,那么我可以将您的站点用作中继,将用户重定向到我控制的站点。这可以用于网络钓鱼(我创建一个看起来与您的网站完全相同的网站,并询问用户的用户名/密码)或仅用于广告。
  • 如果index.php显示来自return-parameter的文件,我可以尝试传入一些系统文件的名称,如/ etc / passwd,并获取所有用户的列表。或者我可以传递类似../config.php的内容并获取数据库连接
    • 我认为这不是这种情况,但这是一个常见的安全漏洞,我仍然想指出它。

如上所述,您希望确保通过查询字符串传入的URL有效。一些方法可以是:

  • $ newurl =“http://yoursite/”。 $回报;
    • 这可以确保您始终只在您的域上,并且永远不会重定向到任何其他域
  • $ valid = file_exists($ return)
    • 如果$ return始终是硬盘驱动器上存在的页面,则此方法有效。通过检查返回确实指向有效文件,您可以过滤掉伪造的条目
    • 如果return会接受querystrings(即return = profile.php?step = 2),那么你需要解析“profile.php”路径
  • 列出$ return的有效值列表并与之进行比较
    • 这通常是不切实际的,除非你真的设计了你的应用程序,以便index.php只能返回一组给定的页面

有很多方法可以为这只猫提供皮肤,但通常你想要以某种方式验证$ return指向有效目标。这些有效目标取决于您的规格。

答案 1 :(得分:3)

如果您运行的是PHP 4或5的旧版本,那么我认为您将容易受到标头注入的攻击 - 有人可以设置返回URL,然后返回行,然后是他们想要的任何其他标头让您的服务器发送。

您可以先通过清理字符串来避免这种情况。剥离行返回可能就足够了,但最好有一个允许的字符列表 - 这可能是不切实际的。

  

4.4.2 5.1.2 :此功能现在可以阻止多个标头   立即发送作为保护   标题注入攻击。

http://php.net/manual/en/function.header.php

答案 2 :(得分:2)

如果您放入一个不存在的页面会发生什么。例如:

return=blowup.php

return=http://www.google.co.uk

return=http%3A%2F%2Fwww.google.co.uk%2F

您可以通过在变量中不包含.php来模糊引用。然后,您可以将其附加到代码隐藏中并检查目录中是否存在该文件/在重定向到它之前使用允许值的switch语句。

答案 3 :(得分:1)

在这种情况下,它更多地取决于index.php上查询字符串的那部分所做的工作。如果它被发送到数据库查询,输出,eval()exec()是,它是一个非常常见的安全漏洞。 大多数其他情况将是未经过滤的安全,但最好编写自己的通用清理函数,将所有变量的引号转换为HTML实体,以及等于符号。

答案 4 :(得分:1)

我要做的事情是:

  1. 定义,允许哪种类型的返回值?
  2. 记下所有类型的可能返回值。
  3. 然后,得出结论:不允许使用哪些字符,最大网址长度是多少,允许哪些域名等等。
  4. 最后:根据上述结论制作过滤功能。

答案 5 :(得分:1)

我的黑客可以做到这一点   如果$_GET['return']包含任何内容,您将重定向   黑客可以将它用作xss   重定向到病毒或任何类似的东西   但是没有能力做任何其他事情