此代码是否可以免于SQL注入?为什么?
public void AddPlayer(string username)
{
var query = "INSERT INTO dbo.Player(Username, RegisterDate) VALUES(@Username, @RegisterDate)";
using (var connection = new SqlConnection(connectionString))
using (var command = new SqlCommand(query, connection))
{
command.Parameters.AddWithValue("@Username", username);
command.Parameters.AddWithValue("@RegisterDate", DateTime.Now);
command.Connection.Open();
command.ExecuteNonQuery();
}
}
public DateTime GetRegisterDate(string username)
{
var query = "SELECT RegisterDate FROM dbo.Player WHERE Username = @Username";
using (var connection = new SqlConnection(connectionString))
using (var command = new SqlCommand(query, connection))
{
command.Parameters.AddWithValue("@Username", username);
command.Connection.Open();
return (DateTime)command.ExecuteScalar();
}
}
编辑:可以使用存储过程编写注入安全的等效代码吗?如果是这样,存储过程会是什么样的?
答案 0 :(得分:9)
是的,它看起来很安全。
因为它使用参数。
创建类似
的查询时,存在SQL注入的风险
baseQueryText + " WHERE Username =" + TextBox.Text;
使用编辑:当您使用存储过程时,您始终使用参数,因此它们也是安全的。无需特殊工作,但您仍然可以/应该过滤传入的数据。
答案 1 :(得分:6)
是。您正在使用参数化查询,这些查询通常被认为是安全的SQL注入。
您仍可能需要考虑过滤输入。
答案 2 :(得分:4)
是的,所有非静态数据都是通过绑定参数输入的。