a要素のhrefに"javascript:"を書くのは危険か?
たとえばaspx.net(C#)で入力値をアラートするだけのコード
string s = "\"%22); alert(%22111%22);(%22"; HyperLink1.NavigateUrl = "javascript:alert(\"" + s + "\")";
NavigateUrlプロパティは入力文字列を勝手にエスケープする。したがってa要素はこうなる
<a id="HyperLink1" href="javascript:alert("%22); alert(%22111%22);(%22")">HyperLink</a>
%22はダブルクォーテーションとして扱われる。実際上、上のhref属性はこういうこと
javascript:alert(""); alert("111");("")
HttpUtility.HtmlEncodeを使うと
<a id="HyperLink1" href="javascript:alert(&quot;%22); alert(%22111%22);(%22&quot;)">HyperLink</a>
こんな事になってしまい、目的のスクリプトコードは機能しない。結局自前でエスケープメソッド作る羽目に。
string hoge(s){ return "\"" + s.Replace("\\", "\\\\").Replace("\"", "\\\"").Replace("%", "%25") + "\""; } string s = "\"%22); alert(%22111%22);(%22"; HyperLink1.NavigateUrl = "javascript:alert(\"" + hoge( s )+ "\")";
ところが、これと同じエスケープを使ってonclick属性仕込もうとすると"%"が"%25"のまま。もうAttibutes["href"]を試す気力もない。これではonclick用、href用、なんとか用、かんとか用のエスケープを作る羽目になる。
嫌だ。もう属性にjavascript:hogeなんか書かないほうがみんな幸せになれそう。
hoge()は足りない所があったり、間違えてるかも。
*当然ながら"%22"が結構使いそうな文字列である故に"%"の入力は却下、って訳には行きません。