这可以追溯到我的另一个问题,我认为这个问题已经得到了足够的答案,但是反映我不确定是否已经(对不起)。
背景:
我正在动态生成表单。我从数据库中提取控件。
我必须将每个控件与不是用户会话ID的数据库ID相关联。我目前通过将我的ID存储在Web控件的ID中以及其他一些内容来使其独特/清楚我正在做的事情。
在帖子后面,我遍历网页上的所有控件,检查我的特殊标识符,即MyGeneratedTextBox_ID_Unique。此过程启用了两个重要步骤,确定控件是我生成的控件,并获取此输入字段的ID。
并且,所有这些都有效,但我仍然关注它的安全性。在这种情况下,我没有看到显示实际数据库ID的安全问题,尽管同意这是不可取的。但是,我担心以下可能性:
如果用户可以将恶意控件添加到我的集合中并将其用于SQL注入攻击。
更具学术性,但如果用户可以通过更改ID来以某种方式存储他们无法访问的字段的数据。
我同意这是一种做法的“黑客”。但我的问题是,这是一种安全风险吗?是否有一种“简单”的方式以较少的黑客方式做到这一点?
我假设只有在页面上创建/实例化的控件才会添加到控件列表中。因此所有控件都必须在服务器端创建,因此安全问题是地址但只是想验证。再次感谢。
PS: 我可以看到为每个控件添加一个属性,加密viewstate会更加安全。
答案 0 :(得分:1)
在ASP.NET 2.0安全性的原始指南中,他们明确声明您应该对从浏览器发回的每个输入执行输入验证。实际上没有任何东西阻止某人将不同的数据发布回服务器端代码。 ASP.NET内置了一些最小的请求验证,但它们明确表示不依赖于此。
您应始终验证从控件中回发的每个输入以确保数据完整性。应该通过删除可能表示攻击向量的不必要的特殊字符和模式来清除所有输入以进行SQL注入攻击。如果你所依赖的只是控件中的一个标识符来表示数据是好的,那么你的验证逻辑就会有一个很大的漏洞。
您应该对每个输入执行服务器端验证,以验证输入的格式是否良好以及它中是否包含有问题的数据。
答案 1 :(得分:1)
我假设只有在页面上创建/实例化的控件才会添加到控件列表中。因此所有控件都必须在服务器端创建,因此安全问题是地址但只是想验证。再次感谢。
您使用runat="server"
在服务器上“实时”创建的控件。您无需在控件集合中检查您的特殊ID。正如Harv所说,您需要验证控件的所有输入。
除非您的网络服务器受到损害,否则没有人可以向您的网页添加服务器控件。
答案 2 :(得分:0)
我将尝试回答我的问题,因为我认为这是唯一可行的方式:
创建服务器端控件的唯一方法是在服务器上,因此您可以相信他们将具有您设置它们的ID。这是必须在每个页面实例化上创建控件的一个原因。您可能不信任任何表单提交的数据,但控件和ID会生成服务器端,因此是安全的。同样,无法编辑HTML以生成服务器端控件。
因此,即使不优雅,我的方法也相对安全。唯一的安全漏洞是身份证明。
答案 3 :(得分:0)
我认为你自己回答的并没有错。但我觉得你还在混合一些东西(创建/实例化/控制定义与恢复ViewState /状态管理)。
以下两条信息可能有助于澄清一些事情:
我非常热情向使用ASP.NET(以及ViewState)的任何人推荐第二篇文章。