【问题标题】:preventing my application from sql injection?防止我的应用程序进行 sql 注入?
【发布时间】:2010-11-08 16:37:55
【问题描述】:

我正在制作一个有登录页面的项目。

我正在限制用户进入

AND OR NOT XOR & | ^

这足以防止我的应用程序被 SQL 注入吗?

【问题讨论】:

标签: c# security sql-injection


【解决方案1】:

不,一点也不。

例如,我仍然可以输入我的用户名:

; DELETE FROM Users --

根据您的数据库结构和应用程序代码,这仍然可以擦除您的整个用户表。

为了充分保护自己免受 SQL 注入攻击,您应该转义任何用户输入并使用参数化查询或存储过程(如果您使用存储过程,请确保存储过程中没有动态生成的 SQL)与数据库交互。

【讨论】:

    【解决方案2】:

    您不应该在他们的用户名/密码中寻找特殊的单词/字符。因为你总是会错过一些东西。

    相反,如果您有嵌入式 SQL,则应该使用参数化查询。如果您对所有查询都这样做,那么您将不会受到 sql 注入的影响。现在,XSS 完全是另一回事了.. ;)

    这个已经在本站深入介绍了,直接搜索sql注入即可。

    【讨论】:

      【解决方案3】:

      使用存储过程或参数化查询将防止 SQL 注入。

      1) 除此之外,如果您使用的是 ASP.NET,您可以启用页面级属性“ValidateRequest = True”,该属性可以验证任何输入字符串是否会导致脚本注入

      2) 确保您不向最终用户显示实际系统生成的错误。这将导致黑客进一步探测并破坏系统。

      3) 如果您使用 Web 服务来使用数据并将数据同步到您的数据库,请在持久化数据之前验证所有必要的字段。

      【讨论】:

        【解决方案4】:

        绝对不是!

        避免 SQL 注入的最简单方法是使用参数化查询。

        查看这个 SO 问题:Preventing SQL Injection in ASP.Net VB.Net 及其所有答案,为您提供一个想法。

        简而言之,我从不使用串联的字符串查询,但总是使用参数。这样就完全没有危险,也是最安全的防止SQL注入的方式。

        【讨论】:

          【解决方案5】:

          这是一个很好的堆栈溢出链接:What is SQL injection?

          其次,不要忘记在 UI 中进行何种验证并不重要,人们总是可以构建自定义 HTTP 请求并将它们发送到您的服务器(就像使用 firebug 进行编辑一样简单)。

          【讨论】:

            【解决方案6】:

            就像其他人说的那样。参数化输入。

            这是我在工作中编写的一些代码的片段(删除了工作特定的代码)。它并不完美,但我的主要工作不是编程,写这篇文章时我还在研究 C#。如果我现在写这个,我会使用数据阅读器而不是数据集。

            但请注意我如何在实际 SQL 字符串中使用变量并使用“da.SelectCommand.Parameters.AddWithValue”分配变量

            public Boolean Login(string strUserName, string strPassword)
                    {
                        SqlConnection sqlConn = new System.Data.SqlClient.SqlConnection();
                        DataSet ds = null;
                        SqlDataAdapter da = null;
            
                        sqlConn.ConnectionString = strConnString;
            
                        try
                        {
                            blnError = false;
                            sqlConn.Open();
            
                            ds = new DataSet();
                            da = new SqlDataAdapter("select iuserid from tbl_Table where vchusername = @vchUserName and vchpassword = @vchPassword", sqlConn);
            
                            da.SelectCommand.Parameters.AddWithValue("@vchUserName", strUserName);
                            da.SelectCommand.Parameters.AddWithValue("@vchPassword", strPassword);
            
                            da.SelectCommand.CommandTimeout = 30;
                            da.Fill(ds);
            
                            if (ds.Tables[0].Rows.Count > 0)
                            {
                                iUserId = (int)ds.Tables[0].Rows[0]["iuserid"];
                            }
                        }
                        catch (Exception ex)
                        {
                            blnError = true;
                            Log("Login: " + ex.Message);
                        }
                        finally
                        {
                            if (sqlConn.State != ConnectionState.Closed)
                                sqlConn.Close();
                            if (da != null)
                                da.Dispose();
                            if (ds != null)
                                ds.Dispose();
                        }
                        if (blnError)
                            return false;
                        if (iUserId > 0)
                            return true;
                        return false;
                    }
            

            【讨论】:

              【解决方案7】:

              您应该将值作为参数传递给存储过程。这样用户输入的任何内容都会被视为一个值,而不是附加到语句并执行

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2010-09-08
                • 1970-01-01
                • 2013-05-01
                • 1970-01-01
                • 2012-03-19
                • 1970-01-01
                • 2011-06-12
                相关资源
                最近更新 更多