如何防止SQL注入转义字符串
本文关键字:转义字符 字符串 转义 注入 何防止 SQL | 更新日期: 2023-09-27 18:00:57
我有一些查询(到访问数据库(,如下所示:
string comando = "SELECT * FROM ANAGRAFICA WHERE E_MAIL='" + user + "' AND PASSWORD_AZIENDA='" + password + "'";
我想"逃离"用户和密码,防止注入。
如何使用C#和.NET 3.5来完成此操作?我正在PHP上搜索像mysql_escape_string这样的东西。。。
您需要使用参数。好吧,不必这样,但最好是这样。
SqlParameter[] myparm = new SqlParameter[2];
myparm[0] = new SqlParameter("@User",user);
myparm[1] = new SqlParameter("@Pass",password);
string comando = "SELECT * FROM ANAGRAFICA WHERE E_MAIL=@User AND PASSWORD_AZIENDA=@Pass";
不要转义字符串-使用参数化查询。这样做的好处:
- 代码更易于阅读
- 你不必依赖于正确的转义
- 可能存在性能改进(特定于数据库等(
- 它将"代码"(SQL(与数据分离,这在逻辑上很有意义
- 这意味着您不必担心数字和日期/时间等数据格式
SqlCommand.Parameters
的文档给出了一个很好的、完整的示例。
您应该使用SQL参数来防止SQL注入看看代码
//
// The name we are trying to match.
//
string dogName = "Fido";
//
// Use preset string for connection and open it.
//
string connectionString = ConsoleApplication716.Properties.Settings.Default.ConnectionString;
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
//
// Description of SQL command:
// 1. It selects all cells from rows matching the name.
// 2. It uses LIKE operator because Name is a Text field.
// 3. @Name must be added as a new SqlParameter.
//
using (SqlCommand command = new SqlCommand("SELECT * FROM Dogs1 WHERE Name LIKE @Name", connection))
{
//
// Add new SqlParameter to the command.
//
command.Parameters.Add(new SqlParameter("Name", dogName));
//
// Read in the SELECT results.
//
SqlDataReader reader = command.ExecuteReader();
while (reader.Read())
{
int weight = reader.GetInt32(0);
string name = reader.GetString(1);
string breed = reader.GetString(2);
Console.WriteLine("Weight = {0}, Name = {1}, Breed = {2}", weight, name, breed);
}
}
}
是的,您可以通过使用Named Parameters
来避免注入
使用参数而不是转义字符串:
var comando = "SELECT * FROM ANAGRAFICA WHERE E_MAIL=@user AND PASSWORD_AZIENDA=@password";
然后在执行SqlCommand
之前为这些参数赋值。
您可以查看下面的链接,了解如何防止ASP.Net中的SQL注入。我更喜欢使用
- 使用参数化查询或存储过程
- 正在验证特殊字符,如"(非常危险(
http://dotnet.dzone.com/news/aspnet-preventing-sql-injectio
如果您可以将这些转换为命名参数,我认为您会得到更好的服务。
@Jethro
你也可以这样写:
SqlParameter[] sqlParams = new SqlParameter[] {
new SqlParameter("@Name", contact.name),
new SqlParameter("@Number", contact.number),
new SqlParameter("@PhotoPath", contact.photoPath),
new SqlParameter("@ID", contact.id)
};
按照以下步骤解决SQL注入问题:
OracleParameter[] tmpParans = new OracleParameter[1];
tmpParans[0] = new Oracle.DataAccess.Client.OracleParameter("@User", txtUser.Text);
string tmpQuery = "SELECT COD_USER, PASS FROM TB_USERS WHERE COD_USER = @User";
OracleCommand tmpComand = new OracleCommand(tmpQuery, yourConnection);
tmpComand.Parameters.AddRange(tmpParans);
OracleDataReader tmpResult = tmpComand.ExecuteReader(CommandBehavior.SingleRow);