문제

나는 설교에 모두를 제 동료들과 여기에서 그의 선함에 대하여 매개 변수를 사용하여 SQL 쿼리,특히습니다.습니다.나는 심지어 지금까지 갔으로 약속으로 그들을 주는 면에 대한 SQL injection attacks.

하지만 내가 궁금해하기 시작했다면 이것이 정말 사실입니다.은 거기에 알려진 모든 SQL injection 공격하는 것이 성공에 매개 변수가 있는 쿼리?할 수 있습니 예를 들어 보내는 문자열이 발생 buffer overflow 서버에서?

이 있다 물론 다른 고려사항을 확인하는 웹 응용 프로그램은 안전합니다(같은 살균용 입력 및 모든 물건)그러나 지금 생각하의 SQL 입니다.나는에서 특히 관심에 대한 공격을 MsSQL2005 및 2008 이후 그들은 기본 데이터베이스하지만,모든 데이터베이스는 재미있다.

편집:을 명확히 무엇을 의미하는 매개변수와 매개 변수가 있는 검색어입니다.매개 변수를 사용하여 내 말은"를 사용하여 변수를"대신 건물에서 sql 쿼리에는 문자열을 사용합니다.
그래서 대신에 이것을 하:

SELECT * FROM Table WHERE Name = 'a name'

우리는 이렇:

SELECT * FROM Table WHERE Name = @Name

다음 설정 값을@이름을 매개 변수가 쿼리/명령 객체입니다.

도움이 되었습니까?

해결책

자리 소유자 주사를 방지하기에 충분합니다. 여전히 버퍼 오버플로에 개방적 일 수 있지만 SQL 주입과 완전히 다른 공격의 향이입니다 (공격 벡터는 SQL 구문이 아니라 이진이 아닙니다). 통과 된 매개 변수가 모두 제대로 피해지기 때문에 공격자가 "라이브"SQL과 같이 처리 될 데이터를 전달하는 방법은 없습니다.

장소 보유자 내부에서 함수를 사용할 수 없으며 자리 표시자를 열이나 테이블 이름으로 사용할 수 없습니다. 이들은 문자열 리터럴로 인용되기 때문에 열이나 테이블 이름으로 사용할 수 없습니다.

그러나 사용하는 경우 매개 변수 a의 일부로 문자열 연결 동적 쿼리 내부에서는 문자열이 탈출되지 않지만 문자가되기 때문에 여전히 주입에 취약합니다. 매개 변수 (예 : 정수)에 다른 유형을 사용하는 것은 안전합니다.

즉, 사용 입력을 사용하여 다음과 같은 것의 값을 설정하는 경우 security_level, 누군가는 시스템에서 관리자를 만들고 무료로 가질 수 있습니다. 그러나 이것은 기본 입력 검증 일 뿐이며 SQL 주입과 관련이 없습니다.

다른 팁

아니,거기에 여전히 위험의 SQL injection 모든 시간을 보간 확인되지 않은 데이터로 SQL 쿼리가 있습니다.

쿼리 매개 변수에 도움이 이를 방지하기 위해 위험으로 분리하는 문자 값에 SQL 구문입니다.

'SELECT * FROM mytable WHERE colname = ?'

그러나 거기에 다른 목적으로 보간으로 데이터를 동적으로 SQL 쿼리할 수 없는 쿼리 매개 변수를 사용하기 때문에,그것은 SQL 값을 대신 표,이름,열 이름을 표현,또는 다른 어떤 구문입니다.

'SELECT * FROM ' + @tablename + ' WHERE colname IN (' + @comma_list + ')'
' ORDER BY ' + @colname'

It doesn't matter whether you're 를 사용하여 저장된 절차 또는 실행하는 dynamic SQL 쿼리를 응용 프로그램에서 직접 코드입니다.위험은 여전히 존재한다.

치료제에서는 이러한 경우를 고용하는 것입 FIEO 으로 필요하다:

  • 필터 입력: 유효성을 검사하는 데이터는 합법적인 정수 테이블 이름,열 이름,등등.기 전에 당신 같다.

  • 탈 출력: 이 경우에는"출력"의 데이터로 SQL 쿼리가 있습니다.우리가 사용하는 기능을 변환하는 변수로 사용하는 문자열에는 SQL 식 있도록,견적 마크 및 기타 특별한 문자를 내부 문자열은 탈출했다.우리는 또한 함수를 사용하여 변환하는 변수가 될 것으로 사용되는 테이블 이름,열 이름,등등.에 대한 구문을 쓰는 것처럼 전체 SQL 식 동적으로는 더 복잡한 문제입니다.

