一般的な PHP アプリケーション開発では、ほとんどのロジックに、ユーザーが正常にログインしたかどうかの確認、ショッピング カートへの商品の追加、クレジット カード取引の処理などのデータ処理タスクが含まれます。データには多数のソースが存在する可能性があり、セキュリティを必要とする開発者は、次の 2 種類のデータにおいてシンプルで信頼性が高い必要があります:
LL はフィルタリングされたデータ
L は汚染されたデータ
自分で設定した信頼できるデータはすべて、フィルターされたデータと見なすことができます。自分で設定するデータは、次のメール アドレス データなどのハードコーディングされたデータです:
$email = 'chris@example.org';
上記の電子メール アドレス chris@example.org は、リモート データ ソースからのものではありません。それは明らかに信頼できるものです。リモート データ ソースからのデータはすべて入力され、すべての入力データは汚染されているため、使用前にフィルターする必要があります。
汚染されたデータとは、ユーザーが送信したフォーム、メール サーバーから受信した電子メール、他の Web アプリケーションから送信された XML ドキュメントなど、合法であることが保証できないすべてのデータを指します。前の例では、$email はフィルターされたデータを含む変数です。変数ではなくデータがキーです。変数は単なるデータのコンテナであり、プログラムの実行中に汚染されたデータによって上書きされることがよくあります:
$email = $_POST['email'];
もちろん、データが必要ない場合に $email が変数と呼ばれるのはこれが理由です。変更するには、代わりに定数を使用できます:
CODE:
define('EMAIL', 'chris@example.org');
上記のステートメントで定義されている場合、EMAIL はスクリプト全体で値 chris@example.org を持つ定数となり、再割り当てを試みても (通常は誤って) 変更されません。たとえば、次のコードは chris@example.org を出力します。 (定数を再定義しようとすると、通知レベルのエラー メッセージが表示されます)。
コード:
ヒント
をご覧ください。 //m.sbmmt.com/
第 1 章で説明したように、register_globals により、$email などの変数の起源を特定することが困難になる場合があります。外部ソースからのすべてのデータは、正当であることが証明されるまで汚染されていると見なされるべきです。
ユーザーはさまざまな方法でデータを送信できますが、ほとんどのアプリケーションはフォームの送信結果に基づいて最も重要な操作を実行します。別の攻撃者は、送信されたデータ (アプリケーションが動作する基盤) を操作するだけで侵害する可能性があり、フォームによってアプリケーションの設計と使用する必要のあるデータが簡単に公開されます。 Web アプリケーションのセキュリティ問題の中で、フォーム処理が最初の懸念事項となるのはこのためです。种 ユーザーは 3 つの方法でデータを送信できます:
L URL 経由 (GET データなど)
L リクエストのコンテンツ経由 (POST データ メソッドなど)
l HTTP 経由ヘッダー情報 (Cookie など)
HTTP ヘッダー情報はフォーム処理に直接関係しないため、この章では説明しません。一般に、GET データと POST データの疑いは、HTTP ヘッダー情報を含むすべての入力に拡張できます。
表单通过GET或POST请求方式传送数据。当你建立了一个HTML表单,你需要在form标签的method属性中指定请求方式:
<form action="http://example.org/register.php" method="GET">
在前例中,请求方式被指定为GET,浏览器将通过URL的请求串部分传输数据,例如,考虑下面的表单:
CODE:
<form action="http://example.org/login.php" method="GET"> <p>Username: <input type="text" name="username" /></p> <p>Password: <input type="password" name="password" /></p> <p><input type="submit" /></p> </form>
如果我输入了用户名chris和密码mypass,在表单提交后,我会到达URL为//m.sbmmt.com/的页面。该URL最简单的合法HTTP/1.1请求信息如下:
CODE:
GET /login.php?username=chris&password=mypass HTTP/1.1 Host: example.org
并不是必须要使用HTML表单来请求这个URL,实际上通过HTML表单的GET请求方式发送数据与用户直接点击链接并没有什么不同。
记住如果你在GET方式提交的表单中的action中试图使用请求串,它会被表单中的数据所取代。
而且,如果你指定了一个非法的请求方式,或者请求方式属性未写,浏览器则会默认以GET方式提交数据。
为说明POST请求方式,只对上例进行简单的更改,考虑把GET请求方式更改为POST的情况:
CODE:
<form action="http://example.org/login.php" method="POST"> <p>Username: <input type="text" name="username" /></p> <p>Password: <input type="password" name="password" /></p> <p><input type="submit" /></p> </form>
如果我再次指定用户名chris和密码mypass,在提交表单后,我会来到//m.sbmmt.com/页面。表单数据在请求的内部而不是一个URL的请求串。该方式最简单的合法HTTP/1.1请求信息如下
CODE:
POST /login.php HTTP/1.1 Host: example.org Content-Type: application/x-www-form-urlencoded Content-Length: 30 username=chris&password=mypass
现在你已看到用户向你的应用提供数据的主要方式。在下面的小节中,我们将会讨论攻击者是如何利用你的表单和URL作为进入你的应用的缺口的。
以上就是PHP安全-表单与数据的内容,更多相关内容请关注PHP中文网(m.sbmmt.com)!