2016-10-12 1 views
0

웹 응용 프로그램에 문자를 허용하고 데이터베이스에 저장할 필요가있는 필드가 일부 있습니다. 나중에 검색되어 JQuery 바인딩, MVVM 프레임 워크 등 몇 가지 방법으로 표시됩니다.잠재적으로 위험한 문자 수용 및 저장된 XSS 방지

이 데이터를 수락하고 처리하는 올바른 방법은 무엇입니까? 데이터를 저장하기 전에 서버 측에서 인코딩하거나 원래 형식으로 저장합니까? 각 렌더링 방법을 분석하여 안전하게 데이터를 처리하는 방법을 확인합니까?

답변

1

TL : DR : 후자입니다. XSS는 출력 인코딩 문제입니다.

데이터베이스에 사용자 입력을 저장할 수 있으며 그 자체는 취약하지 않습니다. 가능한 경우 입력 검증을 수행해야하지만 때로 정상 작동에서 예상하는 데이터의 특성 때문에 일부 입력을 실제로 검증 할 수는 없습니다. 이것은 큰 문제는 아니며 일반적으로 XSS는 입력 검증을 통해 중단 될 수 없습니다.

데이터베이스에 인코딩 된 값을 저장하는 것에 대한 한 가지 주장은 우려 사항을 분리한다는 것입니다. 여러 가지 인코딩 (HTML, Javascript, URL, XML 등)이 있으며 데이터를받는 구성 요소는 나중에 렌더링하는 것과 관련이 없을 수 있습니다. 데이터에 대한 다른 인수는이 데이터와 관련이 있습니다. 데이터를 저장할 때 렌더링 방법을 알고 싶지 않으므로 올바른 인코딩을 선택할 수 없습니다. 또한 인코딩 된 데이터를 사용하면 검색이나 순서 지정이 훨씬 어려워집니다. 따라서받은대로 보관해야합니다.

XSS를 방지하려면 일종의 출력에 이러한 데이터를 쓸 때 컨텍스트 (일반 html, javascript, json, xml 등)에 따라 신중하게 출력 인코딩을 구현해야합니다. 예를 들어 HTML 페이지에서와 같이 스크립트 블록이 자바 스크립트 컨텍스트를 만드는 것이 아니라 이벤트 속성 (onclick, onmouseover 등)도 마찬가지입니다. <에 대한 href도 마찬가지입니다. 변수가 href 값의 첫 번째 문자이면 (javascript:alert(1) 참조).

그러나 결론은 항상 올바른 인코딩 방법을 찾아서 출력에 쓰는 동시에 모든 변수를 인코딩해야한다는 것입니다.

MVVM은 다소 특별한 경우입니다. 대부분의 클라이언트 측 템플릿에는 인코딩 된 변수 또는 원시 변수를 작성하는 메소드가 있으며 클라이언트 측 데이터 바인딩은 일반적으로 변수를 구문 분석 된 html 노드 또는 텍스트로 바인딩하는 기능을 제공합니다. 분명히, 당신은 텍스트를 선택해야합니다, HTML은 사용자 입력이 관련되어있을 때 XSS에 취약 할 수 있습니다. 이것은 실제적으로 html: 대신 Knockout에서 text: 바인딩을 사용하거나 .html() 대신 jQuery의 .text() 메소드를 사용하는 것과 같은 것을 의미합니다.

이러한 경우 데이터는 일반적으로 AJAX 요청에 JSON 형식으로 다운로드됩니다. JSON은 여전히 ​​인코딩 할 필요가 없는데, 여전히 사용 장소를 반드시 알 필요가 없기 때문에 여전히 필요할 수 있습니다. 클라이언트에서 검색/정렬 (취약성이 없으므로 text/html이 아닌 application/json 콘텐츠 유형으로 보내야 함). 하지만 이는 단지 데이터 일 뿐이며 JSON은 단순한 데이터 형식입니다. 물론 JSON으로 인코딩해야하지만 표준 객체 직렬자는이를 수행합니다. SPA를 초기화하기 위해 페이지에 JSON을 생성하려면 JSON 객체에 HTML 인코딩 값이 필요합니다.이 데이터를 AJAX로 가져 오는 것이 더 쉽고 쉽습니다.

관련 문제