1

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

public static readonly int ModificationNumber = 9081234;

在其他地方:

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

我似乎无法理解这一点。如果有人想尝试一些 url hacking,那么修改号根本没有区别。

还有其他原因会使网站更安全吗?

此外,这有什么不好的明确原因吗?在我看来,全局变量越少越好。

4

1 回答 1

1

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

一个很好的规则是你永远不应该在查询字符串中暴露实际的 ID,因为这会为你的数据库的结构提供线索,并使某人更容易执行 SQL 注入类型的攻击(他们可以针对特定记录,因为他们知道 ID)。

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

编辑

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

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

于 2011-09-16T01:56:50.040 回答