恶意用户可以修改viewstate吗?

时间:2012-11-08 05:12:53

标签: asp.net security sql-injection viewstate

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

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

2 个答案:

答案 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,并且修改将失败。