IT

사용자가 제공한 입력을 SQL 문에 추가하려면 어떻게 해야 합니까?

itgroup 2023. 5. 8. 22:06
반응형

사용자가 제공한 입력을 SQL 문에 추가하려면 어떻게 해야 합니까?

사용자가 제공한 데이터를 사용하여 SQL 문을 생성하려고 합니다.나는 C#:에서 이와 유사한 코드를 사용합니다.

var sql = "INSERT INTO myTable (myField1, myField2) " +
          "VALUES ('" + someVariable + "', '" + someTextBox.Text + "');";

var cmd = new SqlCommand(sql, myDbConnection);
cmd.ExecuteNonQuery();

이거 VB에서.NET:

Dim sql = "INSERT INTO myTable (myField1, myField2) " &
          "VALUES ('" & someVariable & "', '" & someTextBox.Text & "');"

Dim cmd As New SqlCommand(sql, myDbConnection)
cmd.ExecuteNonQuery()

하지만,

  • 사용자 입력에 작은 따옴표(예:)가 포함된 경우) 실패합니다.O'Brien),
  • DateTime 값을 삽입할 때 형식이 제대로 전달되지 않는 것 같습니다.
  • 사람들이 자꾸 'SQL 주입' 때문에 이러면 안 된다고 합니다.

어떻게 하면 "올바른 방법"을 할 수 있을까요?

매개 변수화된 SQL을 사용합니다.

(이러한 예는 C#에 있습니다. VB에 대해서는 아래를 참조하십시오.NET 버전.)

문자열 연결 바꾸기@...자리 표시자를 선택한 다음 값을 SqlCommand에 추가합니다.자리 표시자의 이름을 자유롭게 선택할 수 있습니다. 자리 표시자가 다음 항목으로 시작하는지 확인하십시오.@기호. 예를 들어 다음과 같습니다.

var sql = "INSERT INTO myTable (myField1, myField2) " +
          "VALUES (@someValue, @someOtherValue);";

using (var cmd = new SqlCommand(sql, myDbConnection))
{
    cmd.Parameters.AddWithValue("@someValue", someVariable);
    cmd.Parameters.AddWithValue("@someOtherValue", someTextBox.Text);
    cmd.ExecuteNonQuery();
}

다른 종류의 SQL 문에도 동일한 패턴이 사용됩니다.

var sql = "UPDATE myTable SET myField1 = @newValue WHERE myField2 = @someValue;";

// see above, same as INSERT

또는

var sql = "SELECT myField1, myField2 FROM myTable WHERE myField3 = @someValue;";

using (var cmd = new SqlCommand(sql, myDbConnection))
{
    cmd.Parameters.AddWithValue("@someValue", someVariable);
    using (var reader = cmd.ExecuteReader())
    {
        ...
    }
    // Alternatively: object result = cmd.ExecuteScalar();
    // if you are only interested in one value of one row.
}

주의 사항:AddWithValue이는 좋은 출발점이며 대부분의 경우 잘 작동합니다.그러나 전달하는 값은 해당 데이터베이스 필드의 데이터 유형과 정확하게 일치해야 합니다.그렇지 않으면 변환으로 인해 쿼리에서 인덱스를 사용할 수 없는 상황이 발생할 수 있습니다.char/varchar(앞에 "n"이 없음) 또는 날짜와 같은 일부 SQL Server 데이터 유형은 해당되지 않습니다.NET 데이터 유형.이러한 경우에는 올바른 데이터 유형을 사용해야 합니다.

제가 왜 그래야 하죠?

  • 더 안전합니다.SQL 주입을 중지합니다.(Bobby Tables won't delete your student records.)

  • 더 쉽습니다.단일 따옴표와 이중 따옴표를 만지작거리거나 날짜 리터럴의 올바른 문자열 표현을 찾을 필요가 없습니다.

  • 더 안정적입니다.O'Brien그가 자신의 이상한 이름을 고집한다고 해서 당신의 애플리케이션이 다운되지는 않을 것입니다.

기타 데이터베이스 액세스 라이브러리

  • SqlCommand 대신 OleDbCommand를 사용하는 경우(예: MS Access 데이터베이스를 사용하는 경우),?대신에@...SQL의 자리 표시자로 사용할 수 있습니다.이 경우, 첫 번째 매개변수는AddWithValue상관이 없습니다. 대신 올바른 순서로 매개 변수를 추가해야 합니다.Odbc 명령도 마찬가지입니다.

  • Entity Framework는 매개 변수화된 쿼리도 지원합니다.

VB.NET 예제 코드

이것은 vb.Wiki 답변에 대한 예제 코드입니다.Option Strict On그리고.Option Infer On.

삽입

Dim sql = "INSERT INTO myTable (myField1, myField2) " & 
          "VALUES (@someValue, @someOtherValue);"

Using cmd As New SqlCommand(sql, myDbConnection)
    cmd.Parameters.AddWithValue("@someValue", someVariable)
    cmd.Parameters.AddWithValue("@someOtherValue", someTextBox.Text)
    cmd.ExecuteNonQuery()
End Using

갱신하다

Dim sql = "UPDATE myTable SET myField1 = @newValue WHERE myField2 = @someValue;"

' see above, same as INSERT

선택한다.

Dim sql = "SELECT myField1, myField2 FROM myTable WHERE myField3 = @someValue;"

Using cmd As New SqlCommand(sql, myDbConnection)
    cmd.Parameters.AddWithValue("@someValue", someVariable)
    Using reader = cmd.ExecuteReader()
        ' ...
    End Using
    ' Alternatively: Dim result = cmd.ExecuteScalar()
    ' if you are only interested in one value of one row.
End Using

언급URL : https://stackoverflow.com/questions/35163361/how-can-i-add-user-supplied-input-to-an-sql-statement

반응형