2008-08-18 4 views
6

다양한 언어로 된 .NET, Java 및 기타 고급 데이터베이스 API는 데이터베이스 서버에 일반 텍스트 명령을 보내는 것과 달리 준비된 명령문 및 매개 변수 바인딩이라는 기술을 제공하는 경우가 많습니다. 제가 알고 싶은 것은 다음과 같은 문장을 실행할 때 일어나는 일입니다.매개 변수 바인딩 : 후드에서 어떤 일이 발생합니까?

SqlCommand cmd = new SqlCommand("GetMemberByID"); 
cmd.CommandType = CommandType.StoredProcedure; 
SqlParameter param = new SqlParameter("@ID", memberID); 
para.DbType = DbType.Integer; 
cmd.Parameters.Add(param); 

나는 이것이 최선의 방법이라는 것을 알고 있습니다. SQL 주입 공격은 이러한 방식으로 최소화됩니다. 그러나 당신이이 진술을 실행할 때 두건의 밑에 정확하게 무엇이 일어나는가? 최종 결과는 여전히 SQL 안전 문자열입니까? 그렇지 않다면 최종 결과는 무엇입니까? 그리고 이것은 SQL 주입 공격을 막기에 충분합니까?

답변

5

The MySQL manual page (준비된 명령문)은 많은 정보 (다른 RDBMS에 적용해야 함)를 제공합니다.

기본적으로 구문은 미리 구문 분석되고 처리되며 매개 변수는 SQL 코드와 함께 처리되는 대신 별도로 전송됩니다. 이렇게하면 매개 변수가 설정되기 전에 SQL이 구문 분석되므로 SQL 주입 공격이 제거됩니다.

0

MS SQL을 사용하는 경우 프로파일 러를로드하면 매개 변수화 된 쿼리를 사용할 때 생성되는 SQL 문이 표시됩니다.

string sql = "SELECT * FROM tblDomains WHERE DomainName = @DomName AND DomainID = @Did"; 
Database db = DatabaseFactory.CreateDatabase(); 
using(DbCommand cmd = db.GetSqlStringCommand(sql)) 
{ 
    db.AddInParameter(cmd, "DomName", DbType.String, "xxxxx.net"); 
    db.AddInParameter(cmd, "Did", DbType.Int32, 500204); 

    DataSet ds = db.ExecuteDataSet(cmd); 
} 

이 생성 : 여기에 SQL 서버 2005에 대한 예 (I 기업의 Libary 3.1을 사용하고 있지만, 결과는 바로 같은 사용 SqlParameters이다)의

exec sp[underscore]executesql N'SELECT * FROM tblDomains WHERE DomainName = @DomName AND DomainID = @Did', 
    N'@DomName nvarchar(9), 
    @Did int', 
    @DomName=N'xxxxx.net', 
    @Did=500204 

또한 여기에서 볼 수 있습니다, 인용 문자를 매개 변수로 전달 된 경우, 그에 따라 이스케이프 : 평신도 측면에서

db.AddInParameter(cmd, "DomName", DbType.String, "'xxxxx.net"); 

exec sp[underscore]executesql N'SELECT * FROM tblDomains WHERE DomainName = @DomName AND DomainID = @Did', 
    N'@DomName nvarchar(10), 
    @Did int', 
    @DomName=N'''xxxxx.net', 
    @Did=500204 
0

: 준비된 문을 보내는 경우 사용할 수있는 경우 다음 DB는 계획을 사용할 것이다, 그렇지하지 않습니다 이 쿼리가 전송 될 때마다 계획을 다시 작성해야하지만 매개 변수의 값만 변경되었습니다. 이것은 procs의 작동 방식과 매우 유사합니다. procs의 추가 이점은 기본 테이블이 아닌 procs를 통해서만 권한을 부여 할 수 있다는 것입니다.

관련 문제