사용자가 제공한 입력을 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 명령도 마찬가지입니다.
VB.NET 예제 코드
이것은 vb.net 의 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
'IT' 카테고리의 다른 글
.idea/workspace.xml을 무시할 수 없음 - 계속 표시됨 (0) | 2023.05.08 |
---|---|
Git Stash vs Shelve in IntelliJ IDEA (0) | 2023.05.08 |
WPF 탐색을 위한 Window vs Page vs UserControl? (0) | 2023.05.08 |
요소 번호가 있는 PostgreSQL unnest() (0) | 2023.05.08 |
메이븐 프로젝트를 이클립스로 가져오는 중 (0) | 2023.05.08 |