0

ローカル Web サイトで HTML の有効な URL を簡単に作成できるように、小さな静的関数があります。以下に示します。

public static function url($path = false) {

    // Build return url with special html characters escaped
    return 'http://127.0.0.1/' . htmlspecialchars($path);
}

アンカー内に 1 つ、フォーム アクション内にもう 1 つ、2 つの URL があります。

Root::url('test?category=' . $category . '&index=' . $index) // Href

Root::url('test?category=' . $_GET['category'] . '&index=' . $_GET['index']) // Form

GET === $htmlspecialchars、 URL から特別な html 文字をエスケープするために使用する静的関数の内部を見ることができます。

アンカー 1 は有効なリンクを返し、期待どおりに機能します。ただし、フォーム送信をクリックすると、ブラウザのURLは次のようになります。

http://127.0.0.1/test?category=innate&index=0

どうしてこれなの?GETパラメータが有効であることに依存しているため、ウェブサイトが壊れます。

お時間をいただきありがとうございます。これが理にかなっていることを願っています。

編集

関数呼び出しの戻り値を直接フォーム アクションに挿入します。

<form 
action="<?= Root::url('test?category=' . $_GET['category'] . '&index=' . $_GET['index']); ?>" 
method="post">

編集

フォーム html は次のとおりです。

<form action="http://example.com/test?category=innate&amp;index=0" method="post">

アンカーhtmlは次のとおりです

<a href="http://example.com/test?category=innate&amp;index=0">

GET パラメータがあるにもかかわらず、サーバーが POST リクエストを送信することと関係があるのでしょうか?

編集#3

わかりましたので、それは私の関数または私が渡しているものと関係があります.フォーム送信でURLをハードタイプしましたが、問題なく機能しました。つまり、関数が返すものだけです.

私自身、私が何であるかを見ることができません!

答え

headerフォームが送信された後、フォームの再送信に対抗するために同じページにリダイレクトしていました。ヘッダーの文字列は によって生成されていましたRoot::url()

これを理解するのに2時間かかりましたが、男の子は気分がいいです!

4

2 に答える 2

1

これはかなり論理的です。

あなたのurl()方法は次のようになると思います:

url($string){
  echo htmlspecialchars($string);
}

$stringあなたが渡しているを見てみましょう:

'test?category=' . $_GET['category'] . '&index=' . $_GET['index'];

あなたの出力に見られるように、値を置き換えると、htmlspecialchars()発生する前の最終的な文字列は次のようになります。

'test?category=innate&index=0'そしてその後:test?category=innate&amp;index=0


ここで何が起こったのですか?最初に文字列を連結してhtmlspecialchars()から、パラメータを区切るために & を使用しました。そして、URL を壊さないようにするために、その'&'を変換したくありません。

また、htmlspecialchars()ほとんどの html エンティティは& + somename + ;のようなものに変換されるため、使用しない URL をサニタイズします。たとえば、ユーロ記号が に変換され&euro;、実際の & 記号を URL に含めたくない場合、ブラウザは別の新しいパラメータが待機していると解釈します。

& を %26 に変換するを使用する必要がurlencode()あります。また、関数の名前は一目瞭然で、URL で使用する文字列をエンコードしています。


それでも、 & でパラメータを区切る必要がありますが、$GET値では区切らないでください。私たちは何をすべきか?文字列を連結するurlencode前の値に。次のような方法をお勧めします。

function url($page, $get){
    $parameters = array();
    foreach($get as $k => $v) $parameters[] = urlencode($k)."=".urlencode($v);
    //We are concatenating with ? and & the urlencoded() values in the next line:
    echo urlencode($page).'?'.implode('&', $parameters);
}

url('test', $_GET); // outputs: test?category=innate&index=0 

これにより、フォームのフィールド名と値から特殊文字が取り除かれます。

カテゴリとインデックスの 2 つの固定パラメータを使用することに気付いたので、メソッドは次のようになります。

function url($page, $get){
    $page = urlencode($page);
    $category = urlencode($get['category']);
    $index = urlencode($get['index']);
    echo "$page?category=$category&index=$index";
}

これがあなたが必要としていたものであることを願っています

于 2013-10-21T12:52:21.473 に答える