2009-05-14 1 views
2

웹 입력에 허용 된 문자 허용 목록을 구현하기 위해 C# 정규식을 사용하여 몇 가지 문제가 발생했습니다. SQL 주입 및 XSS 공격을 피하려고합니다. 허용되는 문자의 화이트리스트가 갈 길이 란 것을 읽었습니다.C# regex 's를 사용하여 화이트리스트를 사용하여 이름 (사람 및 회사)을 거부하는 방법은 무엇입니까?

입력 내용은 사람 이름과 회사 이름입니다.

문제의 일부

은 다음과 같습니다 앰퍼샌드가

  1. 회사 이름. "Jim & 아들들"처럼. 앰퍼샌드는 중요하지만 위험합니다.

  2. 문자 세트를 사용하여 이름을 입력하는 이름 (예 : 아시아 고객이 있음)의 유니 코드 문자. 나는이 모든 것들을 화이트리스트에 올릴 필요가있다.

  3. 회사 이름에는 "S/A"및 "S \ A"와 같은 모든 종류의 슬래시가있을 수 있습니다. 그 사람들은 위험한가요?

나는 이미 DB에있는 모든 데이터를보고 (새로운 사용자가 입력 한) 거의 모든 문자를 허용하려고합니다.

이러한 (및 기타) 문제를 처리 할 수있는 좋은 화이트리스트에 대한 제안 사항이 있습니까?

참고 : 이것은 레거시 시스템이므로 모든 코드를 제어 할 수 없습니다. 우선 나쁜 데이터가 시스템에 침투하는 것을 막아서 공격 수를 줄이기를 희망했습니다.

+0

