Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 阻止我的应用程序进行sql注入?_C#_Security_Sql Injection - Fatal编程技术网

C# 阻止我的应用程序进行sql注入?

C# 阻止我的应用程序进行sql注入?,c#,security,sql-injection,C#,Security,Sql Injection,我正在做一个项目,其中我有一个登录页面 我限制用户进入 与否异或&| ^ 这足以阻止我的应用程序进行SQL注入吗?不,一点也不 例如,我仍然可以输入用户名: ; DELETE FROM Users -- 根据您的数据库结构和应用程序代码,它仍然可以擦除整个Users表 为了充分保护自己免受SQL注入攻击,您应该避开任何用户输入,并使用参数化查询或存储过程(如果您使用的是存储过程,请确保存储过程中没有动态生成的SQL)与数据库交互。应将值作为参数传递给存储过程。这样,用户输入的任何内容都将被视为

我正在做一个项目,其中我有一个登录页面

我限制用户进入

与否异或&| ^

这足以阻止我的应用程序进行SQL注入吗?

不,一点也不

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

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


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

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

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

相反,如果您有嵌入式SQL,则应该使用参数化查询。如果对所有查询都这样做,那么就可以避免sql注入。现在,XSS完全是另一回事了……)


本网站已对此进行了深入介绍,只需搜索sql注入。

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

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

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


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

这里有一个很好的堆栈溢出链接:

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

绝对不是

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

看看这个问题:和它的所有答案,给你一个想法


简而言之,我从不使用串联字符串查询,而是始终使用参数。这样,根本没有危险,这是防止SQL注入的最安全的方法。

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

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

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


哇,你限制的输入都不是sql注入地址。它完全是引号和整数类型转换。你们还没见过面吗?;)
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;
        }