如果在 ASP.NET 应用程序中启用了 ViewStatemac,用户是否可以修改 ViewState 中的内容并将其成功传递回服务器?
我有一个应用程序(其他人编写的),它使用 ViewState 中的内容在 SQL 查询中创建非参数化ORDER BY
子句。我应该担心 SQL 注入吗?
如果在 ASP.NET 应用程序中启用了 ViewStatemac,用户是否可以修改 ViewState 中的内容并将其成功传递回服务器?
我有一个应用程序(其他人编写的),它使用 ViewState 中的内容在 SQL 查询中创建非参数化ORDER BY
子句。我应该担心 SQL 注入吗?
如果启用了 ViewStateMAC,攻击者需要能够破解“机器密钥”才能更改 ViewState,因此如果该值保持私有,它应该是相当安全的。
值是在代码后面(例如ViewState["OrderBy"]
)而不是通过控件设置的吗?如果是这样,这将不受事件验证的约束。
是的,您可以修改视图状态并将其发布回来,只需将页面作为 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开启,修改会失败。