여기서는 코드에서 매개 변수화 된 SQL 쿼리를 사용하는 방법에 대해 또 다른 논의를하고 있습니다. 토론에는 두 가지 측면이 있습니다. 나와 다른 사람들은 항상 매개 변수를 사용하여 SQL 주입으로부터 보호해야한다고 말하는 사람과 필요하다고 생각하지 않는 다른 사람을 말합니다. 대신 SQL 삽입을 피하기 위해 모든 문자열에서 단일 아포스트로피를 두 개의 아포스트로피로 바꾸려고합니다. 우리의 데이터베이스는 모두 Sql Server 2005 또는 2008을 실행하고 있으며 코드베이스는 .NET Framework 2.0에서 실행됩니다.
C #으로 간단한 예를 들어 보겠습니다.
나는 이것을 사용하기를 원한다.
string sql = "SELECT * FROM Users WHERE Name=@name";
SqlCommand getUser = new SqlCommand(sql, connection);
getUser.Parameters.AddWithValue("@name", userName);
//... blabla - do something here, this is safe
다른 사람들은 이것을하기를 원하지만 :
string sql = "SELECT * FROM Users WHERE Name=" + SafeDBString(name);
SqlCommand getUser = new SqlCommand(sql, connection);
//... blabla - are we safe now?
SafeDBString 함수는 다음과 같이 정의됩니다.
string SafeDBString(string inputValue)
{
return "'" + inputValue.Replace("'", "''") + "'";
}
이제 쿼리의 모든 문자열 값에 SafeDBString을 사용하는 한 안전해야합니다. 권리?
SafeDBString 함수를 사용하는 데는 두 가지 이유가 있습니다. 첫 번째는 석기 시대부터 수행 된 방식이고 두 번째는 데이터베이스에서 실행되는 정확한 쿼리를 볼 수 있기 때문에 SQL 문을 디버그하는 것이 더 쉽습니다.
그럼. 내 질문은 SQL 주입 공격을 피하기 위해 SafeDBString 함수를 사용하는 것이 실제로 충분한 지 여부입니다. 이 안전 조치를 위반하는 코드의 예를 찾으려고 노력했지만 그 예를 찾을 수 없습니다.
이걸 깰 수있는 사람이 있나요? 어떻게 하시겠습니까?
편집 : 지금까지 회신을 요약하려면 :
- 아직 Sql Server 2005 또는 2008에서 SafeDBString을 다루는 방법을 찾지 못했습니다. 좋은 것 같아요?
- 여러 응답에서 매개 변수화 된 쿼리를 사용할 때 성능 향상을 얻을 수 있다고 지적했습니다. 그 이유는 쿼리 계획을 재사용 할 수 있기 때문입니다.
- 또한 매개 변수화 된 쿼리를 사용하면 유지 관리하기 쉬운 더 읽기 쉬운 코드가 제공된다는 데 동의합니다.
- 또한 다양한 버전의 SafeDBString, 문자열에서 숫자로의 변환 및 문자열에서 날짜로의 변환을 사용하는 것보다 항상 매개 변수를 사용하는 것이 더 쉽습니다.
- 매개 변수를 사용하면 날짜 나 십진수로 작업 할 때 특히 유용한 자동 유형 변환을 얻을 수 있습니다.
- 그리고 마지막 으로 JulianR이 쓴 것처럼 스스로 보안을 시도하지 마십시오 . 데이터베이스 공급 업체는 보안에 많은 시간과 비용을 소비합니다. 우리가 더 잘할 수있는 방법은 없으며 그들의 일을하려고 노력해야 할 이유도 없습니다.
그래서 아무도 SafeDBString 함수의 간단한 보안을 깰 수 없었지만 다른 많은 좋은 주장을했습니다. 감사!