如何防止我自己创建的表单中的安全漏洞,哪些数据写入我的数据库?
基本上我想要更换危险的字符('',“”,〜,......)......但我不知道如何以干净的方式为每个公式元素(超过20个) )...
我不知道asp.net是否提供了一个简单的事情。好的验证器我已经做了一些验证,但至少我想删除所有危险和异国情调的字符。
我不喜欢在我的公式中为每个文本框创建一个替换函数...希望有一个其他解决方案适用于所有简单和正确的。
谢谢
编辑:好的。我使用CMS Kentico的API函数进行插入。所以当然它是在那里进行的。答案 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编码。