2012-11-20 5 views
8

나는 XSS에 대해 읽고 그것을 피하는 법을 배웠습니다. 필자가 읽은 것부터, 웹 애플리케이션을 다소 XSS 안전하게 만들기 위해 입력 필터링, 애플리케이션 코드의 적절한 처리 및 출력 인코딩이 필요하다는 것을 알게되었습니다. 여러 기사를 읽은 후에도 몇 가지 의구심이 지속됩니다.XSS에 관한 몇 가지 설명

  • 나는 jQuery.text, 또는 element.text = untrusted_data ("untrusted_data")를 시도했을 때 브라우저가 완벽하게 컨텐츠를 인코딩 할,하지만 난 다른 곳에서 해당 클라이언트 측을 읽고 보인다 인코딩을 신뢰할 수 없어야하며 서버 쪽에서 "항상"인코딩해야합니다. 클라이언트 측 인코딩이 안전하지 않은 것으로 간주되는 이유는 무엇입니까?

  • 나는 또는 element.value = untrusted_data 충분히 안전 할 것 같다 (untrusted_data) jQuery.val를 사용하여 값을 설정하려고 할 때마다. 정말 XSS가 안전합니까? 아니면 여기에 어떤 사례가 있습니까?

  • 또한, 나는 특성 이름은 URL 컨텍스트 기반의 속성을 포함하지 않는 경우에만의 setAttribute (ATTRNAME, untrusted_data) jQuery.setAttribute (untrusted_data ATTRNAME)은 일반적으로 안전한 것으로 간주된다 어딘가에 읽는 일이 (src, href 등) 또는 이벤트 핸들러 (onClick, onMouseOver 등). 그렇다면 어떻게 setAttribute ("href", untrusted_data)를 사용하여 href 속성을 설정해야합니까? 서버 측의 encodeForHtmlAttribute (untrusted_data)가 올바른 접근 방식입니까?
  • 어떻게 동적 HTML 생성을 처리해야합니까? 아래의 예를
    function copyData() 
    { 
        var divValue = jQuery("#divName1").html(); 
        jQuery("#divName2").html(divValue);/XSS Here 
    } 
    

    내가 여기 달성하고자하는 divName1에서 텍스트를 얻을 divName2의 내용에 붙여 넣는 것입니다 <div id="divName2"></div>

    <div id="divName1" onClick="copyData()">untrusted_data</div>

을 고려하십시오. 위에 쓴 코드는 XSS가 취약합니다. 나는.

jQuery를 ("# divName2") 텍스트 (divValue) 그래서

