0

静的ページ A には、動的ページである承認ページB に送信するアクションを含むフォームがあります。承認後、B はA から B に渡されるコールバック URL C にリダイレクトします。

ページ C にリダイレクトするだけでなく、B は認証状態を示すいくつかのパラメーターも投稿します。uinは、ページ C のコンテンツ、つまりスクリプトで使用される最も重要なパラメーターです。スクリプトは、後で Ajax リクエストを送信するためにuinを必要とします。質問は、 uinを静的ページ Cに渡すにはどうすればよいですか?

私が得た手っ取り早いアイデアは、静的ページ C を PHP ファイルでラップし、データを隠しファイルに出力することdivです。

<?php
$html = file_get_contents("callback.html")
$div = "<div stype='display:none' uin={$_POST['uin']}></div>"
//add this div to $html and print it, need a little more work to figure out how to do this
?>

これは一種の「ばか」だと思うので、これを行うより良い方法はありますか...

4

3 に答える 3

1

あなたのコード: (stypeタイプミスを修正)

$div = "<div style=\"display:none\" uin={$_POST['uin']}></div>";

このコードを見ると、最大の問題は、$_POST値をエスケープせずに出力していることです。

これは潜在的なセキュリティ上の脅威です。uin.で始まる HTML コードの文字列に設定された値を使用して、サイトに投稿されたフォームを誰かが提供した場合にどうなるかを考えてみて>くださいdiv。それらのコードは、あたかもそこに配置したかのように、サイトに表示されます。慎重にスタイリングすることで、これを使用して、サイトの外観と動作を好きなようにすることができます. 良くない。

$_POST変数をラップhtml_entities()してサイトに出力するときに適切にエスケープされるようにすることで、これを修正できます。

または、この場合、数値の ID 値 (または数値のように見える) であるため、単純に int としてキャストして、実際の投稿データに何が含まれていても、不要なデータが含まれないようにすることができます。

$uin = (int)$_POST['uin'];

...そして$uin、生の投稿データではなく出力で使用します。

2 つ目のポイントは、有効性の 1 つです。uinは有効な HTML 属性ではありません。うまくいくかもしれませんが、有効ではありません。HTML でカスタム属性を行う標準に準拠した正しい方法は、次のように data 属性を使用することです。

$div = "<div style=\"display:none\" data-uin={$uin}></div>";

... つまり、すべてのカスタム属性の名前はdata-

これは、問題の危険を冒すことなく、実際の属性と同じ名前のカスタム属性を持つことができるため、推奨されます。たとえば、実際の属性data-styleと衝突することなく、 を持つことができます。style

また、HTML 仕様に新しい属性を追加しても、他の人のコードと競合する危険を冒すことはありません。たとえば、HTML の将来のバージョンに、uin将来のブラウザーがその要素を巧妙に処理するために使用する属性が含まれている場合、コードに問題が発生する可能性があります。を使用すれば、これらの問題は発生しませんdata-uin。(uinそうです、新しい標準 HTML 属性の名前としてはありそうもないですが、要点は立っています)

于 2013-07-17T10:52:19.393 に答える
0

おそらく、ページ B のパラメーターをユーザー セッションに保存する必要があります。ページ C よりも、これらのパラメーターを使用できます (session_start()何かがブラウザーに出力される前に呼び出した後)。また、JavaScript を使用している場合は、html div の代わりに JavaScript 変数に uin を配置することを検討してください。のようなもの<script type="text/javascript">var uin = 123; </script>

于 2013-07-17T10:40:23.083 に答える
0

php コードに構文エラーがあり、インライン スタイルを囲む引用符をマスクする必要があり、いくつかのコロンを追加しませんでした:

<?php
$html = file_get_contents("callback.html");
$div = "<div style=\"display:none\" uin={$_POST['uin']}></div>";
//add this div to $html and print it, need a little more work to figure out how to do this
echo($html); // print variable $html
echo($div); // print variable $div
?>
于 2013-07-17T10:31:57.657 に答える