[이를 EnableClientScript = "거짓" SO 스레드] (http://stackoverflow.com/questions/188870/how-to-use-c-to-sanitize-input-on-an-html-page) 비슷한 것 같습니다 - 도움이 될 수도 있습니다. –

답변

4

은 주입 공격으로부터 자신을 보호하기위한 좋은 토론을 많이하고 있습니다. 한마디로

:

  1. 당신이 할 수있는,
  2. SQL 문 귀하의 경우에는

를 파라미터로 가장 잘 프레임 워크 기반의 방법을 사용하여 문자열을 탈출

  • 수와 같은 입력 필터 이름 필드를 작은 문자 세트로 제한하십시오.회사 분야는 더욱 어려워 질 것이며, 입장 보안의 필요성과 사용자 입장의 자유에 대한 필요성을 고려하고 균형을 맞추어야합니다. 다른 사람들이 말했듯이, 사용자 지정 위생 방법을 쓰려고하는 것은 까다 롭고 위험합니다. 단순하게 유지하고 아키텍처를 통해 자신을 보호하십시오 .- 위생 처리 후에도 문자열이 단순히 "안전"하다는 것에 의존하지 마십시오.

    편집 :

    명확히하기 - 당신이 허용 된 사이트 목록을 개발하려는 경우 당신이 원하는 데이터에 전적으로 의존이기 때문에, 그것은, 지역 사회가 나눠 수있는 일이 아니다. 하지만 이름에 대한 정규식 허용 목록의 예를 살펴 보겠습니다. A-Z, a-z 및 공간을 허용 목록에 추가했습니다.

    Regex reWhiteList = new Regex("^[A-Za-z ]+$") 
    

    전체 문자열이 해당 문자로 구성되어 있는지 확인합니다. 숫자, 마침표, 따옴표 또는 다른 문자열이이 정규식과 일치하지 않으므로 허용 목록에 실패합니다.

    if (reWhiteList.IsMatch(strInput)) 
        // it's ok, proceed to step 2 
    else 
        // it's not ok, inform user they've entered invalid characters and try again 
    

    이 정보가 도움이되기를 바랍니다. 이름과 회사 이름을 사용하면 확인할 수있는 까다로운 패턴을 개발하기가 힘들며 불가능한 시간을 갖게 될 것입니다.하지만 여기에 나와있는 것처럼 허용되는 간단한 문자 목록을 만들 수 있습니다.

  • +0

    1 단계는 내가 알아 내려고하는 것입니다. 참고 문헌에서는 화이트리스트를 언급합니다. –

    +0

    >> 화이트리스트를 개발하려고 할 때, 커뮤니티가 나눠 줄 수있는 것이 아니라 커뮤니티가 도와 줄 수있는 것이라고 생각합니다. 나는 사람들 이름을 허용하려고 노력하고있다. 대부분의 사람들은 그것들을 가지고 있습니다 :) 그것은 이상하고 희귀 한 일이 아닙니다. 나는 당신의 접근 방식에 동의합니다. 난 그냥 "reWhiteList"을 알아야합니다 –

    2

    회사 이름에 거의 모든 종류의 기호가 포함될 수 있으므로이 항목이 얼마나 효과가 있을지 모르겠습니다. 나는 당신의 끈이 "자연스럽게"안전하기를 바라지 않고 다양한 공격으로부터 직접 자신을 보호하는 것에 집중할 것입니다. 하려고하지 마십시오

    (물론 그들이 앰퍼샌드, 콜론, 세미콜론, 느낌표, 하이픈, 퍼센트 기호와 상황의 호스트에 "안전하지 않은"이 될 수있는 다른 모든 종류의 것들을 할 수 있습니다.)

    3

    특히 정규식으로 이름을 살균하십시오!

    그냥 당신이 제대로 값을 탈출하고 DB에 안전하게 저장 및 HTML에 제시 할 때 그들을 다시 탈출하고 있는지 확인

    0

    나는 자신의 정규 표현식은 좋은 생각이 아니다 쓰고 생각 : 그것은 것 열심히. 웹 프레임 워크의 기존 기능을 활용 해보십시오. 그물에는 많은 리소스가 있습니다. C#이라면 ASP.NET을 사용하고 있다고 가정하면 다음 문서를 사용해보십시오. How To: Protect From Injection Attacks in ASP.NET

    1

    왜 데이터를 필터링하거나 정규식을 지정하거나 이스케이프 처리해야하는 이유는 데이터베이스에 액세스 할 때 바인드 변수를 사용해야하는 이유입니다.

    , 고객과 같이 입력 할 수 있습니다이 방법 : 아무것도 '또는'X '='당신의 SQL 코드는 변수를 구문 분석하지 않기 때문에 걱정하지 않는 응용 프로그램은이 때를 X

    그리고 설정하지 있기 때문에 진술서를 준비하십시오. 나는.

    'SELECT count(username) FROM usertable WHERE username = ? and password = ?' 
    

    그런 다음 해당 변수를 설정하여 해당 코드를 실행합니다.

    이것은 PHP, PERL, J2EE 응용 프로그램 등에서 사용할 수 있습니다.

    +0

    그들은 여전히 ​​자바 스크립트를 입력하고 XSS 공격을 할 수 있습니까? –

    +0

    또한 데이터를 브라우저로 보낼 때 html로 인코딩해야합니다. – dave4420

    0

    이것은 회사 이름에 대한 나의 현재 정규 표현식 WHITELIST입니다. 이러한 문자 이외의 모든 입력은 거부 :

    "^ [0-9 \ P는 {L} '-, /는 & \.] {0,50}는 $"

    의 \ P {L}이 일치 모든 유니 코드 "편지". 따라서 액센트와 아시아 문자는 허용 목록에 포함됩니다.

    \ &은 잠재적으로 자바 스크립트 특수 문자를 허용하기 때문에 약간 문제가 있습니다.

    SQL 삽입 때문에 매개 변수화 된 쿼리를 사용하지 않으면 문제가 발생합니다.

    -는 "-"를 허용 할 수 있으며 매개 변수화 된 쿼리를 사용하지 않는 경우 SQL 주입 가능성도 있습니다.

    또한, \ p를 {L}은 클라이언트 측 유효성 검사를 해제하지 않고는 ASP.NET 정규 표현식 검사기에서 사용할 수 있도록 클라이언트 측 작동하지 않습니다 :

    관련 문제