SQL 명령에서 비모수 변수를 사용하는 것이 안전한시기는 언제입니까?

StackOverflow https://stackoverflow.com/questions/929873

  •  06-09-2019
  •  | 
  •  

문제

클라이언트 코드가 행 ID를 제공하고 행의 데이터에서 구성된 개체를 되 찾을 수 있도록 C# 메소드에서 선택 쿼리를 작성합니다. 행 ID가 정수이고 긍정적임을 확인한 경우 String.format을 사용하여 통과하는 데 해를 끼치 지 않습니까? 스트링이 아닌 int로만 통과 할 수있는 경우 손상이 어떻게 수행 될 수 있는지 알 수 없습니다.

도움이 되었습니까?

해결책

당신은 맞습니다. 그런 식으로 정수를 통과시키는 것이 안전 할 것입니다. 그러나 이야기의 또 다른 측면도 있습니다.

SQL 표현식을 생성하는 int를 형식화하는 것이 안전한 것으로 간주 될 수 있지만 성능 고려 사항도 있습니다. SQL Server가 처음으로 쿼리를 볼 때 해당 쿼리의 실행 계획을 작성하고 캐시합니다. 다음에 동일한 쿼리가 발행되면 실행 계획이 재사용됩니다.

다른 문자열을 통과하면 별도의 실행 계획이 필요한 별도의 쿼리로 간주됩니다. 매개 변수가 다른 매개 변수화 된 쿼리를 전달하면 (매개 변수가 다르면) 첫 번째 실행 계획은 SQL Server에 의해 재사용됩니다.

성능 이점에 신경 쓰지 않더라도 데이터베이스에 대한 모든 쿼리에 대해 매개 변수화 된 쿼리를 사용합니다. 데이터에 액세스합니다. 만약 너라면 언제나 매개 변수화 된 쿼리를 사용하면 데이터베이스를 쿼리 할 방법을 결정하기 위해 매번 쿼리가 안전한지 여부를 결정하는 데 어려움을 겪습니다.

다른 팁

여기서 자신의 질문에 대답하고 있습니다. System.int32는 포함 할 수 없습니다

';DROP DATABASE xxx;--

그것이 당신이 걱정하는 것이라면. 부정적인 정수를 통과조차도 데이터베이스에 부정적인 영향을 미치지 않습니다!

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top