次のような(アクセスデータベースへの)クエリがあります。
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";
文字列をエスケープしないでください-パラメータ化されたクエリを使用してください。エスケープすることに対するこれの利点:
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インジェクションを防ぐ方法については、以下のリンクを確認してください。使いたい
これらを名前付きパラメーターに変換できれば、より良いサービスが提供されると思います。
PT:Siga os passos seguir e resolva o problema de SQL INJECTION
EN:以下の手順に従って、SQL INJECTIONの問題を解決します。
ES:Siga los siguientes pasos y resolver el problema de lainyecciónde 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);
@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)
};