公式化安全性在DB写入之前删除字符

时间:2009-12-15 08:45:57

标签: c# asp.net security validation

如何防止我自己创建的表单中的安全漏洞,哪些数据写入我的数据库?

基本上我想要更换危险的字符('',“”,〜,......)......但我不知道如何以干净的方式为每个公式元素(超过20个) )...

我不知道asp.net是否提供了一个简单的事情。好的验证器我已经做了一些验证,但至少我想删除所有危险和异国情调的字符。

我不喜欢在我的公式中为每个文本框创建一个替换函数...希望有一个其他解决方案适用于所有简单和正确的。

谢谢

编辑:好的。我使用CMS Kentico的API函数进行插入。所以当然它是在那里进行的。

4 个答案:

答案 0 :(得分:4)

您应该使用参数化查询;这样您的用户就无法注入SQL。

SqlCommand command = new SqlCommand(
    "SELECT * FROM Table WHERE ID=@Id", connection);
command.Parameters.AddWithValue("@Id", 1);

答案 1 :(得分:1)

所有SQL语句都应该使用SqlParameters而不是构造为完整的字符串。这样可以防止SQL注入攻击。

NO:

var cmd = new SqlCommand("INSERT INTO MyTable (MyColumn) VALUES ('" + formValue + "')", connection);
cmd.ExecuteNonQuery();

YES:

var cmd = new SqlCommand("INSERT INTO MyTable (MyColumn) VALUES (@FormValue)", connection);
cmd.Parameters.AddWithValue("@FormValue", formValue);
cmd.ExecuteNonQuery();

答案 2 :(得分:1)

您应该对数据库使用参数化调用。它将根据需要转义字符,并允许它们安全地保存在数据库中。

E.g。

using (DbCommand command = connection.CreateCommand())
{
    command.CommandText = "myStoredProc";
    command.CommandType = CommandType.StoredProcedure;

    DbParameter parameter = command.CreateParameter();
    parameter.ParameterName = "myParameter";
    parameter.DbType = DbType.AnsiString;
    parameter.Size = 100;
    parameter.Direction = ParameterDirection.Input;
    parameter.Value = "foo";

    command.ExecuteNonQuery();
}

using (DbCommand command = connection.CreateCommand())
{
    command.CommandText = "insert myTable (column1) values @myParameter";
    command.CommandType = CommandType.Text;

    DbParameter parameter = command.CreateParameter();
    parameter.ParameterName = "myParameter";
    parameter.DbType = DbType.AnsiString;
    parameter.Size = 100;
    parameter.Direction = ParameterDirection.Input;
    parameter.Value = "foo";

    command.ExecuteNonQuery();
}

您可以安全地将'foo'替换为您喜欢的任何字符串,而不会让自己暴露于SQL注入攻击。

答案 3 :(得分:0)

如果您使用parametrized queries,则不存在SQL注入的风险,您可以在数据库中存储任何字符。稍后在页面上显示它们时,您需要确保对数据进行HTML编码。