作为默认ASP.Net控件集-ALL的一部分的控件是否始终使用viewstate或controlstate?
即,如果我将下面的代码放到一个全新的web表单上,我的SQL字符串是否处于未加密的控制状态?
<asp:SqlDataSource ID="mobileData" runat="server"
DataSourceMode="DataReader"
SelectCommand="SELECT * from ma.bob WHERE Vendor IS NOT NULL"
/>
我知道如何加密视图状态和控制状态,但对我来说,这种常见的用例可能非常不安全,这似乎很疯狂。当然可以通过修改controlstate来执行SQL注入攻击吗?
我想大多数人都会考虑为敏感应用程序加密controlstate,但实际上,如果我的假设是真的,那么应该一直这样做,visualstudio应该默认启用它?
我想得对吗,还是我的想法不对?
要回答您的问题,否
来自MSDN
出于安全目的,SelectCommand属性不存储为视图状态。因为可以解码视图的内容客户端上的状态,存储有关数据库的敏感信息视图状态中的结构可能导致信息披露弱点
此信息从不存储在ViewState中。
并非所有属性都像这个一样创建
public string SomeProperty
{
get
{
object obj = ViewState["SomeProperty"];
return (obj == null) ? 0 : (string)obj;
}
set
{
ViewState["SomeProperty"] = value;
}
}
SelectCommand这里是由PageParser在生成的C#/Vb类中分配的。该类将包含一些类似的行
mobileData.SelectCommand="SELECT * from ma.bob WHERE Vendor IS NOT NULL"
并且每次请求页面时都进行该分配。ASP.Net没有必要将其保留在ViewState中。
然而,如果你做了类似的事情
<asp:HiddenField runat="server" Value="SELECT * from ma.bob WHERE Vendor IS NOT NULL" />
这将转到ViewState(我所说的解析器在这里也是正确的,但setter在这里实现了ViewState机制)