web-dev-qa-db-ja.com

「」の代わりに$ _SERVER ['PHP_SELF']を使用する理由

PHPページのフォームでは、次を使用できます。

<form action="<?php echo $_SERVER['PHP_SELF']; ?>" ...>

または

<form action="#" ...>

または

<form action="" ...>

フォームのアクション属性で。 echo $_SERVER['PHP_SELF']GETを使用するための変数を渡さず、""を使用する必要があるため、なぜそれまたは"#"を使用するのですか?

変数が$_SERVER['PHP_SELF']で渡されないことを理解するのに時間がかかったので、私は尋ねています。ありがとう。

41
robk27

action属性のデフォルトは現在のURLです。 「フォームを送信元と同じ場所に送信する」と言うのが最も信頼でき、最も簡単な方法です。

$_SERVER['PHP_SELF']を使用する理由はなく、#はフォームをまったく送信しません(送信を処理するsubmitイベントハンドラーがアタッチされていない限り)。

61

空の文字列を使用することは、$_SERVER['PHP_SELF']を使用するよりも完全に問題なく、実際にははるかに安全です。

$_SERVER['PHP_SELF']を使用する場合、URLの/<script>...部分の後にwhatever.phpを追加するだけで悪意のあるデータを注入することは非常に簡単です。このメソッドを使用してPHPそれを提案するチュートリアル。

43
ThiefMaster

HTMLにANY変数を挿入する場合、ブラウザーに変数自体をHTMLとして解釈させない限り、htmlspecialchars()を使用するのが最善です。とりわけ、ハッカーがページに任意のHTMLを挿入することを防ぎます。

$_SERVER['PHP_SELF']の値は、ブラウザーに入力されたURLから直接取得されます。したがって、htmlspecialchars()なしで使用すると、ハッカーがコードの出力を直接操作できるようになります。

たとえば、http://example.com/"><script>malicious_code_here()</script><span class="へのリンクを電子メールで送信し、<form action="<?php echo $_SERVER['PHP_SELF'] ?>">がある場合、出力は次のようになります。

<form action="http://example.com/"><script>malicious_code_here()</script><span class="">

私のスクリプトが実行され、あなたは賢者ではなくなります。ログインしている場合は、Cookieを盗んだか、ページから機密情報をスクレイプした可能性があります。

ただし、<form action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']) ?>">を使用した場合、出力は次のようになります。

<form action="http://example.com/&quot;&gt;&lt;script&gt;cookie_stealing_code()&lt;/script&gt;&lt;span class=&quot;">

フォームを送信すると、奇妙なURLになりますが、少なくとも私の邪悪なスクリプトは実行されませんでした。

一方、<form action="">を使用した場合、リンクに何を追加しても出力は同じになります。これは私が推奨するオプションです。

23
Mark Eirich

質問は2年前であることは知っていますが、それは私が探しているものの最初の結果でした。良い答えが見つかりました。他のユーザーを助けることができるといいのですが。

これを見てください

これを簡単に説明します。

  • $_SERVER["PHP_SELF"]変数とhtmlspecialchars()を使用します。

    `htmlspecialchars($_SERVER["PHP_SELF"]);`
    
  • PHP_SELFは、現在実行中のスクリプトのファイル名を返します。

  • htmlspecialchars()関数は、特殊文字をHTMLエンティティに変換します。 -> XSSなし
11
Micha93

上記の答えに加えて、それを行う別の方法は$_SERVER['PHP_SELF']であるか、単に空の文字列を使用することは__DIR__を使用することです。
または
下位のPHPバージョン(<5.3)を使用している場合、より一般的な代替手段はdirname(__FILE__)を使用することです
両方とも、コンテキスト内のファイルのフォルダー名を返します。

編集
Boannが指摘したように、これはファイルのディスク上の場所を返します。理想的にはURLとして公開しない場合。その場合、dirname($_SERVER['PHP_SELF'])はコンテキスト内のファイルのフォルダー名を返すことができます。

0
maxxon15