如果在ASP.NET应用程序中启用了ViewStatemac,用户是否可以修改ViewState中的内容并将其成功传递回服务器?
我有一个应用程序(其他人写的)正在使用ViewState中的内容在SQL查询中创建一个非参数化的ORDER BY
子句。我应该担心SQL注入吗?
答案 0 :(得分:2)
如果启用了ViewStateMAC,攻击者需要能够破解“机器密钥”才能更改ViewState,因此如果此值保密,则应该相当安全。
代码中的值是否设置在后面(例如ViewState["OrderBy"]
)而不是通过控件?如果是这样,这将不受事件验证的影响。
答案 1 :(得分:1)
是的,您可以修改视图状态并将其发回,通过简单的方式将页面粘贴到本地网站,然后修改它。
如果您打开EventValidation Property,那么在回发后验证将失败并且不被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>
更改为<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,并且修改将失败。