是否需要在查询字符串中屏蔽Id的修改号?

时间:2011-09-15 20:49:23

标签: security urlhacks

我的同事坚持使用全局修改号来掩盖查询字符串ID是一个好主意。

public static readonly int ModificationNumber = 9081234;

其他地方:

_addressID = Convert.ToInt32(Request.QueryString["AddressId"]) - ModificationNumber;

我似乎无法理解这一点。如果有人想尝试一些网址黑客攻击,那么修改号码就没有任何区别。

是否还有其他原因可以使网站更安全?

此外,有没有明确的理由这是坏事?在我看来,全局越少越好。

1 个答案:

答案 0 :(得分:1)

IMVHO你的同事走在正确的轨道上,但并不完全。

遵循的一个好规则是,您永远不应该在查询字符串中公开实际的ID,因为这可以提供数据库结构的线索,并使某些人更轻松地执行SQ​​L注入类型攻击(他们可以针对特定记录,因为他们知道ID)。

所以你的同事正在努力实现这一目标,尽管是以非常全面的方式。就个人而言,我不会这样做,因为聪明的攻击者解决你正在做的事情只是时间问题,然后找出幻数是什么。它也没有真正阻止针对特定记录的SQL注入攻击,因为生成的数字可能与现有密钥匹配。如果您依赖这种方法来避免SQL攻击,那么您就会遇到需要解决的更深层次的问题。

修改

提及替代方案可能是公平的事情。 当您使用C#并从查询字符串中提取参数时,我将假设您使用的是ASP.NET。在这种情况下,重要的ID可以保存在Session或Cache中。您可以将一堆项目存储在自定义数据对象中,然后将其存储在Session中(这样可以节省大量ID,您只需要知道一个ID)。 ASP.NET为您管理Web应用程序的会话,它对每个用户都是唯一的,当您从一个页面转换到另一个页面时,您可以使用它来存储内容。

如果您手动跟踪会话或使用数据库来保存与会话相关的信息,那么您仍然可以使用生成的GUID作为其密钥将上述数据对象序列化到数据库中,并将该GUID附加到查询字符串(有如果用户使用GUID来尝试并假设其他人的会话,那么成功的可能性非常低,您可以通过将两个GUID连接为关键等来进一步降低这种机会。)