我对在线网络应用程序非常陌生。我使用的是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));
是否容易受到黑客攻击?
我应该怎样做才能防止黑客攻击?
答案 0 :(得分:5)
除了第2行的拼写错误(应该是$ return = $ _GET ['return'];)你应该$return = urlencode($return)来确保$ return是一个有效的QueryString,因为它作为参数传递给索引.PHP。
然后,index.php应验证返回是用户有权访问的有效URL。我不知道你的index.php是如何工作的,但是如果它只是显示一个页面,那么你最终会得到像index.php?/ etc / passwd或类似的东西,这可能确实是一个安全问题。
修改:您获得了哪些安全漏洞?我可以看到两个可能的问题,具体取决于index.php如何使用返回值:
如上所述,您希望确保通过查询字符串传入的URL有效。一些方法可以是:
有很多方法可以为这只猫提供皮肤,但通常你想要以某种方式验证$ return指向有效目标。这些有效目标取决于您的规格。
答案 1 :(得分:3)
如果您运行的是PHP 4或5的旧版本,那么我认为您将容易受到标头注入的攻击 - 有人可以设置返回URL,然后返回行,然后是他们想要的任何其他标头让您的服务器发送。
您可以先通过清理字符串来避免这种情况。剥离行返回可能就足够了,但最好有一个允许的字符列表 - 这可能是不切实际的。
4.4.2 和 5.1.2 :此功能现在可以阻止多个标头 立即发送作为保护 标题注入攻击。
答案 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)
我要做的事情是:
答案 5 :(得分:1)
我的黑客可以做到这一点
如果$_GET['return']
包含任何内容,您将重定向
黑客可以将它用作xss
重定向到病毒或任何类似的东西
但是没有能力做任何其他事情