0

これがOpera Dragonflyが私に見せてくれるものです:

<form action="rejectQuestion.php?q_id=24" id="reject_question" method="get">
<input type="submit" value="Reject" id="form_button"/>
</form>

しかし、送信ボタンをクリックすると、次のようになります。

http://project/rejectQuestion.php?であるため、引数はありません。同じものが別のフォームにあります。サーバーの問題ですか、それともコードの問題が見えないほど病気ですか?

4

3 に答える 3

11

フォームにが含まれている場合、送信するフォームデータでmethod="get"のクエリ文字列が上書きされます。actionしたがって、「固定」値が必要な場合は、それらを非表示の入力として追加する必要があります。

<form action="rejectQuestion.php" id="reject_question" method="get">
  <input type="hidden" name="q_id" value="24" />
  <input type="submit" value="Reject" id="form_button" />
</form>

ただし、HTTP仕様では、「質問を拒否」という名前で判断して実行しているように見えることなど、変換を行うものにはGETリクエストを使用してはならないことが明示的に規定されています。POSTこれにはリクエストを使用する必要があります

これを行う必要がある理由の1つは、不正な要求を防ぐためです。悪意のあるユーザーは、疑いを持たないユーザーに「削除」リンクを簡単に送信でき、被害者は自分のコンテンツがなくなっていることに気付く可能性があります。クリックされたリンクである必要はありません。悪意のあるユーザーは、壊れた画像のように見えるものを公開フォーラムに投稿するだけで済みますが、実際にはサーバーにリクエストを送信し、変更または削除しました。

すべての変換要求はPOST、絶対にしないでGETください。ものを取得GETするためだけに使用する必要があります。

于 2012-12-29T20:49:38.113 に答える
3

非表示の入力をフォームに追加する

<form action="rejectQuestion.php" id="reject_question" method="get">
<input type="hidden" name="q_id" value="24">
<input type="submit" value="Reject" id="form_button">
</form>

GETフォームでメソッドを使用すると、フォームで使用されるクエリ文字列が上書きされるため、この方法で行う必要がありますaction

別の方法は、フォームでPOSTメソッドを使用できるようにすることです。その場合、クエリ文字列はそのままになります。GETPOSTスーパーグローバルの両方に値が存在するため、これはバックエンドで混乱を招く可能性があります。

于 2012-12-29T20:44:11.723 に答える
2

actionコードの問題は、 URLでGETパラメーターを使用し、を持っていることmethod="get"です。

これにより、ブラウザはからクエリ文字列を破棄actionし、フォームフィールドに基づいた(この場合は空の)クエリ文字列のみを使用します。このため、を使用するかmethod="POST"(リクエストを使用してデータを変更するため、とにかくこれは良い考えです)、またはq_idを非表示のフォームフィールドに移動する必要があります。実際には、POSTを使用している場合でもそうする必要があります。GETを介してIDを渡す必要はありません。

<form action="rejectQuestion.php?q_id=24" id="reject_question" method="get">
  <input type="hidden" name="q_id" value="24" />
  <input type="submit" value="Reject" id="form_button" />
</form>
于 2012-12-29T20:50:25.833 に答える