Uri.EscapeDataString澄清需要

时间:2014-08-14 22:34:37

标签: sql asp.net security

我试图清理数据字段以防止使用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++;
}

2 个答案:

答案 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注入,因为参数被视为强类型值而不是查询结构的一部分。