2016-08-22 4 views
0

저장된 XSS을 예방하는 가장 좋은 방법은 무엇입니까? XSS 예방 : 클라이언트 또는 서버 측?

  • 모든 텍스트 필드 (심지어 일반 텍스트)는 OWASP Java HTML Sanitizer Project 같은 것을 사용하여 XSS의 HTML을 방지하기 위해 서버 측을 소독해야 하는가?
  • 클라이언트XSS prevention rules을 적용하여 XSS 버그로부터 스스로를 보호해야합니까?

첫 번째 해결 방법의 문제점은 데이터가 수정 될 수 있다는 것입니다 (문자 인코딩, 부분 삭제 또는 전체 삭제 ...). 응용 프로그램의 동작을 변경시킬 수 있습니다. 특히 디스플레이 관련 문제가 발생할 수 있습니다.

+0

보안은 레이어에 가장 적합하므로 둘 중 어느 것이 가장 좋습니다. BTW, 이것은 프로그래밍 기반보다 보안에 더 중점을 두었습니다. https://security.stackexchange.com이 더 좋은 장소 일 수 있습니다. –

답변

3

당신은 sanitisation을 적용하는 경우와 데이터가 특정 형식/표준을 준수해야하고 안전하게 할 수있는 경우에만 폐기 데이터; 예 : 전화 또는 신용 카드 번호에서 숫자가 아닌 모든 문자를 제거합니다. 항상은 적절한 컨텍스트에 대해 이스케이프 처리를 적용합니다 (예 : 사용자 입력 데이터를 HTML에 넣을 때 HTML로 인코딩합니다.

대부분의 경우 당신은 명시 적으로 자유형 데이터 입력을 허용하고 특정 문자를 허용하지 않으려 고하기 때문에 위생적으로하고 싶지 않습니다. 여기서 보게되는 몇 가지 예외 중 하나는 사용자가 HTML 입력을 수락하는 경우 원치 않는 태그와 속성을 필터링하고 구문이 유효한지 확인하기 위해 HTML을 삭제하려는 것입니다. 그러나 데이터베이스에 원시되지 않은 버전을 저장하고 출력시에만이 sanitisation을 적용하는 것이 좋습니다.

+0

대부분의 시간은 위생 처리를 원할 때 "자유 형식 데이터 입력을 허용하려는 경우를 제외하고는 항상 위생 처리를 적용해야합니다." – Andy

0

보안의 황금 표준은 다음과 같습니다. 인 코드를 입력하고 출력을 유효화합니다.

먼저 입력 서버 측의 유효성을 검사하십시오. 좋은 예는 사용자 프로필의 전화 번호 필드입니다. 전화 번호는 숫자, 대시 및 아마도 +로만 구성되어야합니다. 그렇다면 사용자가 문자, 특수 문자 등을 제출하도록 허용하는 이유는 무엇입니까? 공격면이 증가합니다. 따라서 해당 필드를 최대한 정확하게 검증하고 잘못된 입력을 거부하십시오.

둘째, 해당 출력 컨텍스트에 따라 출력을 인코딩하십시오. 이 단계 서버 측을 수행하는 것이 좋지만 좋은, 잘 테스트 된 프론트 엔드 프레임 워크를 사용하는 한 클라이언트 측을 수행하는 것이 상대적으로 안전합니다. 위생 처리의 가장 큰 문제점은 서로 다른 맥락에서 안전성에 대한 요구 사항이 다르다는 것입니다. 사용자 데이터를 HTML 속성, 페이지 또는 스크립트 태그에 직접 주입 할 때 XSS를 방지하려면 다른 작업을 수행해야합니다. 따라서 출력 컨텍스트를 기반으로 특정 출력 인코더를 만듭니다. HTML 컨텍스트에 대한 엔티티 인코딩, 스크립트 컨텍스트에 대한 JSON.stringify 등

관련 문제