C# 阻止我的应用程序进行sql注入?
我正在做一个项目,其中我有一个登录页面 我限制用户进入 与否异或&| ^ 这足以阻止我的应用程序进行SQL注入吗?不,一点也不 例如,我仍然可以输入用户名:C# 阻止我的应用程序进行sql注入?,c#,security,sql-injection,C#,Security,Sql Injection,我正在做一个项目,其中我有一个登录页面 我限制用户进入 与否异或&| ^ 这足以阻止我的应用程序进行SQL注入吗?不,一点也不 例如,我仍然可以输入用户名: ; DELETE FROM Users -- 根据您的数据库结构和应用程序代码,它仍然可以擦除整个Users表 为了充分保护自己免受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;
}