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(&quot;%22); alert(%22111%22);(%22&quot;)">HyperLink</a>

%22はダブルクォーテーションとして扱われる。実際上、上のhref属性はこういうこと

javascript:alert(""); alert("111");("")

HttpUtility.HtmlEncodeを使うと

<a id="HyperLink1" href="javascript:alert(&amp;quot;%22); alert(%22111%22);(%22&amp;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"が結構使いそうな文字列である故に"%"の入力は却下、って訳には行きません。