web-dev-qa-db-ja.com

SQLインジェクションが文字列をエスケープするのを防ぐ方法

次のような(アクセスデータベースへの)クエリがあります。

string comando = "SELECT * FROM ANAGRAFICA WHERE E_MAIL='" + user + "' AND PASSWORD_AZIENDA='" + password + "'";

そして、ユーザーとパスワードを「エスケープ」して、インジェクションを防止したいと思います。

C#および.NET 3.5でそれを行うにはどうすればよいですか? PHPでmysql_escape_stringのようなものを検索しています...

18
markzzz

パラメータを使用する必要があります。まあする必要はありませんが、望ましいでしょう。

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";
38
Jethro

文字列をエスケープしないでください-パラメータ化されたクエリを使用してください。エスケープすることに対するこれの利点:

  • コードが読みやすい
  • あなたはエスケープを正しくすることに頼る必要はありません
  • パフォーマンスが向上している可能性があります(DB固有など)
  • 「コード」(SQL)をデータから分離します。これは論理的には良い意味です
  • つまり、数値や日付/時刻などのデータ形式について心配する必要はありません。

SqlCommand.Parameters のドキュメントは、優れた完全な例を示しています。

18
Jon Skeet

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);
    }
    }
}
5
Serghei

はい、Named Parametersを使用することで注入を回避できます

2
George Johnston

文字列をエスケープする代わりにパラメータを使用します。

var comando = "SELECT * FROM ANAGRAFICA WHERE E_MAIL=@user AND PASSWORD_AZIENDA=@password";

次に、SqlCommandを実行する前に、これらのパラメーターに値を割り当てます。

1
Yuck

ASP.NetでSQLインジェクションを防ぐ方法については、以下のリンクを確認してください。使いたい

  1. パラメータ化されたクエリまたはストアドプロシージャの使用。
  2. '(非常に危険)などの特殊文字の検証

http://dotnet.dzone.com/news/aspnet-preventing-sql-injectio

1
suryakiran

これらを名前付きパラメーターに変換できれば、より良いサービスが提供されると思います。

0
tjg184

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);
0
Dominus Farib

@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)
};
0
Chriz