0

这又回到了我认为已经足够回答的另一个问题,但经过反思我不确定它是(对不起)。

背景资料:

  1. 我正在动态生成一个表单。我从数据库中提取控件。

  2. 我必须将每个控件与不是用户会话 ID 的数据库 ID 相关联。我目前通过将我的 ID 与其他一些东西一起存储在 Web 控件的 ID 中来做到这一点,以使其唯一/清楚我在做什么。

  3. 在回帖中,我遍历网页上的所有控件,检查我的特殊标识符,即 MyGeneratedTextBox_ID_Unique。此过程支持 2 个重要步骤,识别控件是我生成的控件,并获取此输入字段的 ID。

而且,所有这些都有效,但我仍然担心它的安全性。在这种情况下,我没有看到显示实际数据库 ID 的安全问题,尽管我同意这是不可取的。但是,我担心以下可能性:

  1. 如果用户可以向我的集合添加恶意控件并将其用于 SQL 注入攻击。

  2. 更具学术性,但如果用户可以通过更改 id 以某种方式存储他们无权访问的字段的数据。

我同意这是一种“破解”方式。但我的问题是,这是否存在安全风险,是否有一种“简单”的方式来减少黑客攻击?

我假设只有在页面上创建/实例化的控件才会添加到控件列表中。因此,所有控件都必须在服务器端创建,因此安全问题已得到解决,但只是想验证。再次感谢。

PS:我可以看到为每个控件添加一个属性并加密视图状态会更安全一些。

4

4 回答 4

1

在 ASP.NET 2.0 安全性的原始指南中,他们特别声明您应该对从浏览器回传的每个输入执行输入验证。确实没有什么可以阻止某人将不同的数据发回您的服务器端代码。ASP.NET 中内置了一些最小的请求验证,但他们明确声明不要依赖它。

您应该始终验证从控件回发的每个单独输入的数据完整性。所有输入都应该通过删除可能表明攻击向量的不必要的特殊字符和模式来针对 SQL 注入攻击进行清理。如果您所依赖的只是来自控件的标识符来表示数据是好的,那么您的验证逻辑中有一个巨大的漏洞。

您应该对每个输入执行服务器端验证,以验证输入的格式是否良好以及其中不包含有问题的数据。

http://msdn.microsoft.com/en-us/library/ms998258.aspx

于 2010-04-23T20:43:08.833 回答
1

我假设只有在页面上创建/实例化的控件才会添加到控件列表中。因此,所有控件都必须在服务器端创建,因此安全问题已得到解决,但只是想验证。再次感谢。

您在服务器上使用runat="server". 您无需在控件集合中检查您的特殊 ID。正如 Harv 所说,您确实需要验证来自控件的所有输入。

除非您的 Web 服务器遭到入侵,否则没有人可以将服务器控件添加到您的页面。

于 2010-04-23T22:06:15.337 回答
0

我将尝试回答我的问题,因为我认为这是唯一的方法:

创建服务器端控件的唯一方法是在服务器上,因此您可以相信它们也将具有您设置的 ID。这是必须在每个页面实例化上创建控件的原因之一。您可能不信任任何表单提交的数据,但控件和 ID 是在服务器端生成的,因此是安全的。同样,也不可能编辑 HTML 以生成服务器端控件。

因此,我的方法即使不优雅也相对安全。唯一的安全漏洞是显示的 ID。

于 2010-04-23T21:47:27.550 回答
0

我认为您自己的回答没有错。但是我觉得您仍然在混淆一些事情(控件的创建/实例化/定义与恢复 ViewState/状态管理)。

也许以下两条信息有助于澄清一些事情:

非常热烈地向任何使用 ASP.NET(以及 ViewState)的人推荐第二篇文章。

于 2010-04-23T22:24:25.763 回答