답변:
댓글 권한이 없거나 이전 답변에 대한 의견으로 남겨 두었을 것입니다.
반복하지 말고 HTML을 사용하여 아포스트로피를 피하십시오.
'
유효한 HTML 문자 엔터티 참조가 아닙니다. XML 문자 엔터티 참조입니다. Firefox와 Chrome은 적어도 HTML 문서에서 위의 아포스트로피로 렌더링하지만 Internet Explorer는 그렇지 않습니다. 그리고 그것을 거부 할 때 표준을 따르고 있습니다.
다음을 사용하여 HTML에서 아포스트로피를 이스케이프 처리 할 수 있습니다
'
그러나 나는 그것이 일반적으로 필요하다고 생각하지 않습니다.
http://fishbowl.pastiche.org/2003/07/01/the_curse_of_apos/
http://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references
네이트에 동의하지 않습니다. 가능한 적은 이스케이프를 사용하는 것이 이상적이며 UTF-8을 사용하여 문자를 기본적으로 표현해야합니다. 이를 위해서는 UTF-8과 올바른 문자 세트 선언을 처리 할 수있는 편집기가 필요합니다.
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
그러나 (X) HTML에서 특별한 의미를 가진 문자를 피하는 습관을들이십시오.
< <
> >
" "
& &
' '
이렇게하면 이러한 문자를 쓰려고 할 때 실수로 마크 업을 작성하지 않습니다. 이것은 보안을 유지하기 위해 사용자 입력에 특히 중요합니다. 덜 분명하지만 실제로 탈출하는 것이 중요합니다 "
. 문자열이 HTML 속성 title="something"
등 으로 끝나는 경우 사용자는 속성을 종료하고 고유 한 마크 업을 삽입 할 수 있습니다. 사용자가 들어 와서 " onclick="alert('hello');
이를 삽입 하면 어떻게 될지 상상해보십시오.title="..."
PHP를 사용하는 경우 htmlspecialchars
함수를 사용하여 이를 수행 할 수 있습니다 . 다른 언어는 다른 유사한 기능을 가질 수 있습니다.
업데이트 : 아 포스 문제가 수정되었습니다. 성가신 IE.
'
하지 마십시오 '
. 어떤 이유로 든 HTML 속성에 title='something'
작은 따옴표를 사용하면 속성 값 안에 작은 따옴표를 이스케이프해야합니다.
사용 사례에 따라 다르지만 '
일반적으로 자연 언어로 사용 하지 않는 것이 좋으므로 XML에 컴퓨터 코드가 없으면 문제가 발생하지 않아야합니다.
문자열을 번역 한 경우 일부 번역가가 닫는 따옴표를 유니 코드 중괄호로 대체하지만 직선 따옴표는 여는 따옴표로 남겨두고 시각적으로 균형이 맞지 않고 비전문적 인 것처럼 보입니다.
유니 코드 문자 ‘
및 ’
교체해야합니다 '
가능한 한 많이, “
그리고 ”
교체해야합니다 "
. 컴퓨터에서 중괄호가 특수한 것으로 인식되지 않기 때문에 유용합니다. (Stack Overflow / Chrome은 ' don’t
'를 철자 오류로 간주하지만 ' '에 만족 한다는 것을 알지만 즐겁게 생각 don't
합니다.)
키보드에 매우 유혹 '
적이고 "
문자 가있는 것은 도움이되지 않습니다 .
StackExchange 자체가 HTML 엔터티를 사용하여 아포스트로피를 인코딩하는지 확인하십시오.
다음은이 페이지의 소스 코드에 대한 몇 가지 예입니다.
(1) 질문 제목 : 인코딩되었습니다.
Should I escape the Apostrophe ( ' ) character with its HTML entity (&#39;)?
(2) 드로우의 답변 : 인코딩되지 않았습니다.
But I don't believe it is, in general, necessary.
(3) nitro2k01의 답변에 대한 Tom의 의견 : 인코딩 됨.
I've got two contradicting answers now. One recommends escaping ' and the other does not. What should I believe?
따라서 두 가지 방식으로 진행됩니다.
그러나이 페이지의 소스 코드는을 사용하지 않습니다 '
. 모든 인코딩 형식 '
입니다. 이것은 nitro2k01과 일치하며을 사용하지 말라고 권고했습니다 '
.
답은 상황에 따라 다릅니다.
이 데이터를 사용하여 HTML로 단락을 작성하는 경우 <,> 및 &를 이스케이프하면 충분할 수 있습니다.
<p>{string}</p>
그래도 HTML 속성에 쓰고 있다면
<a href='/some/path/{string}'>...</a>
그런 다음 아포스트로피를 피하십시오. 공격자가 이것을 위해 string
다음을 입력하면 공격 경로가 될 수 있습니다 .
string = "' onmouseover='alert(\"nasty script here!\")' data-ignore='"
큰 따옴표도 마찬가지입니다. 나는 심지어 backtick`가 HTML 속성에도 사용될 수 있기 때문에 취약하다는 것을 읽었습니다. 배포 루틴의 일부로 자동 HTML 구문 검사 스크립트가없는 경우이 세 가지 중 하나를 사용할 수 있으며 HTML 특성에 대해 이스케이프해야한다고 가정하십시오.
극단적으로 인용되지 않은 속성조차도 유효하므로 공백 문자도 이스케이프해야합니다. 그리고 !
, @
, $
, %
, (
, )
, =
, +
, {
, }
, [
, 그리고 ]
, 모두는 속성의 탈출과 새로운 하나를 삽입 할 수 있습니다.
JavaScript에서 이스케이프 처리하기 위해 JQuery를 사용 $(element).text(string)
하거나 $(element).attr(attrname, string)
이스케이프 처리를 수행합니다. $(element).html(unsafe)
HTML을 이스케이프하지 않는에 주의하십시오 !
서버 측 코드에서는 각 경우에 대한 위험을 신중하게 평가하고 설명서를주의해서 읽어야합니다. 이것은 Rails, Django, raw PHP, Drupal 등과 같이 사용중인 특정 언어와 라이브러리에 따라 다릅니다.
데이터베이스에 들어가기 전에 가능한 빨리 문제점을 중지하는 것을 고려중인 경우, 말을 보유하십시오. DB에 저장된 텍스트를 HTML로 이스케이프하면 지옥에 빠질 수 있습니다. 나중에 이탤릭체, 굵은 체, 색상 및 표와 같은 다른 HTML 태그는 허용하지 않으려면 어떻게해야합니까? 당신이 첫 번째 패스에서 뭔가를 놓친하지만 탈옥수가 이미 탈출 한 경우 &
로 &
와 "
같은 "
? 그것으로 그집니다 &amp;
와 &quot;
?
내 접근 방식은 데이터베이스에 대해서만 SQL 이스케이프를 수행하지만 나중에 처리하기 위해 모든 HTML 특수 문자를 남겨 두는 것입니다. 이렇게하면 HTML 이스케이프를 쉽게 디버깅하고 미세 조정할 수 있습니다. 또한 사용자가 제공 한 문자열이있는 경우 고유 한 SQL 테이블을 신뢰할 수 없습니다.
사용자 제어 입력을 절대 신뢰하지 말고 항상 HTML 속성을 인용하십시오!
기반 : Ryan Grove의 &, <,> 및 "보다 HTML 이스케이프 처리가 더 많습니다.
실제 엔티티를 사용하지 않고 작업을 수행하는 가장 쉬운 방법은 PHP htmlentities()
또는 htmlspecialchars()
함수 를 사용하는 것입니다.
$val = htmlspecialchars("Don't", ENT_QUOTES, 'UTF-8');
if($_POST){
$val = htmlspecialchars(trim($_POST['val']), ENT_QUOTES, 'UTF-8');
}
echo "<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Strict//EN' 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'>
<html xmlns='http://www.w3.org/1999/xhtml' xml:lang='en' lang='en' class='njs'>
<head>
<meta http-equiv='Content-type' content='text/html;charset=utf-8' />
<title>Special Characters</title>
<style type='text/css'>
@import 'special.css';
</style>
</head>
<body>
<form method='post' action='' id='fm' name='fm'>
<input type='text' value='$val' name='val' id='val' />
<input type='submit' value='submit' name='sub' id='sub' />
</form>
</body>
<script type='text/javascript' src='special.js'></script>
</html>";
&apos
이제 HTML5에 유효합니다. 레거시 브라우저를 지원하거나 Outlook 용 HTML 이메일을 작성 해야하는'
경우 문자를 이스케이프해야한다고 생각하는 것이 가장 좋습니다 .