1

这个问题是关于安全威胁的。我想知道下面的用法可以在客户端更改 DropDownList 选择的值并影响服务器端吗?

这里的用法(aspx定义)

  <asp:DropDownList AutoPostBack="true" ID="dropDownListDrawingArtists" CssClass="DropDownArtists"
                runat="server">
  </asp:DropDownList>

服务器端填充

    if (IsPostBack == false)
    {
        if (srLang == "tr")
        {
            dropDownListDrawingArtists.Items.Add("Çizen Artist Filtresi: Bütün Çizen Artistler");
        }
        else
        {
            dropDownListDrawingArtists.Items.Add("Drawing Artist Filter: All Drawing Artists");
        }

        DataSet dsDrawingArtists = DbConnection.db_Select_Query("select DrawingArtist,COUNT(PokemonId) as Pokecount from tblPokedex group by DrawingArtist order by Pokecount desc,DrawingArtist asc");

        for (int i = 0; i < dsDrawingArtists.Tables[0].Rows.Count; i++)
        {
            dropDownListDrawingArtists.Items.Add(dsDrawingArtists.Tables[0].Rows[i]["DrawingArtist"].ToString());
        }

        if (Session["FilterByArtist"] != null)
        {
            dropDownListDrawingArtists.SelectedIndex = Convert.ToInt32(Session["FilterByArtist"].ToString());
        }
    }

以及回发时的最终用法

    if (dropDownListDrawingArtists.SelectedIndex > 0)
    {
        srFilterByDrawingArtist = " and DrawingArtist='" + dropDownListDrawingArtists.SelectedItem.ToString() + "'";
        Session["FilterByArtist"] = dropDownListDrawingArtists.SelectedIndex.ToString();
    }

如您所见,我直接在 SQL 查询中使用它。我在谷歌浏览器上测试了自己。更改了 dropDownListDrawingArtists 的值并进行了回发。服务器端的值没有受到影响。只是要确定

感谢您的回答

ASP.NET 4.0 C# 4.0

4

3 回答 3

2

目前是否可行无关紧要。您仍然应该使用参数化查询而不是连接字符串。

其原因与 OWASP 将字符转义定义为与参数化查询和参数化存储过程相比“弱”,以及为什么白名单优于黑名单的原因相同。

OWASP 备忘单到防止 SQL 注入

第三种技术是在将用户输入放入查询之前对其进行转义。如果您担心将动态查询重写为准备好的语句或存储过程可能会破坏您的应用程序或对性能产生不利影响,那么这可能是您的最佳方法。但是,与使用参数化查询(强调我的)相比,这种方法是脆弱的,我们不能保证它会在所有情况下阻止所有 SQL 注入。仅应谨慎使用此技术以具有成本效益的方式改造遗留代码。从头开始构建的应用程序或需要低风险容忍度的应用程序应该使用参数化查询来构建或重写。

它脆弱的原因是有人总是在寻找一种新的方法来利用任何潜在的漏洞。今天可以防止篡改的方法明天可能会被规避。


也就是说,目前,ViewState 保护为此提供了保护。如果有人篡改了列表,他们通常会得到一个自动生成的“Invalid Viewstate”错误,并且代码不会处理。

http://msdn.microsoft.com/en-us/magazine/ff797918.aspx

但不要依赖这种行为。它可以关闭,我见过一个 Jr. Developer 关闭它以尝试解决错误。(感谢代码审查。)

于 2012-12-11T16:17:01.753 回答
1

从外观上看,您对 SQL 注入攻击非常开放。永远不应该使用字符串连接来与数据库通信。您如何知道用户没有使用程序与您的站点/应用程序进行通信?可以有各种各样的操作。

如果你让一扇门打开,所有的事情都会通过它。

于 2012-12-11T16:13:11.203 回答
0

是的,任何时候您接受任何类型的用户输入并将其直接修补到 SQL 查询中,都存在风险。

首先,您应该验证所有需要采用某种格式或几个已知值的输入。

其次,使用 SQL 查询参数而不是像您一样创建查询。

于 2012-12-11T16:13:14.080 回答