我的文本框有问题。
当用户在文本框中写东西时,它会保存它但是sql查询或错误的文本或自动注入数据库的东西,我不知道它发生了什么;它在数据库中保存虚假数据。
我在想sql是由文本格式自动注入的。
谁能为此提供解决方案?
我不能将我的文本框限制为特殊字符,这就是我面临这么多问题的原因。
我的文本框有问题。
当用户在文本框中写东西时,它会保存它但是sql查询或错误的文本或自动注入数据库的东西,我不知道它发生了什么;它在数据库中保存虚假数据。
我在想sql是由文本格式自动注入的。
谁能为此提供解决方案?
我不能将我的文本框限制为特殊字符,这就是我面临这么多问题的原因。
如果无法过滤 Textbox,则必须过滤 Postback 中的数据。
字符串 userInput = @"' 或 1=1; -- ";
字符串编码字符串 = Server.HtmlEncode(userInput);
结果将是:
' or 1=1; -- <html>
Regex myRegex = new Regex("[\\\'\\\"\\<\\>=]", RegexOptions.Compiled | RegexOptions.IgnoreCase); string userInput = @"' or 1=1; -- <html>"; string encodedString = myRegex.Replace(userInput, "");
结果将是:
或 11;-- html
使用 (SqlConnection cn = new SqlConnection("Your Connection string here")) {
using (SqlCommand cmd = new SqlCommand()) { cmd.Connection = cn; cmd.CommandType = CommandType.Text; cmd.CommandText = "Select * From [User] Where (UserName = @UserName AND Password = @Password)"; cmd.Parameters.Add("@UserName", SqlDbType.NVarChar).Value = Server.HtmlEncode(txtUserName.Text); cmd.Parameters.Add("@Password", SqlDbType.NVarChar).Value = Server.HtmlEncode(txtPassword.Text); cn.Open(); IDataReader reader = cmd.ExecuteReader(); if (reader.Read()) { // Your code here } } }
可能的解决方案:
加密敏感数据。
使用具有最低必要权限的帐户访问数据库。
使用具有最低必要权限的帐户安装数据库。
确保数据有效。
进行代码审查以检查二阶攻击的可能性。
使用参数化查询。
使用存储过程。
重新验证存储过程中的数据。
确保错误消息不会泄露应用程序或数据库的内部架构。
有关详细信息,请参阅参考:Injection-Attacks-and-Some-Tips-on-How-to-Prev