我有一些问题(对于acccess数据库),如下所示:
string comando = "SELECT * FROM ANAGRAFICA WHERE E_MAIL='" + user + "' AND PASSWORD_AZIENDA='" + password + "'";
我想“逃避”用户和密码,防止注射。
如何使用C#和.NET 3.5进行操作?我在PHP上搜索像mysql_escape_string这样的东西...
答案 0 :(得分:38)
您需要使用参数。好吧不必,但更好。
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";
答案 1 :(得分:18)
不要转义字符串以开始 - 使用参数化查询。这远远超过逃避的好处:
SqlCommand.Parameters
的文档给出了一个很好的完整示例。
答案 2 :(得分:5)
您应该使用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);
}
}
}
答案 3 :(得分:2)
是的,您可以使用Named Parameters
答案 4 :(得分:1)
使用参数而不是转义字符串:
var comando = "SELECT * FROM ANAGRAFICA WHERE E_MAIL=@user AND PASSWORD_AZIENDA=@password";
然后在执行SqlCommand
之前为这些参数赋值。
答案 5 :(得分:1)
您可以查看以下链接,了解如何在ASP.Net中阻止SQL注入。我更愿意使用
答案 6 :(得分:0)
如果您可以将这些转换为命名参数,我认为您会更好。
答案 7 :(得分:0)
@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)
};
答案 8 :(得分:0)
PT:Siga os passos a seguir e resolva o problema de SQL INJECTION
EN:按照以下步骤解决SQL INJECTION问题:
ES:Siga los siguientes pasos y resolver el problema de lainyeccióndeSQL:
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);