HTMLエンティティ(')でアポストロフィ( ')文字をエスケープする必要がありますか?


38

HTMLエンティティでエスケープする必要がある文字。たとえば、&はでエスケープされ&ます。

'でエスケープする必要があり'ますか?

回答:


41

コメント権限がない、または以前の回答のコメントとしてこれを残していました。

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


これが投稿されたときはこれが正しかったと思います&aposが、ウィキペディアの記事を見ると、HTML5が有効になっています。古いブラウザーをサポートする必要がある場合や、Outlook用のHTMLメールを作成'する必要がある場合は、キャラクターをエスケープする必要があると判断した場合に固執することをお勧めします。
トムヒューズ

24

私はネイトに同意しません。できるだけ少ないエスケープを使用し、UTF-8を使用して文字をネイティブに表現するのが理想的です。これを行うには、UTF-8および次のような正しい文字セット宣言を処理できるエディターが必要です。

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

ただし、(X)HTMLで特別な意味を持つ文字をエスケープすることは習慣にする必要があります。

< &lt;
> &gt;
" &quot;
& &amp;
' &#39;

これにより、これらの文字を書きたいときに誤ってマークアップを書いていないことを確認できます。これは、セキュリティを維持するために、ユーザー入力にとって特に重要です。それほど明白ではありませんが、実際にはエスケープすることが重要"です。文字列がHTML属性(title="something"など)で終わる場合、ユーザーは属性を終了し、独自のマークアップを挿入できます。ユーザーが入力して" onclick="alert('hello');それを挿入するとどうなるか想像してみてくださいtitle="..."

PHPを使用している場合は、htmlspecialchars関数を使用してこれを行うことができます。他の言語には、他の同様の機能がある場合があります。

更新:アポスの問題については修正しました。ひどい厄介なIE。


矛盾する答えが2つあります。1つはエスケープを推奨し、もう1つは推奨しません。私は何を信じるべきですか?
トム

7
要するに。あなたはあなたの裁量でそれを逃れるかもしれないし、しないかもしれません。使用する場合は、&#39;notを使用します&apos;。何らかの理由で、HTML属性に単一引用符を使用する場合、title='something'その属性値内の単一引用符は明らかにエスケープする必要があります。
nitro2k01

あなたの2番目の段落は私にとって重要なものです。エスケープされていないアポストロフィが原因でgitコミットに赤いテキストが表示されたときにOCDがオーバードライブしました imgur.com/a/LN0Pu89
eballeste

6

それはあなたのユースケースに依存しますが、'一般的に自然言語での使用はお勧めできません。そのため、XMLにコンピューターコードがない限り、問題は発生しません。

文字列が翻訳されている場合、一部の翻訳者は、閉じ引用符をユニコードのカーリー引用符に置き換えますが、直線引用符を開始引用符のままにして、視覚的に不均衡でプロフェッショナルではないようにします。

Unicode文字置き換える必要が'可能、など多くの交換する必要があります"。これは、コンピューターが中括弧を特別なものとして認識しないため便利です。(Stack Overflow / Chromeは「don’t」をスペルミスと見なし、「」には満足していることがわかりましたが、don't

それは、我々は非常に魅力的持っていることを解決しない'"右のキーボードの文字が。


1

StackExchange自体がHTMLエンティティを使用してアポストロフィをエンコードするかどうかを見てみましょう。

このページのソースコードの例を次に示します。

(1)質問のタイトル:エンコード。

Should I escape the Apostrophe ( &#39; ) character with its HTML entity (&amp;#39;)?

(2)drewの答え:エンコードされていません。

But I don't believe it is, in general, necessary.

(3)nitro2k01の答えに対するTomのコメント:Encoded。

I&#39;ve got two contradicting answers now. One recommends escaping &#39; and the other does not. What should I believe?

そのため、両方の方向に行きます。

ただし、このページのソースコードではを使用しません&apos;。すべてのコード化は形式&#39;です。これはnitro2k01と一致しており、を使用しないことを勧めました&apos;


1
3つのインスタンスすべてで、HTMLエンコードする必要ありません。
-MrWhite

1

その文字列はどこに行くのですか?

あなたの答えは文脈に依存します:

  1. このデータを使用してHTMLで段落を記述する場合、<、>、および&をエスケープするだけで十分です。

    <p>{string}</p>

  2. ただし、HTML属性に書き込む場合は、

    <a href='/some/path/{string}'>...</a>

その後、絶対にアポストロフィをエスケープする必要があります。攻撃者が次の目的でこれを設定した場合、これは攻撃ベクトルになりますstring

string = "' onmouseover='alert(\"nasty script here!\")' data-ignore='"
  1. 二重引用符についても同じことが言えます。バックティック `はHTML属性にも使用される可能性があるので、脆弱であることさえ読んだことがあります。デプロイルーチンの一部として自動HTML構文チェックスクリプトがない場合、これら3つのいずれかを使用でき、HTML属性のためにエスケープする必要があると想定します。

  2. 極端な場合、引用符で囲まれていない属性も有効であるため、スペース文字もエスケープする必要があります。そして!@$%()=+{}[、および]、そのすべてが属性から抜け出すと、新しいものを挿入できるようにすることができます。

私がやること

JavaScriptでエスケープを行うために、私はjQueryの使用$(element).text(string)$(element).attr(attrname, string)私のためにエスケープを行うには。$(element).html(unsafe)HTMLをエスケープしないに注意してください!

サーバー側のコードでは、各ケースのリスクを慎重に評価し、ドキュメントを注意深く読む必要があります。これは、Rails、Django、生のPHP、Drupalなど、使用している特定の言語とライブラリに依存します。

データベース

データベースに侵入する前に、できるだけ早く問題を停止することを検討している場合は、馬を保持してください。DBに保存されているテキストをHTMLエスケープすると、地獄のような動きになります。後で、斜体、太字、色、表など、特定のHTMLタグを許可し、他のタグは許可しない場合はどうなりますか?最初のパスで何かを見逃したが、あなたのエスケーパーがすでに&as &amp;"as から脱出した場合はどうなります&quot;か?それらを&amp;amp;and に変え&amp;quot;ますか?

私のアプローチは、データベースに対してのみSQLエスケープを実行し、後の処理のためにすべてのHTML特殊文字を残すことです。これにより、HTMLエスケープを簡単にデバッグおよび微調整できます。また、ユーザーが指定した文字列がある場合、自分のSQLテーブルを信頼できないことも意味します。

道徳

ユーザーが制御する入力を決して信用せず、常にHTML属性を引用してください!

ベース:HTMLエスケープには、Ryan Groveによる&、<、>、および "以上のものがあります


-1

アポストロフィがコンテンツに属している場合は、エスケープします。コードと混同される可能性のある他のコンテンツ文字は、エスケープします。


「アポストロフィがコンテンツに属している場合は、エスケープします。」-これは間違っているように見えます(「しない」という単語が欠落しているように)。アポストロフィがコンテンツの一部である場合は、エスケープしないでください。必要はありません。
MrWhite

-4

実際のエンティティを使用せずにジョブを実行する最も簡単な方法は、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>";

4
これは冗談ですか?
蘇」

@Su」私はそれがない怖い...
ウィリアム・エドワーズ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.