IT이야기

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

cyworld 2021. 10. 14. 21:15
반응형

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


우리는 높은 보안 응용 프로그램을 가지고 있으며 사용자가 다른 사용자에게 표시되는 URL을 입력할 수 있도록 하고 싶습니다.

이것은 XSS 해킹의 높은 위험을 초래합니다. 사용자는 잠재적으로 다른 사용자가 실행하게 되는 자바스크립트를 입력할 수 있습니다. 우리는 민감한 데이터를 보유하고 있기 때문에 이런 일이 절대 일어나지 않도록 하는 것이 중요합니다.

이를 처리하는 모범 사례는 무엇입니까? 보안 화이트리스트 또는 이스케이프 패턴만으로도 충분합니까?

리디렉션 처리에 대한 조언(예: 링크를 따라가기 전에 경고 페이지에 "이 링크는 사이트 외부로 이동합니다" 메시지)

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


설명:

기본적으로 사용자는 다음을 입력하기를 원합니다.

stackoverflow.com

그리고 다른 사용자에게 출력하도록 합니다.

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

내가 정말로 걱정하는 것은 그들이 XSS 해킹에서 이것을 사용한다는 것입니다. 즉, 다음을 입력합니다.

alert('해킹!');

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

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

내 예는 위험을 설명하기 위한 것입니다. 자바스크립트와 URL이 서로 다르다는 것을 잘 알고 있지만 후자를 입력하게 함으로써 전자를 실행할 수 있습니다.

이 트릭으로 얼마나 많은 사이트를 깨뜨릴 수 있는지 놀랄 것입니다. HTML은 훨씬 더 나쁩니다. 그들이 링크를 다루는 알고 있다면 그들은 또한 위생적으로 알고 <iframe>, <img>영리 CSS 참조?

저는 높은 보안 환경에서 일하고 있습니다. 단일 XSS 해킹으로 인해 매우 큰 손실을 입을 수 있습니다. 내가 생각할 수 있는 모든 것을 제외할 수 있는 Regex를 생성할 수 있어서(또는 지금까지 우수한 제안 중 하나를 사용할 수 있어서 기쁩니다. 하지만 그것으로 충분할까요?)


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단계를 거쳐야 합니다.

  • 주어진 문자열을 이스케이프 해제/재인코딩합니다(RSnake는 이스케이프 및 UTF 인코딩을 사용하는 http://ha.ckers.org/xss.html ).
  • 링크 정리: 정규식은 좋은 시작입니다. "(또는 출력에서 ​​속성을 닫는 데 사용하는 모든 것)이 포함된 경우 문자열을 자르거나 버리십시오. 링크를 참조로만 수행하는 경우 다른 정보에 대해서는 이 프로세스의 끝에서 프로토콜을 강제 실행할 수도 있습니다 - 첫 번째 콜론 앞의 부분이 'http' 또는 'https'가 아닌 경우 시작 부분에 'http://'를 추가합니다. 사용자가 브라우저에 입력할 때 불완전한 입력에서 링크를 입력하고 누군가가 몰래 들어가려고 시도한 모든 장난을 걸 수 있는 마지막 기회를 제공합니다.
  • 결과가 올바른 형식의 URL인지 확인합니다(protocol://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 하면 자바스크립트 호출이 허용 되고 도 http아니고 도 아닌 스키마를 걸러냅니다 https. OWASP ESAPI Sanitizer를 사용하는 것이 아마도 최선의 선택일 것입니다.

또 다른 예는 WordPress 의 코드입니다 .

또한 URL 링크 위치를 알 수 있는 방법이 없기 때문에(즉, 유효한 URL일 수 있지만 URL의 내용이 장난스러울 수 있음) Google에는 다음과 같이 호출할 수 있는 세이프 브라우징 API가 있습니다.

위생을 위해 자신의 정규식을 롤링하는 것은 다음과 같은 몇 가지 이유로 문제가 됩니다.

  • Jon Skeet가 아닌 한 코드에 오류가 있습니다.
  • 기존 API에는 많은 시간을 들여 검토하고 테스트해야 합니다.
  • Existing URL-validation APIs consider internationalization.
  • Existing APIs will be kept up-to-date with emerging standards.

Other issues to consider:

  • What schemes do you permit (are file:/// and telnet:// acceptable)?
  • What restrictions do you want to place on the content of the URL (are malware URLs acceptable)?

Just HTMLEncode the links when you output them. Make sure you don't allow javascript: links. (It's best to have a whitelist of protocols that are accepted, e.g., http, https, and mailto.)


You don't specify the language of your application, I will then presume ASP.NET, and for this you can use the Microsoft Anti-Cross Site Scripting Library

It is very easy to use, all you need is an include and that is it :)

While you're on the topic, why not given a read on Design Guidelines for Secure Web Applications

If any other language.... if there is a library for ASP.NET, has to be available as well for other kind of language (PHP, Python, ROR, etc)


How about not displaying them as a link? Just use the text.

Combined with a warning to proceed at your own risk may be enough.

addition - see also Should I sanitize HTML markup for a hosted CMS? for a discussion on sanitizing user input


In my project written in JavaScript I use this regex as white list:

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

the only limitation is that you need to put ./ in front for files in same directory but I think I can live with that.


For Pythonistas, try Scrapy's w3lib.

OWASP ESAPI pre-dates Python 2.7 and is archived on the now-defunct Google Code.


You could use a hex code to convert the entire URL and send it to your server. That way the client would not understand the content in the first glance. After reading the content, you could decode the content URL = ? and send it to the browser.


Allowing a URL and allowing JavaScript are 2 different things.

ReferenceURL : https://stackoverflow.com/questions/205923/best-way-to-handle-security-and-avoid-xss-with-user-entered-urls

반응형