1

次の状況を考えてみましょう。ユーザーは、ファイル入力フィールドを含むフォームを送信します。次に、アップロードを処理した後、サーバーはブラウザーを を含むアドレスにリダイレクトします#hash-part。ブラウザがIE7/8の場合、ハッシュマーク以降の部分(#自身も含む)を破棄します。さらに、実際のファイルのアップロードが行われたか、ユーザーがファイル フィールドを空のままにしたかに関係なく、これが行われます。次のコードはそれを示しています。

<?  if (isset($_POST['sent'])) {
        header("Location: " . basename($_SERVER['PHP_SELF']) . "#test");
        die();
    }
?><!DOCTYPE html
    PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Test</title>
</head>
<body>
    <form action="" method="post" enctype="multipart/form-data">
        <input type="hidden" name="sent" value="1" />
        <input type="file" name="test" />
        <input type="submit" value="Submit" />
    </form>
</body>
</html>

フォームが送信されると、IE 7/8 は以前と同じアドレス バーに同じアドレスを表示しますが、他のブラウザー (および IE 9/10) は index.php#test に適切にリダイレクトされます。ファイル入力をテキスト入力に置き換えると、問題はなくなります。

それはバグですか、それとも何らかのセキュリティ対策ですか?回避策はありますか?

4

2 に答える 2

1

IE 7/8で二重リダイレクトを使用することになりました。交換しました

header("Location: " . basename($_SERVER['PHP_SELF']) . "#test");

if (isset($_SERVER['HTTP_USER_AGENT']) && preg_match('/(^|[^a-zA-Z])(MSIE|msie) [678]($|[^\d])/', $_SERVER['HTTP_USER_AGENT'])) // If IE 6, 7 or 8
    header("Location: redirect.php?to=" . urlencode(basename($_SERVER['PHP_SELF']) . "#test"));
else    // For sane browsers
    header("Location: " . basename($_SERVER['PHP_SELF']) . "#test");

簡単なリダイレクトスクリプトを作成しましたredirect.php

<?  if (isset($_GET['to']))
        header('Location: ' . $_GET['to']);
于 2013-06-10T16:29:01.373 に答える
0

これは、JavaScript を使用して oauth フローを実装するときに対処しなければならなかったインターネット エクスプローラーの奇妙な点です。

ハッシュタグの直前に末尾のスラッシュを配置することで、問題を回避できるようです。file.php#werewwerだから作る代わりにfile.php/#werwer

しかし、理由はわかりません...バグだと思います。

ハッシュタグはサーバーに送信されないように意図されています。クライアント側のみです。IEはそれを早期に削除すると思います...

もう 1 つの可能性は、ヘッダー リダイレクトの代わりにメタ リダイレクトを使用することです。それはうまくいくようです。JavaScript を使用して URL に追加することもできます...これがユースケースに適しているかどうかはわかりません。

于 2013-06-09T19:02:32.250 に答える