쿼리 문자열 매개변수를 안전하게 읽는 가장 좋은 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/128028

  •  02-07-2019
  •  | 
  •  

문제

다양한 다른 프로젝트에서 사용할 수 있는 코드 조각을 생성하는 프로젝트가 있습니다.코드의 목적은 쿼리 문자열에서 두 개의 매개변수를 읽고 이를 iframe의 "src" 속성에 할당하는 것입니다.

예를 들어, URL의 페이지는 http://oursite/Page.aspx?a=1&b=2 "a" 및 "b" 매개변수를 읽으려면 JavaScript가 있어야 합니다.그런 다음 JavaScript는 해당 매개변수를 기반으로 iframe의 "src" 속성을 설정합니다.예: "<iframe src="http://someothersite/Page.aspx?a=1&b=2" />"

우리는 현재 Microsoft의 Anti Cross-Scripting 라이브러리를 사용하여 매개변수를 확인하는 서버측 코드를 사용하여 이 작업을 수행하고 있습니다.그러나 JavaScript를 사용해야 하며 타사 JavaScript 도구(예: jQuery 또는 Prototype)를 사용할 수 없다는 새로운 요구 사항이 나타났습니다.

내가 아는 한 가지 방법은 매개 변수를 사용하기 전에 "<", 작은 따옴표 및 큰 따옴표의 인스턴스를 바꾸는 것입니다. 그러나 그것은 나에게 충분히 안전하지 않은 것 같습니다.

매개변수 중 하나는 항상 "P"이고 그 뒤에 9개의 정수가 옵니다.다른 매개변수는 항상 15자의 영숫자 문자입니다.(이 점을 분명히 하라고 제안한 Liam에게 감사드립니다).

누구든지 우리에게 제안할 것이 있나요?

시간 내 주셔서 대단히 감사합니다.

도움이 되었습니까?

해결책

탈출과 에스케이프를 사용하지 말고 decodeuricomponent를 사용하십시오. 예를 들어

function queryParameters(query) {
  var keyValuePairs = query.split(/[&?]/g);
  var params = {};
  for (var i = 0, n = keyValuePairs.length; i < n; ++i) {
    var m = keyValuePairs[i].match(/^([^=]+)(?:=([\s\S]*))?/);
    if (m) {
      var key = decodeURIComponent(m[1]);
      (params[key] || (params[key] = [])).push(decodeURIComponent(m[2]));
    }
  }
  return params;
}

그리고 document.location.search를 통과하십시오.

<로 <로 전환하는 한, 스크립트를 실행하지 않고 컨텐츠를 HTML에 안전하게 주입 할 수 있는지 확인하는 데 충분하지 않습니다. 다음 <,>, & 및 "를 피하십시오.

매개 변수가 스푸핑되지 않았 음을 보장하지는 않습니다. 서버 중 하나가 URL을 생성한지 확인 해야하는 경우 URL 서명을 검색하십시오.

다른 팁

화이트리스트 접근 방식을 사용하는 것이 더 나을 것입니다. "나쁜"것들만 제거하지 마십시오. "안전하다"고 생각하는 것 외에는 무엇이든 제거하십시오.

또한 htmlencode를 매개 변수를 수행하도록 강력히 권장합니다. 이것을 할 수있는 많은 JavaScript 기능이 있어야합니다.

JavaScript의 Escape () 및 Unescape () 함수를 사용할 수 있습니다.

당신이해야 할 몇 가지 일 :

  • 유형, 형식, 범위 등에 따라 허용 된 값을 엄격히 화이트리스트에 올리십시오.
  • 화이트리스트가 매우 빡빡 할 수없는 경우 특정 문자 (일반적으로 우회 가능하지만) 명시 적으로 블랙리스트하십시오.
  • anti-xss를 사용하는 경우 출력 전에 값을 인코딩하십시오. 간단한 htmlencode가 충분하지 않다는 것을 이미 알고 있습니다.
  • SRC 속성을 DOM을 통해 설정하십시오 ~ 아니다 HTML 단편을 생성하여
  • 동적 값을 사용하십시오 임의의 사이트가 아닌 쿼리 스트링 매개 변수로서; 즉, 하드 코드 서버 이름, 대상 페이지 등
  • 귀하의 사이트는 SSL 위에 있습니까? 그렇다면 프레임을 사용하면 SSL UI와 불일치가 발생할 수 있습니다 ...
  • 일반적으로 명명 된 프레임을 사용하면 프레임 스푸핑을 허용 할 수 있습니다. 보안 사이트에서 이것은 관련 공격 벡터 일 수 있습니다 (피싱 등과 함께 사용).

정규식을 사용하여 P 뒤에 9개의 정수가 있고 15개의 영숫자 값이 있는지 확인할 수 있습니다.내 RegEx 책상에 있는 책에 도움이 될 만한 JavaScript 예제가 몇 가지 들어 있는 것 같습니다.

문자 세트를 ASCII 값으로만 ​​제한하면 도움이 될 것이며 위의 모든 조언을 따르십시오(화이트리스트, DOM을 통해 src 설정 등).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top