이 스레드에는 "매개 변수화 된 쿼리"의 정의에 대해 약간의 혼란이있는 것 같습니다.

  • 매개 변수를 수용하는 저장된 Proc와 같은 SQL.
  • DBMS 매개 변수 컬렉션을 사용하여 호출되는 SQL.

이전의 정의가 주어지면 많은 링크가 작업 공격을 보여줍니다.

그러나 "정상적인"정의는 후자의 정의입니다. 그 정의를 감안할 때, 나는 작동 할 SQL 주입 공격에 대해 모른다. 그렇다고해서 하나가 없다는 것을 의미하지는 않지만 아직 보지 못했습니다.

의견에서, 나는 나 자신을 충분히 명확하게 표현하지 않기 때문에 다음은 희망적으로 더 명확해질 예입니다.

이 접근법 ~이다 SQL 주입에 열립니다

exec dbo.MyStoredProc 'DodgyText'

이 접근법 그렇지 않습니다 SQL 주입에 열립니다

using (SqlCommand cmd = new SqlCommand("dbo.MyStoredProc", testConnection))
{
    cmd.CommandType = CommandType.StoredProcedure;
    SqlParameter newParam = new SqlParameter(paramName, SqlDbType.Varchar);
    newParam.Value = "DodgyText";
    .....
    cmd.Parameters.Add(newParam);
    .....
    cmd.ExecuteNonQuery();
}

동적 쿼리를 구성하는 데 사용되는 문자열 유형 (Varchar, Nvarchar 등)의 SQL 매개 변수는 여전히 취약합니다.

그렇지 않으면 매개 변수 유형 변환 (예 : int, 소수, 날짜 등)은 매개 변수를 통해 SQL을 주입하려는 시도를 제거해야합니다.

편집 : PARAMETER @P1이 테이블 이름이되는 예제.

create procedure dbo.uspBeAfraidBeVeryAfraid ( @p1 varchar(64) ) 
AS
    SET NOCOUNT ON
    declare @sql varchar(512)
    set @sql = 'select * from ' + @p1
    exec(@sql)
GO

드롭 다운 목록에서 @P1을 선택하면 잠재적 인 SQL-injection Attack 벡터입니다.

@P1이 프로그래밍 방식으로 공식화되면 사용자가 개입 할 수있는 능력을 사용하여 잠재적 인 SQL-injection Attack 벡터가 아닙니다.

버퍼 오버 플로우는 SQL 주입이 아닙니다.

매개 변수화 쿼리는 SQL 주입에 안전하다는 것을 보장합니다. SQL 서버의 버그 형태로 악용이 가능하지 않다고 보장하지는 않지만 아무것도 보장하지 않습니다.

권한이 테이블 레벨에 있어야하므로 동적 SQL을 어떤 방식 으로든 사용하는 경우 데이터가 안전하지 않습니다. 예, 해당 쿼리의 유형과 주입 공격의 유형과 금액은 제한되었지만 사용자가 시스템에 길을 찾을 수 있고 내부 사용자가하지 말아야 할 것에 액세스 할 수있는 사람에게 완전히 불가능한 경우 사용자가 얻을 수있는 액세스에 국한되지 않습니다. 사기를 저지르거나 개인 정보를 판매하기 위해 주문합니다. 모든 유형의 동적 SQL은 위험한 연습입니다. 비 동력 저장 Procs를 사용하는 경우 Procesdure 레벨에서 권한을 설정할 수 있으며 Procs에 의해 정의 된 것 (물론 시스템 관리자 제외)을 제외하고는 아무것도 할 수 없습니다.

저장된 Proc가 오버플로/잘림을 통해 특수 유형의 SQL 주입에 취약 할 수 있습니다. 참조 : 데이터 절단으로 인한 주입은 여기를 참조하십시오.

http://msdn.microsoft.com/en-us/library/ms161953.aspx

매개 변수를 사용하면 문자열을 쉽게 저장하거나 정책이없는 경우 사용자 이름을 말할 수 있습니다.

이것은 그 자체로 아무런 해를 끼치 지 않지만, 해당 날짜가 응용 프로그램에서 어디에서 어떻게 사용되는지 더 잘 알고 있습니다 (예 : 쿠키에 저장되어 나중에 다른 일을하기 위해 검색했습니다.

동적 SQL을 예제로 실행할 수 있습니다

DECLARE @SQL NVARCHAR(4000);
DECLARE @ParameterDefinition NVARCHAR(4000);

SELECT  @ParameterDefinition = '@date varchar(10)'

SET @SQL='Select CAST(@date AS DATETIME) Date'

EXEC sp_executeSQL @SQL,@ParameterDefinition,@date='04/15/2011'
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top