2012-04-25 3 views
0

내 WinForm에 텍스트 상자가 있습니다.내 SQL 쿼리가 작동을 멈추게 할 수있는 C# 텍스트 상자 문자

사용자가 텍스트 (키보드에서 허용하는 모든 것)를 입력합니다. 그들은 저장 클릭하면, 때때로 오류 메시지가 나타납니다

쿼리 식

구문 오류 (누락 된 연산자)

내가 '와 같은 특정 문자 내 SQL 쿼리를 파괴하는 것을 알고 내가 가진

몇 가지 질문

  1. 쿼리가 중단되지 않고 사용자가 원하는대로 입력 할 수 있도록 할 수있는 방법이 있습니까?
  2. # 1 할 방법이 없다면 텍스트를 스캔하고 쿼리를 손상시킬 수있는 모든 문자를 제거하려면 어떻게해야합니까?
+0

비슷한 질문 http://stackoverflow.com/questions/249567/algorithm-to-avoid-sql-injection-on-mssql-server-from-c-sharp-code –

+0

내가 아니다 Injection에 대한 걱정이 비슷하지 않기 때문에 –

답변

5

매개 변수를 사용하여 텍스트 상자 값을 쿼리에 전달하십시오. 이렇게하면 SQL 주입 공격을 방지 할 수 있습니다.

은 다음과 비슷한 모습이 될 것

SqlCommand cmd = new SqlCommand(); 
cmd.Connection = conn; 
cmd.CommandText = "SELECT * from TableName WHERE FieldA = @FieldValue"; 
cmd.CommandType = CommandType.Text; 

//Define SqlParameter object and assign value to the parameter 
cmd.Parameters.Add("@FieldValue", SqlDbType.VarChar, 50); 
cmd.Parameters["@FieldValue"].Value = TextBox.Value; 
+0

SQL 매개 변수를 사용할 때 ''와 다른 키보드 문자를 사용할 수 있습니까? –

+0

이렇게하면 코드에 큰 변화가 생길 것입니다. OleDbCommand (연결 문자열에서 삽입 쿼리에 이르기까지) –

+0

@CocoaDev, SqlCommand와 동일하게 작동합니다. 변경 사항은 간단해야합니다. –

2

내가 '와 같은 특정 문자가 그것은 당신이이 경우에 해당 파라미터를 추가 문자열 연결을 사용하여 같은 소리 내 SQL 쿼리

을 깨는 것을 알고있다.

대신 SQL 매개 변수를 사용하면 문제가 해결됩니다.

또한 문자열 연결을 사용하여 SQL 쿼리를 작성하면 SQL Injection이 발생하기 쉽습니다.

0
  1. 더 좋은 방법은 매개 변수화 쿼리를 사용하는 것입니다. Adding Parameters to Commands을 참조하십시오. 이것은 나쁜 성격 문제를 해결할뿐만 아니라 SQL-injection (위키 피 디아)의 위험을 제거합니다.

  2. 여전히 문자열 연결을 사용하려면 작은 따옴표 두 개를 작은 따옴표로 바꾸는 것이 안전해야합니다.

string sql = "SELECT * FROM tbl WHERE Name = '" + name.Replace("'","''") + "'"; 
+0

옵션 2는 여전히 SQL Injection에 취약하고 안전하지 않습니다. – Curt

+0

@Curt : 옵션 2에 악성 코드를 삽입하는 텍스트 항목의 예를 보여줄 수 있습니까? 나는 그것이 가능하다고 생각하지 않는다. –

관련 문제