通过URL传递GUID的安全风险

时间:2013-02-21 11:30:19

标签: asp.net security guid

我正在从安全角度提出有关使用GUID的一些建议。我开发了一个ASP.Net应用程序。它为用户提供对Web服务器上不存在的某些材料(如文档和照片)的访问权限。这些存储在文件服务器上。我有一个'GetResource.aspx'页面,它获取资源的ID,使用System.IO打开它.FileInfo将它写入响应流并返回它。

因此,GetResource.aspx?id = 123会返回一个用户有权访问的图片。当然,用户可以手动输入URL作为GetResource.aspx?id = 456,在这种情况下,将返回具有该ID的图片/文档等,并且可能不是他们有权访问的。

所以显然使用整数ID是不够的。使用GUID作为ID提供足够的“随机性”,我可以可靠地假设用户永远不能手动输入“GetResource.aspx?guid = {A guessed guid}”并期望访问有效资源,包括使用脚本每秒做出许多随机猜测?

或者,没有替代方法可以从Session变量确定用户的ID,确定他确实可以访问所请求的资源,然后才返回它(在我写这篇文章时我越来越相信案件!)。

由于

3 个答案:

答案 0 :(得分:6)

如果用户是受保护的内容,则应在盲目提供之前确定用户是否已获得授权。

GUID确实在某种程度上有所帮助,它使猜测网址更难,所以我仍然建议使用它们。但URL仍然可以共享(甚至意外)。如果您只是提供内容,无论谁提出请求,那么它几乎没有真正的保护。

答案 1 :(得分:5)

对用户进行身份验证并查看他们是否有权访问该资源肯定无法替代。你在这里提出的建议是一种方法,使用户更难找到他们无权查看的文件的有效身份证明(错误或故意)。

GUID肯定足够大,你永远不会得到"意外"有效的ID在实践中。这使得没有授权的GUID会检查一个效果很好的系统,只要没有人主动尝试破解它。另一方面,授权检查是一个即使在主动攻击者在场的情况下也能很好地工作的系统(当然这取决于攻击者可以设法做什么)。

您应该在两种方法之间进行选择,具体取决于您的应用程序的性质(是公开的吗?用户是否知道并对其行为负责?对于安全漏洞有多糟糕?)。 / p>

答案 2 :(得分:0)

如果您认为内容受限制且拥有某些个人数据,那么您应该使用用户名和密码。