SP가 동적 SQL을 포함 할 때 LINQ 기반 저장 프로 시저 호출에서 아포스트로피를 탈출

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

문제

다음을 발견했습니다.

개발중인 ASP.NET MVC 웹 사이트는 동적 SQL을 포함하는 저장된 프로 시저를 LINQ 호출 할 때 SQL 오류 "Unclosed Quotation Mark ..."를받습니다.

예를 들어:

sp getemployees는 [n'for] 가이 오류를 던지는 매개 변수 [filter_name]을 사용하여 호출됩니다.

다음과 같이 .replace ( " '", "' ''")를 수행하여 문제를 해결할 수 있습니다.

[Function(Name = "dbo.GetEmployees")]
public ISingleResult<EmployeeRow> GetEmployees(
            [Parameter(DbType = "NVarChar(MAX)")] string filter_name)
{
    IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), filter_name.Replace("'", "''"));
    return ((ISingleResult<EmployeeRow>)(result.ReturnValue));
}

이제 나는 모든 SP를 가로 지르고 수동으로이 작업을하고 싶지 않습니다. 이것을 지금 가지고있는 모든 LINQ SP 통화에 적용 해야하는 일반적인 규칙으로 만들 수있는 방법이 있습니까?

또한 SQL 주입 공격을 방지하기 위해 탈출해야 할 다른 것이 있습니까?

편집하다:

추가 질문 : 동적 SQL을 포함하지 않는 SPS에 문제가 있습니까? 데이터베이스에 그 이름을 추가하면 [n''for]로 저장됩니까? 나는 이것이 아마도 사실 일 것임을 깨달았다. 그리고 나는 어쨌든 수동으로해야 할 것이다.

도움이 되었습니까?

해결책 2

나는 내 자신의 질문에 여기에 (가능한) 답을 줄 것이다. (동의하면 의견으로 알려주세요)

SP 내부에서 처리 해야하는 것이 더 정확해 보입니다. 응용 프로그램은 특정 SP에 동적 SQL이 포함 된 것에 대해 걱정할 필요가 없습니다.

다른 팁

문제의 근본이기 때문에 동적 SQL에서 멀어 지도록하는 것이 좋습니다. (나는 이것이 다른 많은 문제를 일으킬 수 있고 불가능할 수도 있다는 것을 알고 있습니다.)

구축하는 동적 SQL이 안전하다는 것을 보장 할 수 없다면 (따라서 사용자로부터 전달되지 않으면 서 내부적 으로이 논리를 제어 함) 문제가 될 것입니다.

filter_name이 '또는 -를 포함하면 어떻게 될까요?

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