0

MyI は、データから情報を収集するフォームを作成しました。このデータには、" ' などのランダムな文字が含まれる場合があります。私の質問は、SQL インジェクション攻撃を受けずにデータを安全に挿入するにはどうすればよいか、およびエスケープ文字をどこに挿入すれば、' "/ やなどが挿入されます。

これまでの私のコードは次のとおりです。

   public string InsertRecordSet()
    {        

        source = new FileInfo(@"c:\scripts\db_connection.txt");
        stream = source.OpenText();
        String text = stream.ReadLine();
        stream.Close();
        String uid = text.Substring(0, text.IndexOf(":"));
        String pw = text.Substring(text.IndexOf(":") + 1, (text.Length - uid.Length - 1));
        String connectionString = "dsn=" + "db" + "; uid=" + uid + "; pwd=" + pw + ";";
        String statement = "INSERT INTO table (SubmitDate, FirstName, LastName, Email, Phone, Major, Description, HearAbout) VALUES (@SubmitDate, @FirstName, @LastName, @Email, @Phone, @Major, @Description, @HearAbout)";                    

        conn = new OdbcConnection(connectionString);

        command = new OdbcCommand(statement, conn);

        command.Parameters.AddWithValue("@SubmitDate", DateTime.Now);
        command.Parameters.AddWithValue("@FirstName", txtFname.Text);
        command.Parameters.AddWithValue("@LastName", txtLname.Text);
        command.Parameters.AddWithValue("@Email", txtEmail.Text);
        command.Parameters.AddWithValue("@Phone", txtPhone.Text);
        command.Parameters.AddWithValue("@Major", txtMajor.Text);
        command.Parameters.AddWithValue("@Desciption", txtDescription.Text);
        command.Parameters.AddWithValue("@HearAbout", txtMaxwell.Text);

        conn.Open();
        try
        {               
            command.ExecuteNonQuery();
            return "true";
        }
        catch (OdbcException oe)
        {
            _dbError = true;
            Session.Contents.Add("USIFormException", oe);
            return (oe.ToString());
        }
        finally
        {
            conn.Close();
        }
    }
4

2 に答える 2

1

SQL インジェクションから保護するには、インライン SQL を使用せず、代わりにパラメーター化された SQL を使用します。

パラメーター化された SQL は、値 (またはパラメーター) を文字列の一部としてのみ許可するため、SQL インジェクションを防ぎます。たとえば、オブジェクトはそれが正当なパラメーター値ではないことを認識しているDROP TABLE xyzため、パラメーター化された SQL 文字列に含めることはできません。Command

したがって、このコードの代わりに:

String statement = "INSERT INTO MyTable(SubmitDate, FirstName, LastName, Email, Phone, Major, Description, HearAbout)";                    
statement += "VALUES (";
statement += "'" + DateTime.Now.ToShortDateString() + "',";
statement += "'" + txtFname.Text + "', ";  

conn = new OdbcConnection(connectionString);

command = new OdbcCommand(statement, conn);

次のようなコードが必要です。

String statement = String statement = "INSERT INTO MyTable(SubmitDate, FirstName, LastName, Email, Phone, Major, Description, HearAbout) VALUES (@SubmitDate, @FirstName)";

command.Parameters.Add("@SubmitDate", DateTime.Now.ToShortDateString());
command.Parameters.Add("@FirstName", txtFname.Text);

注: データベース ロジックが動的 SQL を実行している場合、パラメーター化されたクエリは SQL インジェクションから完全には保護されないため、これも避けてください。

于 2013-08-24T17:29:30.100 に答える
0

パラメータ化された値を使用する必要があります。

string query =  "INSERT INTO MyTable(SubmitDate, FirstName, LastName, Email, Phone, Major, Description, HearAbout)";                    
query += " VALUES (@SubmitDate, @FirstName, @LastName, @EMail, @Phone, @Major, @Description, @HearAbout)";
conn = new OdbcConnection(connectionString);
command = new OdbcCommand(query, conn);
command.Parameters.AddWithValue("@SubmitDate", DateTime.Now.ToShortDateString());
command.Parameters.AddWithValue("@FirstName",  txtFname.Tex);
...

conn.Open();
command.ExecuteNonQuery();

http://msdn.microsoft.com/en-us/library/system.data.odbc.odbccommand.aspx

http://msdn.microsoft.com/en-us/library/system.data.odbc.odbcparametercollection.aspx

于 2013-08-24T17:30:04.027 に答える