PHPページのフォームでは、次を使用できます。
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" ...>
または
<form action="#" ...>
または
<form action="" ...>
フォームのアクション属性で。 echo $_SERVER['PHP_SELF']
はGET
を使用するための変数を渡さず、""
を使用する必要があるため、なぜそれまたは"#"
を使用するのですか?
変数が$_SERVER['PHP_SELF']
で渡されないことを理解するのに時間がかかったので、私は尋ねています。ありがとう。
action
属性のデフォルトは現在のURLです。 「フォームを送信元と同じ場所に送信する」と言うのが最も信頼でき、最も簡単な方法です。
$_SERVER['PHP_SELF']
を使用する理由はなく、#
はフォームをまったく送信しません(送信を処理するsubmit
イベントハンドラーがアタッチされていない限り)。
空の文字列を使用することは、$_SERVER['PHP_SELF']
を使用するよりも完全に問題なく、実際にははるかに安全です。
$_SERVER['PHP_SELF']
を使用する場合、URLの/<script>...
部分の後にwhatever.php
を追加するだけで悪意のあるデータを注入することは非常に簡単です。このメソッドを使用してPHPそれを提案するチュートリアル。
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/"><script>cookie_stealing_code()</script><span class="">
フォームを送信すると、奇妙なURLになりますが、少なくとも私の邪悪なスクリプトは実行されませんでした。
一方、<form action="">
を使用した場合、リンクに何を追加しても出力は同じになります。これは私が推奨するオプションです。
質問は2年前であることは知っていますが、それは私が探しているものの最初の結果でした。良い答えが見つかりました。他のユーザーを助けることができるといいのですが。
これを簡単に説明します。
$_SERVER["PHP_SELF"]
変数とhtmlspecialchars
()を使用します。
`htmlspecialchars($_SERVER["PHP_SELF"]);`
PHP_SELFは、現在実行中のスクリプトのファイル名を返します。
htmlspecialchars
()関数は、特殊文字をHTMLエンティティに変換します。 -> XSSなし上記の答えに加えて、それを行う別の方法は$_SERVER['PHP_SELF']
であるか、単に空の文字列を使用することは__DIR__
を使用することです。
または
下位のPHPバージョン(<5.3)を使用している場合、より一般的な代替手段はdirname(__FILE__)
を使用することです両方とも、コンテキスト内のファイルのフォルダー名を返します。
編集
Boannが指摘したように、これはファイルのディスク上の場所を返します。理想的にはURLとして公開しない場合。その場合、dirname($_SERVER['PHP_SELF'])
はコンテキスト内のファイルのフォルダー名を返すことができます。