Google讨论了有关清理Web访问查询的各种讨论,但我找不到任何解决我所关注的问题的方法:
在ac#程序中清理用户输入数据。这必须通过可逆的转换来完成,而不是通过移除来完成。作为问题的简单示例,我不想破坏爱尔兰的名字。
最好的方法是什么,有没有执行此功能的库函数?
这取决于您所使用的SQL数据库。例如,如果要在MySQL中使用单引号文字,则需要使用反斜杠Dangerous:'和转义的转义字符文字:\'。对于MS-SQL,情况完全不同,危险:' 转义:''。以这种方式对数据进行转义时,不会删除任何内容,这是一种表示控制字符(如引号)的字面形式的方式。
'
\'
''
这是一个从文档中获取对MS-SQL和C#使用参数化查询的示例:
private static void UpdateDemographics(Int32 customerID, string demoXml, string connectionString) { // Update the demographics for a store, which is stored // in an xml column. string commandText = "UPDATE Sales.Store SET Demographics = @demographics " + "WHERE CustomerID = @ID;"; using (SqlConnection connection = new SqlConnection(connectionString)) { SqlCommand command = new SqlCommand(commandText, connection); command.Parameters.Add("@ID", SqlDbType.Int); command.Parameters["@ID"].Value = customerID; // Use AddWithValue to assign Demographics. // SQL Server will implicitly convert strings into XML. command.Parameters.AddWithValue("@demographics", demoXml); try { connection.Open(); Int32 rowsAffected = command.ExecuteNonQuery(); Console.WriteLine("RowsAffected: {0}", rowsAffected); } catch (Exception ex) { Console.WriteLine(ex.Message); } } }
对于MySQL,我不知道可以使用的参数化查询库。您应该使用mysql_real_escape_string()或有时可以使用此函数。
public static string MySqlEscape(this string usString) { if (usString == null) { return null; } // SQL Encoding for MySQL Recommended here: // http://au.php.net/manual/en/function.mysql-real-escape-string.php // it escapes \r, \n, \x00, \x1a, baskslash, single quotes, and double quotes return Regex.Replace(usString, @"[\r\n\x00\x1a\\'""]", @"\$0"); }