我正在制作一个我有登录页面的项目。
我限制用户输入
AND OR NOT XOR& | ^
这足以阻止我的应用程序从SQL注入?
答案 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)
您应该将值作为参数传递给存储过程。这样,无论用户输入什么,都只被视为一个值而不是附加到语句并执行