2011-09-14 10 views
0

外部クライアントサイドスクリプトから文字列を取得します。後でurlの一部として添付する必要があります。今、私はそのようなデータを傷つける最善の方法は何ですか?URLの一部としてユーザー入力をサニタイズする

私はこのような構造を持つことになり得る文字列:
dynamicVal#staticVal:dynamicVal

この値は、URLに追加されます


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が中断されます。

答えて

0

を、私は単にrawurlencodeを使用する前に、動的な部分にaddslashesを置くことによって、その問題を解決することができました。
ブレークアウトを防ぐには、両方の関数呼び出しが必要です。 addslashesを使用すると、通常の引用符('")とrawurlencodeはすでに暗号化された引用符(%29,%22)が害を被るのを防止します。

だから、最終的な解決策は、次のようになります

$splitVal = "#staticVal:"; 
$tmpArr = explode($splitVal, "dynamicVal#staticVal:dynamicVal'+alert(\"breakout\")+'"); 
$link = htmlspecialchars(sprintf("http://external-page.com/"."%s$splitVal%s", rawurlencode(addslashes($tmpArr[0])), rawurlencode(addslashes($tmpArr[1]))), ENT_QUOTES); 
echo "<a href=\"javascript: window.open('$link')\">'Open URL'</a>"; 
3

これにはurlencode()を使用する必要があります。文字列全体ではなく動的部分のみ。

$link = sprintf('http://external-page.com/%s#staticVal:%s', urlencode('dynamicVal'), urlencode('dynamicVal')); 
$var = "<a href=\"javascript: window.open('$link')\">'Open URL'</a>"; 

EDIT

OK - 私はあなたの問題を参照してください。私はあなたがJavaScript関数呼び出しにコードを挿入することに気づいていませんでした。あなたはJavaScriptインタープリタがwindow.open()に文字列引数としてあなたのリンクを扱うことを確認する必要があります:completenesについては

$link = sprintf('http://external-page.com/%s#staticVal:%s', urlencode('dynamicVal'), urlencode('dynamicVal')); 
$var = "<a href=\"javascript: window.open(".json_encode($link).")\">'Open URL'</a>"; 
+1

+1、さらに良い 'rawurlencode'です。 – Jon

+0

私は、文字列を最初に分割せずに再度エンコードして連結することを望みました:)私がまだ知りませんでしたいくつかの魔法の機能:D大変ありがとうございます。 – enricog

+0

ちょうどその方法をやろうとしましたが、JavaScriptはまだ実行されています。編集を参照してください。 – enricog

関連する問題