2014-11-18 1 views
3

모든 오픈 리디렉션 취약점을 해결하기 위해 코드를 위생적으로 처리하려고합니다. 모든 내 C# 코드에 대해 Response.Redirect에 제공된 URL이 응용 프로그램과 동일한 도메인에 있는지 확인하기 위해 수정 사항을 적용했습니다. 그렇지 않으면 예외를 throw합니다.javascript/jquery에서 열린 리디렉션의 취약점

내 질문은 내 .js 코드의 열린 리디렉션 인스턴스에 관한 것입니다. 취약한 것으로 표시된 코드는 다음과 같습니다.

window.open('Help/Admin/webhelp/' + helpFile, '_blank', 'toolbar=no, menubar=no, status=yes, scrollbars=yes, resizable=yes'); 

httpReqObject.open("GET", 'GetHelpLink.ashx?modid=' + _AdminHelpContext, true); 

window.open('viewcontents.aspx?did=' + grid.rows[i].cells[gridCell.docID].innerText, "toobar=0,menubar=0,resizable=1") 

내 자바 스크립트 코드에서이 오픈 리디렉션 취약점을 해결하는 가장 좋은 방법은 무엇입니까?

감사합니다.

+0

리디렉션은 어디에 있습니까? 나는 클라이언트가 GET 요청을내는 것을보고 있습니다 ... – plalx

+0

plalx, ​​HP Fortify 코드 스캔을 실행하여 코드 기반의 모든 취약점을 검사했으며 앞서 언급 한 코드는 "오픈 리디렉션"취약점으로 표시되었습니다. 나는 부분적으로 "window.open"에 제공된 경로의 일부가 동적으로 빌드되기 때문에 동적 부분에 일부 악의적 인 삽입을 몰래 끌어 와서 열려고하는 페이지와 다른 페이지를 열 가능성이 있기 때문에 생각합니다. 원하는 기능. – Vinay

+0

내가 알 수있는 한, 클라이언트가 다른 URL을 요청하는 것을 막을 방법이 없습니다. 그러나 서버 측 코드는 유효하지 않은 요청이 처리되지 않도록해야합니다. – plalx

답변

3

다음은이 문제를 해결하기 위해 내가 생각해 낸 것입니다. 나는 이것이 가장 우아한 해결책 중 하나가 아닌 동의하고 일부 개선을해야 할 수도 있지만, 사용자가 응용 프로그램 도메인에서 인 URL로 이동하는 것을 허용하지 내 기본적인 요구 사항을 만족 않습니다

function LaunchHelp(surl) { 
     try {    
      if (validateURL(surl)) 
       window.open(surl, '_blank', 'toolbar=no,menubar=no,status=yes'); 
      else { 
       throw new InvalidURLException(); 
      } 
     } catch (e) { 
      if (e instanceof InvalidURLException) 
       alert(e.message); 
     } 
    } 

    function InvalidURLException() {    
     this.message = "An attempt was made to open a webpage of foreign domain. No allowed."; 
     this.toString = function() { 
      return this.message 
     }; 
    } 

    function validateURL(surl) { 
     var url = parseURL(surl); 
     var urlHostname = url.hostname.trim(); 

     if (urlHostname == '') { 
      return true; 
     } 
     else { 
      if (urlHostname.toUpperCase() == location.hostname.trim().toUpperCase()) { 
       return true; 
      } 
      else 
       return false; 
     }    
    } 

    function parseURL(url) { 
     var a = document.createElement('a'); 
     a.href = url; 
     return { 
      source: url, 
      protocol: a.protocol.replace(':', ''), 
      hostname: a.hostname, 
      host: a.host, 
      port: a.port, 
      query: a.search, 
      params: (function() { 
       var ret = {}, 
        seg = a.search.replace(/^\?/, '').split('&'), 
        len = seg.length, i = 0, s; 
       for (; i < len; i++) { 
        if (!seg[i]) { continue; } 
        s = seg[i].split('='); 
        ret[s[0]] = s[1]; 
       } 
       return ret; 
      })(), 
      file: (a.pathname.match(/\/([^\/?#]+)$/i) || [, ''])[1], 
      hash: a.hash.replace('#', ''), 
      path: a.pathname.replace(/^([^\/])/, '/$1'), 
      relative: (a.href.match(/tps?:\/\/[^\/]+(.+)/) || [, ''])[1], 
      segments: a.pathname.replace(/^\//, '').split('/') 
     }; 
    } 

I가 있었다를 LaunchHelp 메소드에 상대 경로 ('Help/Admin/webhelp /')가 제공되는 시나리오에서 호스트 이름이 빈 문자열인지 확인하십시오. 이 경우 parseURL은 빈 호스트 이름을 반환합니다. here에서 "parseURL"메소드를 훔쳤습니다.

모든 제안/의견/질문을 환영합니다.