我试图清理数据字段以防止使用ASP.NET进行sql注入,并且沿途发现了Uri.EscapeDataString,我认为这是解决方案(不确定)。这是我的代码,这是执行页面,Request [cur]从数组中获取" dictArr"它保存了我在前一页上的字段名称。
foreach(string cur in dictArr) {
if(Request[cur] != "") {
dictionary[cur] = Request[cur].Trim();
}
index++;
}
据我所知,Uri.EscapeDataString使数据只不过是一个字符串而且是安全的,无需担心数据库被清除。我的问题是,我该如何使用它?我在下面做得正确还是我必须采取另一个步骤?感谢
foreach(string cur in dictArr) {
if(Request[cur] != "") {
dictionary[cur] = Uri.EscapeDataString(Request[cur].Trim());
}
index++;
}
答案 0 :(得分:0)
这有点不同,您需要阻止来自服务器角度的攻击。如果我是黑客,我不需要使用您的网站界面,我可以将任何我喜欢的邮件发送到您的服务器。
这是一个更大的概念,但很适合与网络接触。
网上有大量关于所有内容的文章,例如: http://en.wikipedia.org/wiki/SQL_injection
开始挖掘:)
答案 1 :(得分:0)
Uri.EscapeDataString
只是转换字符串以便在URL中安全传输。非常类似Server.URLEncode
,但some differences。
我试图清理数据字段以防止使用ASP.NET进行sql注入,并且沿途发现了Uri.EscapeDataString,我认为这是解决方案(不确定)
不,这不是正确的方法。虽然使用EscapeDataString
编码所有内容将以避免SQL注入的方式编码内联SQL查询,但最终会在数据库中使用URL编码数据。
e.g。 My name is O'Leary
将编码为My name is O%27Leary
这意味着您的应用程序(以及现在或将来的所有其他应用程序)必须在每次读取时解码数据。这不是标准的,将来会增加操作的额外复杂性。例如,读取操作和将数据写回数据库必须进行解码,操作,然后在正确的点重新编码。
防止SQL注入的正确方法是使用parameterised queries。
String query =
"SELECT account_balance FROM user_data WHERE user_name = ?";
try {
OleDbCommand command = new OleDbCommand(query, connection);
command.Parameters.Add(new OleDbParameter("customerName", CustomerName Name.Text));
OleDbDataReader reader = command.ExecuteReader();
// …
} catch (OleDbException se) {
// error handling
}
这会自动防止SQL注入,因为参数被视为强类型值而不是查询结构的一部分。