복붙노트

[SQL] 나는 작은 따옴표와 주변 사용자 입력을 단일 따옴표를 이스케이프 SQL 주입에 대해 보호 할 수 있습니까?

SQL

나는 작은 따옴표와 주변 사용자 입력을 단일 따옴표를 이스케이프 SQL 주입에 대해 보호 할 수 있습니까?

나는 매개 변수화 된 SQL 쿼리는 사용자 입력을 포함하는 쿼리를 구축 위생적으로 사용자 입력에 최적의 방법이라는 것을 알지만 사용자 입력을 복용하고 작은 따옴표를 이스케이프 작은 따옴표로 전체 문자열을 주변에 어떤 문제가 있는지 궁금하네요. 여기 코드는 :

sSanitizedInput = "'" & Replace(sInput, "'", "''") & "'"

그들은 등 세미콜론, 퍼센트 기호로, 입력 할 수 있습니다 무엇 때문에 문자열을 종료 할 수있는 사용자의 능력을 제거 사용자가 이중 작은 따옴표로 대체 들어간다 모든 단일 인용, 모든 문자열의 일부가 될 것이며, 실제로 명령의 일부로 실행되지 않습니다.

우리는있는 나는 작은 따옴표가 유일한 문자열 구분 기호 및 문자열 구분 기호를 탈출 할 수있는 유일한 방법이라고 생각, 마이크로 소프트 SQL 서버 2000을 사용하는, 그래서 아무것도에게 사용자 유형을 실행할 수있는 방법은 없습니다.

나는이에 대해 SQL 주입 공격을 할 수있는 방법이 표시되지 않습니다,하지만 난이 방탄로했다 경우 다른 나에게 누군가가 이미 생각했을 보인다 실현 그것은 일반적인 관행이 될 것입니다.

이 코드 문제는 무엇입니까? 이 위생 기술 지나서 SQL 주입 공격을 얻을 수있는 방법이 있나요? 이 기술을 악용하는 샘플 사용자 입력이 매우 도움이 될 것입니다.

최신 정보:

나는 아직도 효과적으로 코드에 대한 SQL 주입 공격을 할 수있는 방법을 알고하지 않습니다. 몇 사람이 백 슬래시 하나 따옴표를 탈출하고 나머지 문자열은 SQL 명령의 일부로 실행 될 수 있도록 문자열을 끝으로 기타를 떠날 것을 제안, 나는이 방법으로 SQL 주입하는 작업을 것이라고 실현 작은 따옴표를 탈출하지만, SQL 서버 2000 (내가 찾을 수 있었던 것을) 유일한 방법에서 MySQL 데이터베이스는 또 다른 작은 따옴표로이다; 백 슬래시는하지 않을 것이다.

단일 인용의 탈출을 막을 방법이없는 한이 모든 하나의 연속 문자열로 이동합니다 때문에, 사용자 입력의 나머지 부분 중 어느 것도 실행되지 않습니다.

나는 위생적으로 입력에 더 나은 방법이 있다는 것을 이해하지만 방법은 내가 작동하지 않습니다 위에 제공된 이유는 학습에 정말 더 관심이 있어요. 사람이 위생 방법에 대한 SQL 주입 공격을하기 위해 특정의 방법을 알고 있다면 나는 그것을보고 싶어요.

