사용자가 입력 한 URL을 사용하여 보안을 처리하고 XSS를 피하는 가장 좋은 방법

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

문제

보안 응용 프로그램이 높고 사용자가 다른 사용자가 볼 수있는 URL을 입력 할 수 있도록합니다.

XSS 해킹의 위험이 높습니다. 사용자는 잠재적으로 다른 사용자가 실행할 수있는 JavaScript를 입력 할 수 있습니다. 우리는 민감한 데이터를 보유하기 때문에 결코 일어나지 않는 것이 필수적입니다.

이것을 다루는 데있어 모범 사례는 무엇입니까? 보안 화이트리스트 또는 탈출 패턴만으로도 충분합니까?

리디렉션 처리에 대한 모든 조언 ( "이 링크는 링크를 따르기 전에 경고 페이지의 사이트 외부"메시지입니다.

사용자가 입력 한 링크를 전혀 지원하지 않는다는 주장이 있습니까?


설명:

기본적으로 사용자는 입력하려고합니다.

stackoverflow.com

다른 사용자에게 출력하십시오.

<a href="http://stackoverflow.com">stackoverflow.com</a>

내가 정말로 걱정하는 것은 XSS 해킹에서 이것을 사용하는 것입니다. 즉 입력 :

경고 ( 'Hacked!');

따라서 다른 사용자는이 링크를 얻습니다.

<a href="alert('hacked!');">stackoverflow.com</a>

내 예는 위험을 설명하는 것입니다. JavaScript와 URL이 다른 것이라는 것을 잘 알고 있지만 후자를 입력하게함으로써 전자를 실행할 수 있습니다.

이 트릭으로 얼마나 많은 사이트를 깨뜨릴 수 있는지 놀랄 것입니다. HTML은 더욱 악화됩니다. 그들이 링크를 다루는 것을 알고 있다면 그들은 또한 소독하는 것을 알고 있습니다. <iframe>, <img> 영리한 CSS 참조?

저는 높은 보안 환경에서 일하고 있습니다. 단일 XSS 해킹으로 인해 우리에게 큰 손실이 발생할 수 있습니다. 나는 내가 생각할 수있는 모든 것을 배제 할 수있는 정규식 (또는 지금까지 훌륭한 제안 중 하나를 사용할 수있는)을 만들어 낼 수있어서 기쁘다.

도움이 되었습니까?

해결책

URL이 코드를 포함 할 수 없다고 생각되면 다시 생각하십시오!

https://www.owasp.org/index.php/xss_filter_evasion_cheat_sheet

그것을 읽고 울었습니다.

스택 오버플로에서 수행하는 방법은 다음과 같습니다.

/// <summary>
/// returns "safe" URL, stripping anything outside normal charsets for URL
/// </summary>
public static string SanitizeUrl(string url)
{
    return Regex.Replace(url, @"[^-A-Za-z0-9+&@#/%?=~_|!:,.;\(\)]", "");
}

다른 팁

"안전한"링크를 렌더링하는 과정은 3-4 단계를 거쳐야합니다.

  • 주어진 문자열을 ESCAPE/Reencode (Rsnake는 여러 가지 트릭을 기록했습니다. http://ha.ckers.org/xss.html 이는 탈출 및 UTF 인코딩을 사용합니다).
  • 링크 청소 : regexes는 좋은 시작입니다 - 문자열을 자르거나 "(또는 출력의 속성을 닫는 데 사용하는 모든 것을 포함하는 경우, 문자열을 자르거나 버리십시오. 참조로만 링크를 수행하는 경우 참조 다른 정보를 위해서는이 프로세스의 끝에서 프로토콜을 강제 할 수 있습니다. 첫 번째 결장 전 부분이 'http'또는 'https'가 아닌 경우 'http : //'를 시작하십시오.이를 통해 사용할 수 있습니다. 사용자로서 불완전한 입력의 링크는 브라우저에 입력하고 누군가가 몰래 들어 가려는 장난을 넘어서는 마지막 샷을 제공합니다.
  • 결과가 잘 형성된 URL (프로토콜 : //host.domain [: port] [/path] [/[file]] [? Queryfield = QueryValue] [#anchor]인지 확인하십시오.
  • 사이트 블랙리스트에 대한 결과를 확인하거나 일종의 맬웨어 검사기를 통해 가져 오려고 시도하십시오.

보안이 우선 순위라면 사용자 가이 과정에서 약간의 편집증을 용서할 수 있기를 바랍니다.

OWASP-ESAPI API와 같은 라이브러리를 사용하십시오.

다음을 읽으십시오.

예를 들어:

$url = "http://stackoverflow.com"; // e.g., $_GET["user-homepage"];
$esapi = new ESAPI( "/etc/php5/esapi/ESAPI.xml" ); // Modified copy of ESAPI.xml
$sanitizer = ESAPI::getSanitizer();
$sanitized_url = $sanitizer->getSanitizedURL( "user-homepage", $url );

또 다른 예는 내장 기능을 사용하는 것입니다. PHP filter_var 함수는 예입니다.

$url = "http://stackoverflow.com"; // e.g., $_GET["user-homepage"];
$sanitized_url = filter_var($url, FILTER_SANITIZE_URL);

사용 filter_var 허용 JavaScript 호출 및도 마련된 체계를 걸러냅니다. http ...도 아니다 https. 사용 OWASP ESAPI 소독제 아마도 최선의 선택 일 것입니다.

또 다른 예는 코드입니다 WordPress:

또한 URL 링크가 어디에 있는지 알 수있는 방법이 없기 때문에 (예 : 유효한 URL 일 수 있지만 URL의 내용은 잘못 될 수 있음) Google은 안전한 탐색 API 호출 할 수 있습니다.

위생을 위해 자신의 정수를 굴리는 것은 몇 가지 이유로 문제가됩니다.

  • Jon Skeet이 아니라면 코드에는 오류가 발생합니다.
  • 기존 API에는 많은 시간의 검토 및 테스트가 있습니다.
  • 기존 URL 검증 API는 국제화를 고려합니다.
  • 기존 API는 신흥 표준으로 최신 상태로 유지됩니다.

고려해야 할 기타 문제 :

  • 당신은 어떤 제도를 허용합니까 ( file:/// 그리고 telnet:// 허용)?
  • URL의 컨텐츠에 어떤 제한을두고 싶습니까 (맬웨어 URL은 허용됩니까)?

링크를 출력 할 때 링크를 htmlencode합니다. 허용하지 않도록하십시오 javascript: 연결. (예를 들어, http, https 및 mailto와 같이 허용되는 프로토콜 화이트리스트를 갖는 것이 가장 좋습니다.)

응용 프로그램의 언어를 지정하지 않으면 ASP.NET을 추정하며이를 위해 사용할 수 있습니다. Microsoft Anti-Cross 사이트 스크립팅 라이브러리

사용하기가 매우 쉽습니다. 필요한 것은 포함됩니다.

당신이 주제에있는 동안, 왜 읽지 않습니까? 안전한 웹 애플리케이션을위한 설계 지침

다른 언어가있는 경우 .... ASP.NET 용 라이브러리가있는 경우 다른 종류의 언어 (PHP, Python, ROR 등)에도 사용할 수 있어야합니다.

링크로 표시하지 않는 것은 어떻습니까? 텍스트 만 사용하십시오.

자신의 위험에 따라 진행하는 경고와 결합하면 충분할 수 있습니다.

덧셈 - 또한보십시오 호스팅 된 CMS의 HTML 마크 업을 소독해야합니까? 소독 사용자 입력에 대한 토론

JavaScript로 작성된 내 프로젝트에서 나는이 regex를 White List로 사용합니다.

 url.match(/^((https?|ftp):\/\/|\.{0,2}\/)/)

유일한 제한 사항은 같은 디렉토리의 파일을 앞에 놓아야한다는 것입니다. 그러나 나는 그것과 함께 살 수 있다고 생각합니다.

Pythonistas의 경우, 스크로프를 사용해보십시오 w3lib.

OWASP ESAPI 프리 데이트 Python 2.7 그리고 아카이브에 보관됩니다 이제 정의 된 Google 코드.

16 진 코드를 사용하여 전체 URL을 변환하고 서버로 보낼 수 있습니다. 그렇게하면 고객은 첫눈에 내용을 이해하지 못할 것입니다. 내용을 읽은 후에는 내용 URL =를 해독 할 수 있습니까? 브라우저로 보내십시오.

URL을 허용하고 JavaScript를 허용하는 것은 두 가지 다른 것입니다.

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