,이 인코딩을 보장을 변경할 수 있습니다,하지만 난 이해, 우리는 클라이언트 측 인코딩이 안전하지 않은 말 서버 측 인코딩 만 사용해야합니다. 클라이언트 측 인코딩을 사용하지 않고 XSS를 안전하게 작성하려면 어떻게해야합니까? 나는 조금 :(여기 혼란 스러워요. 이 의심을 취소 저를 도와주세요.이 질문을 많이 번입니다

+0

'element.text' 자체는 안전하지만 문자열 보간을 사용하여 클라이언트 코드에 데이터를 전달할 때 문제가 발생할 수 있습니다. –

답변

8

.

클라이언트 측 인코딩 안전하지 간주됩니다 왜

?

클라이언트 측 인코딩은 올바르게 일관되게 수행되는 한 괜찮습니다.클라이언트 측 인코딩은 UTF-7 공격과 같은 문자 인코딩 레벨 공격에 대해 걱정할 필요가 없으므로 종종 막대가 낮습니다.

jQuery.val (untrusted_data) 또는 element.value = untrusted_data를 사용하여 값을 설정하려고 할 때마다 충분히 안전하다고 보입니다. 정말 XSS가 안전합니까? 아니면 여기에 어떤 사례가 있습니까?

문자열이고 값이 설정되는 요소는 흐름 또는 블록 요소의 일반 텍스트 노드입니다. 그러면 괜찮습니다. 값이 할당되는 노드가 <script> 요소의 텍스트 노드이거나 URL, 이벤트 핸들러 또는 스타일 속성 노드 또는 <object>과 관련된 것이면 문제가 발생할 수 있습니다.

또한, 나는 속성 이름은 URL 컨텍스트 기반의 특성 (SRC, href가 포함되지 않는 경우에만 jQuery.setAttribute (ATTRNAME, untrusted_data)과의 setAttribute (untrusted_data ATTRNAME)은 일반적으로 안전한 것으로 간주되는 곳 읽을 일이 등) 또는 이벤트 처리기 (onClick, onMouseOver 등). 이 경우,

부분적으로 정확합니다. 다른 속성은 style과 같은 날카로운 모서리와 <object><embed><meta>과 관련된 많은 것들을 포함합니다.

속성에 대해 잘 모르는 경우 신뢰할 수없는 데이터에 노출시키지 마십시오. 일반적으로 안전한 내용은 title과 같은 텍스트 콘텐츠를 포함하거나 숫자가 dir=ltrdir=rtl 인 열거 형 속성입니다.

더 복잡한 값을 사용하는 속성을 다루는 경우 공격자가 style 속성의 -moz-binding과 같이 애매한 브라우저 확장을 악용 할 위험이 있습니다.

은 충분히

지뢰는 당신이 그들에 단계까지 안전 할 것 같다 안전한 것으로 보인다.

"안전 해 보이는 것"으로 인해 많은 결론을 내릴 수 없습니다. 당신은 실제로 그것을보고 잠재적으로 잘못 될 수있는 것을 이해하고, 상황이 완전히 잘못되었을 때만 위험에 처할 수 있도록 상황을 조정해야합니다 (P (재해) = P (실패 0) * P (실패 1 P (failure0) + P (failure1) * P (! failure0) + ...)가 잘못되었을 때 위험에 처하지 않음을 의미합니다.

어떻게 setAttribute ("href", untrusted_data)를 사용하여 href 속성을 설정해야합니까?

프로토콜을 허용 목록에 추가하지 마십시오.

if (!/^https?:\/\//i.test(untrusted_data) && !/^mailto:/i.test(untrusted_data)) { 
    throw new Error('unsafe'); 
} 

접근 방식의 서버 측에서 (untrusted_data) encodeForHtmlAttribute 올바른 방법이 있나요?

아니요. setAttribute에 전달 된 값을 인코딩하는 HTML은 중복되어 보안 속성을 유지하는 데 도움이되지 않습니다. <iframe srcdoc>은 최근 사양 변경 사항에 대한 내 기억이 정확하다면 내용이 HTML이기 때문에 드문 예외 일 수 있습니다.

내가 여기서 달성하고자하는 것은 divName1에서 텍스트를 가져 와서 divName2의 콘텐츠에 붙여 넣는 것입니다. 위에 쓴 코드는 XSS가 취약합니다.

HTML을 사용하지 마십시오. 브라우저의 .innerHTML 게터는 버그가 있으며 때로는 IE에서 값 구분 기호로 사용되는 백틱과 같이 악용 될 수 있습니다. 한 노드에서 다른 노드로 노드를 복제하면됩니다. 아래처럼 뭔가를 수행해야합니다

var div1 = $('#divName1'); 
for (var child = div1[0].firstChild(); child; child = child.nextSibling) { 
    $('#divName2').append([child.cloneNode(true)]); 
} 

나는 당신이 원하는 모든 텍스트 내용 인 경우 괜찮

jQuery("#divName2").text(divValue) 

로 변경할 수 있습니다.

+1

괜찮은 대답. 저자에게 언급했듯이 속성을 조금만 추가하면 속성도 소독되어야합니다. 비교적 쉽게 서버 측 또는 클라이언트 측에서이 작업을 수행 할 수 있습니다.이 작업의 주된 어려움은 다양한 공격을 수행 할 수 있다는 것입니다. 필터링 스크립트 웹에는 몇 가지 좋은 예가 있습니다. –

+2

'지뢰는 당신이 계단을 밟을 때까지 안전합니다. '제안 된 솔루션이'충분히 안전 해 보였던 '어떤 종류의 IT 보안 문제로도 필자가 만난 최고의 요약입니다. – ppeterka

+0

@Mike Thanks for lot for 상세한 답변 :) –

관련 문제