以下のコードは、与えられたテキスト内からURLらしき文字列を探して、それらを<a>要素でリンクにしたHTMLを生成するJavaScriptの関数であるとします。攻撃者が引数 text の中身を自由に制御可能な場合、このコードにはどのような問題点があるか、またこのコードを修正するとすればどのようにすればよいか、自分なりに考察して書いてください。
function makeUrlLinks( text ){
var html = text.replace( /[\w]+:\/\/[\w\.\-]+\/[^\r\n \t<>"']*/g, function( url ){
return "<a href=" + url + ">" + url + "</a>";
} );
document.getElementById( "output" ).innerHTML = html;
}- そもそもURLの有無にかかわらず、入力されたtextをエスケープせずinnerHTMLに突っ込んでいるため、XSS脆弱性が存在する。例えば、
<script>alert(1)</script>のような文字列を入力することにより、任意のコードが実行される可能性がある。 - スキーム名の検査をしていないので、javascriptスキームによるURLを埋め込まれ、任意のコードが実行されるXSS脆弱性が存在する。例えば、
javascript://
alert(1)//のような文字列を入力することにより、任意のコードを実行される可能性がある。 - 属性値を引用符で囲んでいないので、空白文字の挿入により他の属性を挿入できるXSS脆弱性が存在する。空白文字については正規表現で検査されているが、\f(U+000C)が弾かれていない。よって例えば、
http://xss/onclick=alert(1)のような文字列(onclickの前に\fが挿入されている)を入力することにより、任意のコードを実行される可能性がある。