假设您有一个重定向页面,其中客户端从查询字符串重定向到 URL:
http://victim/redirect.aspx?url=http://evil/
您确实需要能够重定向到另一个页面或 URL,如何防止此功能被利用?
OWASP 说:
建议将任何此类目标输入映射到一个值,而不是实际的 URL 或 URL 的一部分,并且服务器端代码将此值转换为目标 URL。
有人可以举个例子来解释一下吗?
假设您有一个重定向页面,其中客户端从查询字符串重定向到 URL:
http://victim/redirect.aspx?url=http://evil/
您确实需要能够重定向到另一个页面或 URL,如何防止此功能被利用?
OWASP 说:
建议将任何此类目标输入映射到一个值,而不是实际的 URL 或 URL 的一部分,并且服务器端代码将此值转换为目标 URL。
有人可以举个例子来解释一下吗?
不要提供实际的 URL 作为脚本的参数。相反,请提供一些 ID,您可以将其转换为重定向脚本中的 URL。
例如redirect.aspx?url=1
,改为使用,并在脚本中,使用地图、数据库查找或任何您认为有用的东西将 ID 1 转换为某个 URL。
这样,只能重定向到一组固定的受信任 URL。
开放式重定向意味着可以动态确定重定向值。
推荐的是只有一个预定义的允许列表。您有一种机制允许授权用户输入 URL,或者这可能是 CMS 或 Web 应用程序的自动功能,用于查找出站链接然后创建条目。您确定人员或自动化流程“添加”链接所需的标准,您也可以在发生这种情况时过滤或列入黑名单。
在服务器端,您将拥有一个数据库。您将至少向数据库添加一个 id 和实际 URL。您可能决定按顺序做一些除了 id 编号之外的事情,也许使用一些函数来创建半随机数,以通过简单地增加 id 值来防止枚举。就像是
| id | real_url | shortcode |
--------------------------------
| 1 | example.com | X3DFE |
| 2 | example.net | G4TG |
然后,您可能有一个 URL,例如:example.com/out?shortcode=X3DFE
您在服务器端处理它,然后发出重定向,real_url
如果短代码不在查找表中,您提供一条错误消息,说明其无效。
所以在服务器端是这样的:
$shortcode = filter_function($_GET['shortcode']);
$url = sql_select_function("SELECT 'real_url' FROM url_table WHERE shortcode ='" . $shortcode . "');
header("HTTP/1.1 301 Moved Permanently");
header("Location: " . $url . "");
具体细节显然取决于您的语言和您想要完成的其他任务。
您的数据库还可能包含其他信息,您可能需要对用户提交的链接进行审核,或者您可能希望包含创建链接的用户。您还可以记录点击次数等。
关键概念是您使用某种机制来预先确定列表并确保在服务器端做出重定向决定。这个想法是创建一个允许重定向的白名单。
我建议研究一些 URL 缩短器是如何作为其类似概念工作的,并且可以在您的目标语言中提供一些有用的代码。