0

これがフォーム送信を処理するための最も安全で最良の方法であるかどうか疑問に思っていました。最も「安全」で、コーディングビューに表示されるものを見つけようとしています。

PHP

<?php
if(isset($_POST['submit'])) {
 //Handle the form here with many $_POST['namehere']
}
?>

HTML

<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="POST">
<label>Email</label>
     <input name="email" type="text">
<label>Password</label>     
     <input type="password" name="password">
<label>Submit</label>     
     <input type="submit" name="submit">
</form>

これは、これを行うために可能な唯一の方法であり、最も安全であると見なされますか?

4

4 に答える 4

1

ただし、通過するコードがあまりないため、これに答えるのは困難です。

使用しないでくださいPHP_SELF

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

生の値を使用するとサイトがXSS攻撃にさらされる可能性があるため、これを行わないでください。少なくとも値をサニタイズしてください。自分への投稿は次のように簡単に行うことができます。

<form action="" method="POST">

または、フォームの宛先として絶対(および静的)URIを使用します。

補遺

フレームワークxyzを使用して小さなサイトをホストしているため、または一部のブラウザがそれを停止するため、他の人にあなたがそれに対して魔法のように保護されていると思わせないでください。自分で調べて、適切な行動を取ります。

SSLの場合

機密データを送信する場合は、SSLを使用する必要があります。それ以外のものは、比較すると冗談です。

CSRFについて

サイトの状態を変化させ、Cookieを使用してセッションを永続化するフォームは、CSRFトークンで保護する必要があります。トークンはフォーム送信の一部である必要があり、使用されると再生成されます。

SQLインジェクションについて

mysql_*新しいコードで関数を使用しないでください。それらはもはや維持されておらず、公式に非推奨になっています。赤いボックスがか?代わりにプリペアドステートメントについて学び、 PDOまたはMySQLiを使用してください。この記事はどちらを決定するのに役立ちます。PDOを選択した場合は、ここに優れたチュートリアルがあります。

ちょっとした情報(実際にはセキュリティとは関係ありません)

if(isset($_POST['submit'])) {
 //Handle the form here with many $_POST['namehere']
}

このコードは、フォームに。という名前の送信ボタンが常にあることを前提としていますsubmit。より一般的なアプローチは、この条件を使用することです。

if ($_SERVER['HTTP_METHOD'] === 'POST') {
    // something was submitted
    if (isset($_POST['email'], $_POST['password']) {
        // email and password submitted
        // you may still wish to verify whether a "valid" email was given
    }
}
于 2013-02-24T13:02:28.807 に答える
1

あなたが持っているものはただの形です。安全でも安全でもありません。フォームが安全かどうかを定義するのは、データをサーバーに送信する方法と、サーバー側で入力を処理する方法です。

安全なログインフォーム...

  • HTTPS(SSL)を介してコンテンツをサーバーに投稿します
  • すべての入力サーバー側の適切な検証を行います
  • SQLインジェクションを許可していません
  • 適切に検証されたアンチCSRFトークンで非表示フィールドを使用する
  • 強化されたApache/PHPインストールを備えたサーバーを使用します

PHP_SELFXSSエクスプロイトについて:

  • ジャックがコメントでリンクしている記事は、実際には機能しない文字列を示唆しています
  • 特定の状況*では、このXSS攻撃の可能性があります。問題は、どの程度簡単に悪用できるかということです。脆弱性はクライアント側にあるため、直接悪用することはできません。その周りに何かを設計する必要があります(リフレクション攻撃)。たとえば、私があなたのサイトになりすまして偽の電子メールアクションを実行し、投稿を許可しながらログインするためのリンクを提供する必要があります。私のサイトへのあなたの資格。または保存された攻撃ですが、私がそれを行うことができれば、あなたのサイトはPHP_SELFXSSよりも大きな問題を抱えています。
  • 確かに、PHP_SELFの使用を避けて、htmlspecialchars($_SERVER['SCRIPT_NAME'])たとえばに置き換える場合に備えて、最善の方法があります。

* 状況

  • PHP_SELFこのエクスプロイトは、攻撃文字列を含むURLが許可されたURLルートと一致しないため、保護しておらず、実際に使用していなくても、ほとんどの最新のPHPフレームワークでは機能しません。
  • ブラウザはXSS保護の実装を開始しました。たとえば、このエクスプロイトはChrome /WebKitとIE8+では機能しませんが、執筆時点ではFirefoxでは機能します。
  • 小規模なプライベートサイトは、そのような攻撃の標的になる可能性はほとんどありません。これは、サイトを設計するのにある程度の労力がかかるためです。ターゲットは通常、ソーシャルネットワークや同様のサイトです。
于 2013-02-24T13:04:10.533 に答える
1

フォームのセキュリティを強化するには、XSRFキー/トークンの使用を検討する必要があります。これらにより、ドメイン外のサイトからのリクエストがスクリプトの呼び出しに成功するのがはるかに困難になります。

http://en.wikipedia.org/wiki/Cross-site_request_forgery

http://query7.com/preventing-csrf-in-php

于 2013-02-24T13:05:37.783 に答える
1

あなたはいくつかの点を改善することができます!

1.PHP_SELFを使用しないでください

action-formtagを空のままにします

<form action='' method='post'>

2.SQL文字をエスケープします

データベースを操作する場合は、文字列からSQL文字をエスケープする必要があります。使用する:

[mysql_real_escape_string($string)][1]

データ型の値を確認してください

完全な数字のみを期待するfromフィールドがある場合は、すべての文字を削除する必要があります。次のように、変数の前に必要な型を角かっこで囲むことにより、PHP変数の型を変更できます。

$number=(int) $value;
于 2013-02-24T13:26:49.003 に答える