해결법

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

    1.우선, 그냥 나쁜 습관이다. 입력 검증은 반드시 필요하지만 항상 불확실도 있습니다. 설상가상으로, 블랙리스트 확인은 명시 적으로 훨씬 더 나은 엄격하게 수락 어떤 값 / 형식 정의, 항상 문제가된다. 틀림없이, 이것은 항상 가능한 것은 아니다 -하지만 어느 정도에 항상 수행해야합니다. 주제에 대한 일부 연구 논문 :

    우선, 그냥 나쁜 습관이다. 입력 검증은 반드시 필요하지만 항상 불확실도 있습니다. 설상가상으로, 블랙리스트 확인은 명시 적으로 훨씬 더 나은 엄격하게 수락 어떤 값 / 형식 정의, 항상 문제가된다. 틀림없이, 이것은 항상 가능한 것은 아니다 -하지만 어느 정도에 항상 수행해야합니다. 주제에 대한 일부 연구 논문 :

    포인트는, 당신이 어떤 블랙리스트 (그리고 너무 관대 화이트리스트)를 우회 할 수있다. 심지어 탈출 인용 내 종이 쇼 상황의 마지막 링크는 우회 할 수있다.

    이러한 상황이 적용되지 않는 경우에도, 여전히 나쁜 생각이다. 앱이 하찮게 작은 경우를 제외하고 또한, 당신은 유지 보수 처리해야 할거야, 그리고 어쩌면 지배 구조의 특정 금액 : 어떻게 당신은 그것의 완료 권리, 모든 곳에서 모든 시간을 보장합니까?

    적절한 방법은 그것을 할 수 있습니다 :

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

    2.좋아,이 응답은 질문의 업데이트에 관련된 것입니다 :

    좋아,이 응답은 질문의 업데이트에 관련된 것입니다 :

    이제, MySQL의 백 슬래시 이스케이프 외에 - 우리가 실제로 MSSQL에 대해 얘기하고 있음을 고려하여, 여전히 SQL 코드를 주입의 3 개 가지 방법이 실제로있다

    이 모든 항상 유효하고, 주위에 당신의 실제 코드에 매우 의존하지 않습니다 고려 :

    그런 다음 당신이 얻을 것은 - 탈출 사용자 이름이며, 다음 20 자 손질. 문제는 여기에 - 나는 (19의 예 후), 그리고 탈출 따옴표가 (21 문자에서) 손질합니다 20 문자 내 견적을 맡기 겠소. 그런 다음 SQL

    sSQL = "select * from USERS where username = '" + username + "'  and password = '" + password + "'"
    

    암호가 이미 따옴표 밖에있는 발생합니다 상기 잘못된 사용자 이름과 함께, 그냥 직접 페이로드를 포함합니다.  3. 유니 코드 밀수가 - 특정 상황에서, 높은 수준의 유니 코드 문자를 전달하는 것이 가능하다는 것을 견적처럼 보이지만 아니다 - 그것은 갑자기 인 데이터베이스에 도달 할 때까지. 당신이 그것을 확인할 때 인용하지 않기 때문에, 그것은 ... 쉽게 통과 독창적 인 연구에 내 이전 자세한 내용은 응답 및 링크가 표시됩니다.

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

    3.한마디로 : 자신을 탈출 쿼리를 수행하지 마십시오. 당신이 뭔가 잘못을받을 수밖에 있습니다. 대신, 쿼리를 매개 변수화하거나 어떤 이유로 그렇게 할 수없는 경우, 당신을 위해이 작업을 수행 기존 라이브러리를 사용합니다. 스스로 일을해야 할 이유가 없습니다.

    한마디로 : 자신을 탈출 쿼리를 수행하지 마십시오. 당신이 뭔가 잘못을받을 수밖에 있습니다. 대신, 쿼리를 매개 변수화하거나 어떤 이유로 그렇게 할 수없는 경우, 당신을 위해이 작업을 수행 기존 라이브러리를 사용합니다. 스스로 일을해야 할 이유가 없습니다.

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

    4.나는 질문 요청 후이 오랜 시간 알지만 ..

    나는 질문 요청 후이 오랜 시간 알지만 ..

    '인수를 인용'절차에 대한 공격을 시작하는 한 가지 방법은 문자열 잘림으로합니다. MSDN에 따르면, SQL 서버 2000 SP4 (및 SQL Server 2005 SP1)에, 너무 긴 문자열이 조용히 잘립니다.

    당신이 문자열을 인용하면, 문자열의 크기가 증가한다. 모든 아포스트로피가 반복된다. 이 후, 외부 버퍼 SQL 부분 푸시 할 수있다. 효과적으로 where 절 (A)의 일부를 멀리 트림 수 있도록.

    이것은 아마도 그것이 어떻게했는데 모든 검사를하지에 당신이 '갱신'문을 남용 할 수있는 '사용자 관리'페이지 시나리오에서 주로 유용 할 것이다.

    모든 인수를 인용하기로 결정한다면, 반드시 문자열의 크기에 어떤 일이 일어나는지 알고 당신이 절단으로 실행하지 않는 것이 그것을 참조하십시오.

    나는 매개 변수와 함께가는 것이 좋습니다. 항상. 그냥 내가 데이터베이스에 그것을 적용 할 수 있으면 좋겠다. 그리고 부작용으로, 당신은 더 많은 문의가 동일하게 보이기 때문에 더 나은 캐시 히트를 얻을 가능성이 더 높습니다. (이것은 오라클 8 일에 확실하게 사실이었다)

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

    5.처음부터 쿼리를 작성하는 것이 유일한 가능한 대답했다 '고급 검색'기능을 처리 할 때 나는이 기술을 사용했습니다. (예 : GUI 컨트롤이 사용자의 학습 임계 값을 줄이기 위해 제품 속성에 대한 제약 조건의 제한 집합을 기반으로 제품, 표시 열 및 그 허용 값을 검색하는 사용자 수 있습니다.)

    처음부터 쿼리를 작성하는 것이 유일한 가능한 대답했다 '고급 검색'기능을 처리 할 때 나는이 기술을 사용했습니다. (예 : GUI 컨트롤이 사용자의 학습 임계 값을 줄이기 위해 제품 속성에 대한 제약 조건의 제한 집합을 기반으로 제품, 표시 열 및 그 허용 값을 검색하는 사용자 수 있습니다.)

    자체에서는 안전 AFAIK입니다. (- 모든 데이터베이스 또는 기술에 대한 신뢰도를 보장 할 수 없습니다 적어도, ADO 또는 ADO.NET을 사용하여 SQL 서버에 쿼리를 전달하지 않을 경우이기는하지만) 또 다른 응답자가 지적한 바와 같이, 그러나, 당신은 또한 탈출 백 스페이스를 처리해야 할 수도 있습니다.

    그루터기는 당신이 정말로 문자열 (항상 잠재적으로 악의적 인) 사용자의 입력을 포함하는 확신해야한다는 것입니다, 어느 문자열이 유효한 SQL 쿼리입니다. 이 값은 원래 사용자가 제공 한 - 데이터베이스에서 값을 사용하는 경우 함정 중 하나는? 그렇다면, 그들은 또한 이스케이프해야합니다. 내 대답은 가능한 한 늦게로 살균하는 것입니다 (하지만 나중에!), SQL 쿼리를 구성 할 때.

    그냥 간단 - 그러나 대부분의 경우, 매개 변수 바인딩 길을 가야하는 것입니다.

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

    6.입력 위생 절반 엉덩이에 당신이 원하는 것이 아닙니다. 전체 엉덩이를 사용합니다. 텍스트 필드에 정규 표현식을 사용합니다. 적절한 숫자 형식에 수치를 TryCast하고, 일을하지 않는 경우 유효성 검사 오류를보고합니다. 여기에는 '같은 입력의 공격 패턴을 검색하는 것은 매우 간단합니다 -. 사용자로부터 모두 입력 적대적인 가정한다.

    입력 위생 절반 엉덩이에 당신이 원하는 것이 아닙니다. 전체 엉덩이를 사용합니다. 텍스트 필드에 정규 표현식을 사용합니다. 적절한 숫자 형식에 수치를 TryCast하고, 일을하지 않는 경우 유효성 검사 오류를보고합니다. 여기에는 '같은 입력의 공격 패턴을 검색하는 것은 매우 간단합니다 -. 사용자로부터 모두 입력 적대적인 가정한다.

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

    7.당신이 아는 것 같은데 그것은 나쁜 아이디어 어쨌든입니다.

    당신이 아는 것 같은데 그것은 나쁜 아이디어 어쨌든입니다.

    어떤이 같은 문자열의 견적을 탈출 같은 약 : \ '

    귀하 초래 교체 : \ '

    백 슬래시가 처음 견적을 탈출하는 경우, 다음 두 번째 따옴표는 문자열을 종료되었습니다.

  8. ==============================

    8.간단한 답 : 그것은 모든 시간을 때로는 작동하지만하지 않습니다. 당신은 당신이하는 모든 일에 화이트리스트 유효성 검사를 사용하려면,하지만 난 당신이 추측 블랙리스트와 함께 갈 수밖에 그래서 항상 가능하지 알고 있습니다. 마찬가지로, 당신은 모든 일에 매개 변수화 저장 발동를 사용할 수 있지만이 매개 변수를 사용 sp_execute 두 강제하고, 그래서 다시 한 번, 항상 수 없습니다.

    간단한 답 : 그것은 모든 시간을 때로는 작동하지만하지 않습니다. 당신은 당신이하는 모든 일에 화이트리스트 유효성 검사를 사용하려면,하지만 난 당신이 추측 블랙리스트와 함께 갈 수밖에 그래서 항상 가능하지 알고 있습니다. 마찬가지로, 당신은 모든 일에 매개 변수화 저장 발동를 사용할 수 있지만이 매개 변수를 사용 sp_execute 두 강제하고, 그래서 다시 한 번, 항상 수 없습니다.

    당신이 가지고 올 수있는 모든 가능한 블랙리스트 주위 방법 (일부 화이트리스트도)가있다.

    괜찮은 작성자는 여기에 있습니다 : http://www.owasp.org/index.php/Top_10_2007-A2

    당신이 빠른 수정으로이 작업을 수행해야하는 경우 그것을 당신에게 장소에서 진짜를 얻을 수있는 시간을 제공합니다. 그러나 당신은 이제 안전을 생각하지 않습니다.

  9. ==============================

    9.SQL-주사의 안전에 두 가지 방법, 예외없이이있다; 준비된 명령문 또는 prameterized 저장 프로 시저.

    SQL-주사의 안전에 두 가지 방법, 예외없이이있다; 준비된 명령문 또는 prameterized 저장 프로 시저.

  10. ==============================

    10.사용 가능한 매개 변수화 쿼리가있는 경우 당신은 항상 그들을 사용한다. 오직 필요한 것은 그물을 통해 슬립 한 쿼리를위한 당신의 DB가 위험합니다.

    사용 가능한 매개 변수화 쿼리가있는 경우 당신은 항상 그들을 사용한다. 오직 필요한 것은 그물을 통해 슬립 한 쿼리를위한 당신의 DB가 위험합니다.

  11. ==============================

    11.누군가가 SET QUOTED_IDENTIFIER OFF를 실행하고 당신에 따옴표를 사용까지 그래, 바로 작동합니다.

    누군가가 SET QUOTED_IDENTIFIER OFF를 실행하고 당신에 따옴표를 사용까지 그래, 바로 작동합니다.

    편집 : 그것은 악의적 인 사용자가 인용 식별자를 해제 허용하지 않는 한 간단하게되지 않습니다 :

    당신은 반드시 그것을 모른 채 떨어져있을 수 QUOTED_IDENTIFIER 많은 방법이있다. 틀림없이 - 이것은 당신이 찾고있는 악용 흡연 건 아니지만, 꽤 큰 공격 표면입니다. 물론, 경우 당신은 또한 따옴표를 탈출 - 우리가 시작 후 우린 다시. ;)

  12. ==============================

    12.귀하의 방어는 경우 실패합니다 :

    귀하의 방어는 경우 실패합니다 :

    (당신은 대체하여 수행 한 후에 만 ​​후자의 경우에, 그것은 확장 된 뭔가 할 것)

  13. ==============================

    13.패트릭, 당신은 모든 입력, 심지어 숫자 입력 주위에 따옴표를 추가? 당신이 숫자 입력을 가지고 있지만, 그 주위의 작은 따옴표를 넣어하지 않는 경우, 당신은 노출이있다.

    패트릭, 당신은 모든 입력, 심지어 숫자 입력 주위에 따옴표를 추가? 당신이 숫자 입력을 가지고 있지만, 그 주위의 작은 따옴표를 넣어하지 않는 경우, 당신은 노출이있다.

  14. ==============================

    14.모든 사용자 입력의 sanitisation이 될 것이라고 무엇 추한 코드! 그런 다음 SQL 문에 대한 어설픈 모두 StringBuilder. 많은 청소기 코드의 준비된 명령문 방법 결과 및 SQL 주입 혜택은 정말 좋은 또한 있습니다.

    모든 사용자 입력의 sanitisation이 될 것이라고 무엇 추한 코드! 그런 다음 SQL 문에 대한 어설픈 모두 StringBuilder. 많은 청소기 코드의 준비된 명령문 방법 결과 및 SQL 주입 혜택은 정말 좋은 또한 있습니다.

    또한 왜 바퀴를 재발견?

  15. ==============================

    15.오히려 (좋아 보이는) 두 개의 작은 따옴표에 작은 따옴표를 변경하는 대신, 왜 그냥, 아포스트로피에 견적을 변경하거나 완전히 제거?

    오히려 (좋아 보이는) 두 개의 작은 따옴표에 작은 따옴표를 변경하는 대신, 왜 그냥, 아포스트로피에 견적을 변경하거나 완전히 제거?

    어느 쪽이든, 당신이 합법적으로 작은 따옴표를 사용할 수있다 (이름과 같은) 일이 특히 ... kludge 약간의 ...

    참고 : 아마 대부분의 시간을 현실적인하지 않은 데이터베이스를 명중하기 전에 당신의 방법은 또한 응용 프로그램에서 모든 사람의 작업을 가정은 항상 위생적으로 입력에 기억합니다.

  16. ==============================

    16.당신은 문자열을위한 작품, 숫자 술어를 위해 당신은 또한 확실히 그들은 단지 (단순 검사가 그 INT / 더블 / 진수로 구문 분석 할 수 있습니까?) 번호를 전달했는지 확인하는 데 필요한 해결책을 찾을 수도 있지만.

    당신은 문자열을위한 작품, 숫자 술어를 위해 당신은 또한 확실히 그들은 단지 (단순 검사가 그 INT / 더블 / 진수로 구문 분석 할 수 있습니까?) 번호를 전달했는지 확인하는 데 필요한 해결책을 찾을 수도 있지만.

    그것은 추가 작업을 많이합니다.

  17. ==============================

    17.그것은 작동 할 수 있지만, 그것은 나에게 조금 날조 한 것 같습니다. 나는 각 문자열 대신 정규식에 대해 그것을 테스트하여 유효한지 확인하는 것이 좋습니다 것입니다.

    그것은 작동 할 수 있지만, 그것은 나에게 조금 날조 한 것 같습니다. 나는 각 문자열 대신 정규식에 대해 그것을 테스트하여 유효한지 확인하는 것이 좋습니다 것입니다.

  18. ==============================

    18.주제를 공부 한 후, 난 당신 만이 규칙에 따라 제안 안전으로 입력 소독 생각 :

    주제를 공부 한 후, 난 당신 만이 규칙에 따라 제안 안전으로 입력 소독 생각 :

    이 4 점 준수, 당신은 안전합니다. 당신이 그들 중 하나를 위반하는 경우, SQL 주입을위한 방법이 열립니다.

  19. from https://stackoverflow.com/questions/139199/can-i-protect-against-sql-injection-by-escaping-single-quote-and-surrounding-use by cc-by-sa and MIT license