4

如果在 ASP.NET 应用程序中启用了 ViewStatemac,用户是否可以修改 ViewState 中的内容并将其成功传递回服务器?

我有一个应用程序(其他人编写的),它使用 ViewState 中的内容在 SQL 查询中创建非参数化ORDER BY子句。我应该担心 SQL 注入吗?

4

2 回答 2

2

如果启用了 ViewStateMAC,攻击者需要能够破解“机器密钥”才能更改 ViewState,因此如果该值保持私有,它应该是相当安全的。

值是在代码后面(例如ViewState["OrderBy"])而不是通过控件设置的吗?如果是这样,这将不受事件验证的约束。

于 2012-11-09T12:50:09.747 回答
1

是的,您可以修改视图状态并将其发布回来,只需将页面作为 html 复制粘贴到本地站点,然后对其进行修改。

如果您打开了EventValidation 属性,那么在回发时验证将失败并且不会被 asp.net 接受- 默认情况下它是打开的。

asp.net 为该属性的页面上的每个控件和每个事件保存一个哈希文件,并在回发时对其进行验证。如果此失败,则不继续。如果你有这个关闭,那么它可以做你所说的。

看看这个简单的 html 表单:

<form name="input" action="someaction.asp" method="post">
    <select name="sel">
      <option value="1" >Milk</option>
      <option value="2" >Coffee</option>
      <option value="3" >Tea</option>
    </select>
<input type="submit" value="Submit">
</form>

任何人都可以更改<option value="1" >Milk</option>to<option value="1 OR 1=1" >Milk</option>并将其按原样发布,因此您需要在渲染之前添加哈希码并将其与其余部分一起发布,并验证值是否相同(返回相同的哈希)。

一些网站和编码人员选择在回发时加密每个值,例如,如果您看到亚马逊,您会注意到以下行:

<input name="offeringID.1" value="y3A0L7tSnS%2B7LBLvI....morehere" type="checkbox" id="fbt_x_check" style="display: none;" class="check" checked="checked">

而你如果使用自定义的html控件则需要添加你个人验证的值,避免被修改。

asp.net 开发人员决定对所有控件进行总哈希值,并将其保存在 EventValidation 上。

所以保持EventValidation开启,修改会失败。

于 2012-11-08T08:08:41.760 回答