【问题标题】:Can asp:DropDownList be a security threat?asp:DropDownList 会是安全威胁吗?
【发布时间】:2012-12-11 16:09:56
【问题描述】:

这个问题是关于安全威胁的。我想知道下面的用法可以在客户端更改 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

【问题讨论】:

  • 您正在接受 sql 注入。至少使用参数。此外,假设用户可以并且将向您的页面提供恶意数据。
  • As you can see i am directly using it at the SQL query 你永远不应该在你编写的任何应用程序中这样说。您的 SQL 查询应使用参数化查询来合并通过用户输入提供的任何数据。
  • 服务我完全知道。但如果数据无法更改,为什么还要麻烦?
  • @MonsterMMORPG 因为您重视数据的安全性,并且不希望创建小鲍比表可以破坏整个数据库的漏洞。除非你当然不关心这个,在这种情况下为什么要首先问。

标签: c# asp.net security drop-down-menu postback


【解决方案1】:

目前是否可行无关紧要。您仍然应该使用 parameterized queries 而不是连接字符串。

原因与 OWASP 将字符转义定义为与参数化查询和参数化存储过程相比“弱”的原因相同,以及为什么 white listing is better than blacklisting

来自OWASP cheat sheet to Preventing SQL Injection

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

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


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

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

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

【讨论】:

  • 我知道 sql 注入,但您的回答与我的问题无关。好的,所以无法更改下拉列表数据?
  • 对不起,我还在编辑。我必须验证我要添加的内容。 - 看答案中的行下方。
  • That said, currently, the ViewState protection offers protection for this. 虽然可以关闭保护。我知道人们有时会这样做,因为他们想通过 javascript 动态修改下拉菜单以创建级联下拉菜单。
  • 现在这有一个正确的观点:它脆弱的原因是有人总是在寻找一种新的方法来利用任何潜在的漏洞。今天可以防止篡改的方法明天可能会被规避。
【解决方案2】:

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

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

【讨论】:

  • 我知道 sql 注入,但您的回答与我的问题无关。我在这里问下拉列表。
  • 相关,只是你还不知道。
【解决方案3】:

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

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

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

【讨论】:

  • 我知道 sql 注入,但你的回答与我的问题无关
  • 你怎么了?它相关的,出于我提到的两个原因。首先,您必须验证所有需要是几个已知值之一的输入(即任何类型的列表)。其次,您不能只从任何来源(包括下拉列表值)获取值并将它们插入 SQL 查询。
猜你喜欢
  • 2012-06-19
  • 2021-01-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多