阻止我的应用程序从SQL注入?

时间:2010-11-08 16:37:56

标签: c# security sql-injection

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

我限制用户输入

AND OR NOT XOR& | ^

这足以阻止我的应用程序从SQL注入?

7 个答案:

答案 0 :(得分:12)

不,完全没有。

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

; DELETE FROM Users --

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

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

答案 1 :(得分:6)

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

相反,如果您有嵌入式SQL,则应该使用参数化查询。如果你为所有查询都这样做,那么你将安全地从sql注入。现在,XSS完全是另一回事..;)

这个已在本网站上深入讨论,只是搜索sql注入。

答案 2 :(得分:2)

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

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

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

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

答案 3 :(得分:1)

绝对不是!

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

请参阅此问题:Preventing SQL Injection in ASP.Net VB.Net及其所有答案,以便您了解。

简而言之,我从不使用连接字符串查询,而是使用ALWAYS参数。这样就没有任何危险,这是防止SQL注入的最安全的方法。

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

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

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

但请注意我如何在实际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;
        }

答案 6 :(得分:-1)

您应该将值作为参数传递给存储过程。这样,无论用户输入什么,都只被视为一个值而不是附加到语句并执行