복붙노트

[SQL] 이 코드 방지 SQL 주입합니까?

SQL

이 코드 방지 SQL 주입합니까?

나는 기존의 데이터 공급자를 분석하는 계약을 체결했고 다음 코드에 결함이 알고; 그러나 그것이 얼마나 나쁜 점을 지적하기 위해, 나는 그것이 SQL 주입에 취약하다는 것을 증명해야합니다.

무엇 "키"매개 변수 PrepareString 기능을 깨고 나를 DROP 문을 실행할 수 있습니다?

Public Shared Function GetRecord(ByVal Key As String) As Record
    Dim Sql As New StringBuilder()

    With Sql
        .Append("SELECT * FROM TableName")
        If String.IsNullOrEmpty(Agency) Then
            .Append(" ORDER BY DateAdded")
        Else
            .Append(" WHERE Key = '")
            .Append(PrepareString(Key))
            .Append("'")
        End If
    End With

    Return ExecuteQuery(Sql.ToString())
End Function

Public Shared Function PrepareString(ByVal Value As String) As String
    Return Value.Replace("''", "'") _
                .Replace("'", "''") _
                .Replace("`", "''") _
                .Replace("´", "''") _
                .Replace("--", "")
End Function

해결법

  1. ==============================

    1.직접적인 질문에 대한 대답에서이 코드 방지 SQL 주입을합니까 : 아니오

    직접적인 질문에 대한 대답에서이 코드 방지 SQL 주입을합니까 : 아니오

    여기 증거입니다 - PrepareString 방법을 통해이 문자열을 밀어 :

    Dim input = "'" & Chr(8) & "; Drop Table TableName; - " & Chr(8) & "-"
    Dim output = PrepareString(input)
    
    Console.WriteLine(input)
    Console.WriteLine(output)
    

    난 당신이 데이터베이스에서 레코드를 완전히 준비된 SQL 문자열을 반환하는 대신 얻을 게시 GetRecord 방법을 수정 :

    Console.WriteLine(GetRecord(output))
    

    그리고 이것은 출력

    Input  = ; Drop Table TableName; --
    Output = '; Drop Table TableName; --
    Query  = SELECT * FROM TableName WHERE Key = ''; Drop Table TableName; --'
    

    코드의 1 여분의 줄을 추가합니다 :

    My.Computer.Clipboard.SetText(input)
    

    그리고 당신은 당신이 당신의 SQL 주입을 완료하려면 웹 사이트에 입력 필드에 붙여 클립 보드에 복사 권한을 필요로하는 문자열을 가지고 :

    '; Drop Table TableName; - -
    

    [당신이 당신의 출력을 생성하는 코드 예제를 수행해야하므로, 제어 문자에 StackOverflow에 의해 게시물 출력에서 ​​생략되었음을 주목]

    PrepareString 메소드가 실행 된 후에는 동일한 출력해야합니다 - 대하을 (8) ASCII 코드는 문자열을 닫습니다 당신이 광산에 추가하고 있다는 여분을 " '"제거 백 스페이스이며, 다음 난 마지막에 내가 원하는대로 추가 할 무료. 귀하의 PrepareString 내 표시되지 않습니다 - 공간을 제거하기 위해 백 스페이스 문자로 - - 내가 실제로 사용하고 있기 때문이다.

    당신이있는 거 건물은 다음 내 드롭 표 문이 방해받지 실행하고 신속하게 쿼리의 나머지 부분을 무시하는 결과 SQL 코드입니다.

    이것에 대해 재미있는 것은 당신이 당신이 발명 할 수있는 모든 문자 확인 바이 패스 기본적으로 인쇄 할 수없는 문자를 사용할 수 있다는 것입니다. (당신이 무엇을 요구하지 않지만이를 방지하는 가장 좋은 경로입니다) 매개 변수화 된 쿼리를 사용하는 것이 가장 안전합니다 그렇게.

  2. ==============================

    2.당신의 의심의 질문에 대답하기 위해, 더는 작동하지 않을 것입니다.

    당신의 의심의 질문에 대답하기 위해, 더는 작동하지 않을 것입니다.

    .Replace ( "``" " ''")와 합법적 인 쿼리를 방해하는 '' '

    .Replace ( " '", "' '")' ''합법적 인 쿼리를 방지 할 수

    .Replace는 ( "-", "")와 합법적 인 쿼리를 방지 할 수 '-'그들에

    .Replace ( " '", "'") 잘못 그들 '' ''합법적 인 쿼리를 수정하는 것

    등등.

    또한, 이스케이프 문자의 전체 세트는 하나 RDBMS마다 다를 수 있습니다. 매개 변수화는 FTW 쿼리합니다.

  3. ==============================

    3.나는 당신이 단지 '와'대체 할 경우는 설사 해킹 생각합니다. 나는 그러나 나는 확실하지 않다, 가능성이 휴식 할 수있는 이스케이프 인용 문자를 변경하는 것이 가능하다는 것을 들었습니다. 난 당신이 안전하지만 생각합니다.

    나는 당신이 단지 '와'대체 할 경우는 설사 해킹 생각합니다. 나는 그러나 나는 확실하지 않다, 가능성이 휴식 할 수있는 이스케이프 인용 문자를 변경하는 것이 가능하다는 것을 들었습니다. 난 당신이 안전하지만 생각합니다.

  4. ==============================

    4.나는 그것이 (적어도 SQL 서버에서) 안전 생각하고, 나는 또한 당신이 실제로 S = s.Replace을해야 할 유일한 것은 생각 ( " '", "' '"). 물론 당신은 매개 변수가있는 쿼리를 사용해야합니다,하지만 당신은 이미 알고있다.

    나는 그것이 (적어도 SQL 서버에서) 안전 생각하고, 나는 또한 당신이 실제로 S = s.Replace을해야 할 유일한 것은 생각 ( " '", "' '"). 물론 당신은 매개 변수가있는 쿼리를 사용해야합니다,하지만 당신은 이미 알고있다.

  5. ==============================

    5.대부분의 당신이 밖으로 볼 필요가 물건이 MSDN 문서 커버 (나는 그것이 SQL 주입에 관한 한 모든 말을 두려워).

    대부분의 당신이 밖으로 볼 필요가 물건이 MSDN 문서 커버 (나는 그것이 SQL 주입에 관한 한 모든 말을 두려워).

    하지만 매개 변수 매개 변수 매개 변수의 모든 사람이 다른 사람의 감정을 에코합니다.

    귀하의 예를 들어 같은 몇몇 개는 [편집 :이 업데이트]은 :

    당신이 확인하고 싶은 기사에 따르면 :

  6. ==============================

    6.당신은 SQL 이스케이프의 자신의 버전을 구현하기 위해 블랙리스트 문자에 노력하고 있습니다. (즉, 빠르게 기존 앱을 고정) SQL 이스케이프는 반드시 나쁜 선택이 아니다하지만 피할 취약점 바로 일을해야 -이 URL을 검토 건의 할 것입니다.

    당신은 SQL 이스케이프의 자신의 버전을 구현하기 위해 블랙리스트 문자에 노력하고 있습니다. (즉, 빠르게 기존 앱을 고정) SQL 이스케이프는 반드시 나쁜 선택이 아니다하지만 피할 취약점 바로 일을해야 -이 URL을 검토 건의 할 것입니다.

    저자가 도움이 기능을 제한없이 취약점을하지 않는 것이 제안을 제공 곳 SQL Server의 탈출을 위해 다른 페이지에 그 URL 링크.

    도움이된다면, 기사가 너무 중괄호를 탈출 제안 (I 대괄호 그들에게 전화 -하지만 []).

  7. ==============================

    7.테이블에서 선택 *; 당신은 당신의 코드를 사용하려고하면 어떤 사람은 키 (전달할 수 및 그들이 원하는 무엇을 적 테이블의 목록을 가져옵니다.

    테이블에서 선택 *; 당신은 당신의 코드를 사용하려고하면 어떤 사람은 키 (전달할 수 및 그들이 원하는 무엇을 적 테이블의 목록을 가져옵니다.

    당신의 코드에서 당신은 당신이 T-SQL 문을 종료하고 다른 하나를 시작할 수 있습니다 세미콜론 확인하지.

    나는 매개 변수가있는 쿼리와 함께 갈 것입니다.

  8. from https://stackoverflow.com/questions/1800013/does-this-code-prevent-sql-injection by cc-by-sa and MIT license