外部クライアントサイドスクリプトから文字列を取得します。後でurlの一部として添付する必要があります。今、私はそのようなデータを傷つける最善の方法は何ですか?URLの一部としてユーザー入力をサニタイズする
私はこのような構造を持つことになり得る文字列:
dynamicVal#staticVal:dynamicVal
:
http://the-page.com/dynamicVal#staticVal:dynamicVal
URLは以下のように使用されます。
$link = htmlspecialchars("http://external-page.com/dynamicVal#staticVal:dynamicVal", ENT_QUOTES);
$var = "<a href=\"javascript: window.open('$link')\">'Open URL'</a>";
問題は、htmlspecialchars
は、ランダムなjavascriptコードの実行を防止する手助けをしません。値にこのアラートを追加することによって:
dynamicVal#staticVal:dynamicVal'+alert(\"breakout\")+'
は、パラメータの値が、URLの実数部分ではないので、文句を言わない、のいずれか助けrawurlencode
を使用します。
URLに連結するときに、渡された文字列をサニタイズする最も良い方法は何ですか?
ありがとうございます。
編集: 実際にも問題が解決しなかっただけで動的な部分にrawurlencode
を使用して、JavaScriptはまだ実行されてしまいました。
テストスニペット:
$splitVal = "#staticVal:";
$tmpArr = explode($splitVal, "dynamicVal#staticVal:dynamicVal'+alert(\"breakout\")+'");
$link = htmlspecialchars(sprintf("http://external-page.com/"."%s$splitVal%s", rawurlencode($tmpArr[0]), rawurlencode($tmpArr[1])), ENT_QUOTES);
echo "<a href=\"javascript: window.open('$link')\">'Open URL'</a>";
EDIT2: javascriptの引数はどちらか助けていないなどの文字列を渡すときjson_encode
を使用します。 適応テストスニペット:行わ
$splitVal = "#staticVal:";
$tmpArr = explode($splitVal, "dynamicVal#staticVal:dynamicVal\"+alert('breakout')+\"");
$link = htmlspecialchars(sprintf("http://external-page.com/"."%s$splitVal%s", rawurlencode($tmpArr[0]), rawurlencode($tmpArr[1])), ENT_QUOTES);
echo "<a href=\"javascript: window.open(".htmlspecialchars(json_encode($link), ENT_QUOTES).")\">'Open URL'</a>";
Adaptions:
は悪質JSに引用符を交換。
の周りにhtmlspecialchars
を移動しました。二重引用符で囲まれた文字列が返されるため、そうでない場合はhtmlが中断されます。
+1、さらに良い 'rawurlencode'です。 – Jon
私は、文字列を最初に分割せずに再度エンコードして連結することを望みました:)私がまだ知りませんでしたいくつかの魔法の機能:D大変ありがとうございます。 – enricog
ちょうどその方法をやろうとしましたが、JavaScriptはまだ実行されています。編集を参照してください。 – enricog