HTML属性内の引用符を適切にエスケープするにはどうすればよいですか?


267

値の文字列に引用符が含まれていると、Webページにドロップダウンが表示されます。

値は"asdですが、DOMでは常に空の文字列として表示されます。

文字列を適切にエスケープするために知っているあらゆる方法を試しましたが、役に立ちませんでした。

<option value=""asd">test</option>
<option value="\"asd">test</option>
<option value="&quot;asd">test</option>
<option value="&#34;asd">test</option>

これをページにレンダリングして、ポストバックメッセージに正しい値が含まれるようにするにはどうすればよいですか?


どのようにページを生成していますか?
SLaks

1
一重引用符を使用するとどうなりますか?<option value = '"asd'> test </ option>
Wim ten Brink

5
これらの回答のどれも、html属性内で使用するために文字列を適切にエスケープする方法を述べていないことを指摘する必要があります
reconbot

4
@reconbotこれは、HTMLの生成方法によって異なります。質問は引用に関するものだったので、技術的には受け入れられた回答が質問の答えになります。文字列を適切にエスケープする方法については、一般的な場合に役立つリンクはありませんが、PHPではを使用しますhtmlentities
Matt Browne 2013

回答:


344

&quot; あなたのテストの3番目は正しい方法です:

<option value="&quot;asd">test</option>

これは、下またはjsFiddleで機能することがわかります。

alert($("option")[0].value);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<select>
  <option value="&quot;asd">Test</option>
</select>

または、属性値を一重引用符で区切ることもできます。

<option value='"asd'>test</option>

17
OPの4番目のオプション&#34;も、引用符をエスケープする有効な方法です。名前付きエンティティよりも数値htmlエンティティを使用すると、名前付きエンティティがすべての文字をカバーするわけではなく、数値エンティティがカバーするという利点があります。完全なHTML4リストはw3.org/TR/html4/sgml/entities.htmlにあります。
攻撃

38
@atk:はい、&quot;と同じ文字にマッピングされますが、は定義済みの名前付きエンティティ&#34;であるため&quot;、ここでは数値オプションを使用してもメリットはありません。 &quot;覚えるのも簡単です。
アンディE

6
同意する。この特定のケースでは、&quot;を使用する方が簡単です。私は一般的なケースを指摘することだけを意図しました。
攻撃

4
@SIDU:変更それはに&amp;quot;a(置き換え&&amp;
アンディ・E

4
^無限ループ
Omar Meky 2017

16

PHPを使用している場合は、呼び出しhtmlentitiesまたはhtmlspecialchars関数を試してください。


2
ちょうどそれらが十分ではないかもしれない使用して、試してください<option value='<?php echo htmlentities("' onmouseover='alert(123);' foo='"); ?>' />-メイクを必ずENT_QUOTESでそれを使用し、これは安全である:<option value='<?php echo htmlentities("' onmouseover='alert(123);' foo='", ENT_QUOTES); ?>' /> しかし、ENT_QUOTESに加えて、あなたも個人的に私は何年もこのラッパーを使用しました、ENT_SUBSTITUTEとENT_DISALLOWEDを追加する必要があります:function hhb_tohtml(string $str):string { return htmlentities($str, ENT_QUOTES | ENT_HTML401 | ENT_SUBSTITUTE | ENT_DISALLOWED, 'UTF-8', true); }
hanshenrik

12

HTML構文ごと、さらにHTML5ごとに、以下はすべて有効なオプションです。

<option value="&quot;asd">test</option>
<option value="&#34;asd">test</option>
<option value='"asd'>test</option>
<option value='&quot;asd'>test</option>
<option value='&#34;asd'>test</option>
<option value=&quot;asd>test</option>
<option value=&#34;asd>test</option>

XML構文を使用している場合は、引用符(シングルまたはダブル)が必要であることに注意してください。

上記の動作のすべてを示すjsfiddleは次のとおりです。


7

別のオプションは、それが何であっても構わない場合は、二重引用符を単一引用符に置き換えることです。しかし、これについては触れません。

<option value='"asd'>test</option>

私はこれについて言及します:

<option value="'asd">test</option>

私の場合、このソリューションを使用しました。


9
しかし、値に一重引用符と二重引用符が含まれている場合、これは失敗します
Raptor

@Raptor値に二重引用符が含まれている場合は、それらを単一引用符に変換します。値に単一引用符が含まれている場合は、問題ありません。
csonuryilmaz 2014年


0

本当に信頼できないデータのみを許可する必要があります:align、alink、alt、bgcolor、border、cellpadding、cellspacing、class、color、cols、colspan、coords、dir、face、height、hspace、ismap、lang 、marginheight、marginwidth、複数、nohref、noresize、noshade、nowrap、ref、rel、rev、rows、rowspan、scrolling、shape、span、summary、tabindex、title、usemap、valign、value、vlink、vspace、width

信頼できないデータを、JavaScriptハンドラーやID属性や名前属性(DOM内の他の要素を破壊する可能性がある)から排除する必要があります。

また、信頼できないデータをSRCまたはHREF属性に入れる場合は、実際には信頼できないURLであるため、URLを検証し、javascript:URLではなく、HTMLエンティティエンコードであることを確認してください。

ここにあるすべての詳細:https : //www.owasp.org/index.php/Abridged_XSS_Prevention_Cheat_Sheet


3
私はこれが遅いことを知っていますが、これらの属性のほとんどすべてがHTML4.01で非推奨になり、5で削除されています。
トリシス2014年

1
問題は、信頼できないデータではなく、引用符が含まれているデータについてです。
クエンティン

-3

入力テキストの値で引用符をエスケープする方法はありませんが、javascript(またはjquery)を使用できます。

<input type="input" name="myinput" id="myinput" value="" />
<script>document.getElementById("myinput").value="This input has a [\"]";</script>

1
「入力テキストの値で引用符をエスケープする方法はありません」というあなたの声明は、明らかに間違っています。276票を獲得した2010年の承認済み回答をご覧ください。
クエンティン

クエンティン私を失礼しますが、その答えはそれを行う方法はないと言っています。これは、htmlコード化された二重引用符を挿入するか、または単純な引用符を使用して二重引用符を区切ることができると述べていますが、二重引用符で定義された値に二重引用符を挿入する方法はありません。それは私がしていることと同じである何か不可能なことへの代替案を提案しています
Miguel

二重引用符で区切られた値に二重引用符を挿入する方法は、今言ったようにhtmlエンコード使用することです。
クエンティン

(こんにちはクエンティン...私たちはオンラインです)その文字列の値は二重引用符ではなく&quot;であり、同じではないことを言っているだけです。
ミゲル

2
&quot;を挿入した場合 値で送信し、サーバーで&から;までの6文字を受け取ります。二重引用符は表示されません。それは同じではなく、私にはうまく
ミゲル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.