清理SQL数据

时间:2010-08-13 17:50:13

标签: c# sql security

Google提出了各种关于清理Web访问查询的讨论,但我找不到任何解决我关注的问题:

在c#程序中清理用户输入数据。这必须通过可逆转换完成,而不是通过删除。作为问题的一个简单例子,我不想破坏爱尔兰名字。

什么是最好的方法,是否有任何库功能可以做到这一点?

2 个答案:

答案 0 :(得分:9)

这取决于您使用的SQL数据库。例如,如果您想在MySQL中使用单引号文字,则需要使用反斜杠,Dangerous:'和转义的转义字符文字:\'。对于MS-SQL,完全不同,危险:'转义:''。以这种方式转义数据时,不会删除任何内容,它是一种表示控件字符(如文字形式的引号)的方法。

以下是使用Docs中的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");
}

答案 1 :(得分:0)

使用正确构造的DAL和SQL参数对象传递给存储过程,您不必担心这一点。实现业务对象和dal以抽象用户输入,使其不作为SQL执行,而是被识别为值。例子很有趣:

public class SomeDal
{
    public void CreateUser(User userToBeCreated)
    {
        using(connection bla bla)
        {
            // create and execute a command object filling its parameters with data from the User object
        }
    }
}

public class User
{
    public string Name { get; set; }
    ...
}

public class UserBL
{
    public CreateUser(User userToBeCreated)
    {
        SomeDal myDal = new SomeDal();
        myDal.CreateUser(userToBeCreated);
    }
}

public class SomeUI
{
    public void HandleCreateClick(object sender, e ButtonClickEventArgs)
    {
        User userToBeCreated = new User() { Name = txtName.Text };
        UserBL userBl = new UserBL();
        userBl.CreateUser(userToBeCreated);
    }
}