0

私はphpセキュリティに関する本を読んでいます.入力検証の章には、期待される入力のみを許可することについて説明する小さなセクションがあります.

これは彼らが示すコードです:

<?php
$expected = array( 'carModel', 'year', 'bodyStyle' );
foreach( $expected AS $key ) {
if ( !empty( $_POST[ $key ] ) ) {
${$key} = $_POST[ $key ];
}
else {
${$key} = NULL;
}
}
?>

コードの機能を説明する小さな段落があります。私が得たものは、配列の値をキーとして $_POST に割り当てます。また、配列はプログラムで GPC 配列からコピーする必要があるとも書かれています。

私が理解していないのは、これをどのような場合に使用する必要があるのですか? そして、GPC 配列とは何ですか?

4

3 に答える 3

1

GPC = Get Post Cookie。ユーザー/ブラウザーからの変数を参照しています。したがって、$_GET、$_POST、$_COOKIE を使用する代わりに、そのデータをクリーニングして、信頼でき、クリーンであることがわかっている変数に検証する必要があります。

提案に関しては、彼らがしていることは、コードがアクセスできるものを制限することです。上記のコード例では、carMODEl、year、および bodyStyle という名前の要素を含むフォームがページにあると思われます。ここでコードが行っていることは、これらの 3 つの要素のみと対話するようにコードを制限することです。

これにより、誰かがコードを挿入しようとしたり、ある種の SQL インジェクション攻撃やその他のさまざまなことを試みて、ページに余分なパラメーターを渡すことを防ぎます。このような単純な例では、意味がないかもしれません。しかし、フォーム/API リクエストを受け取って、GPC 配列の 1 つにあるすべてのものに対してループを実行し、そこにあるものを何でも処理している場合があります。最初からやらないことをお勧めします。

これは、サーバー/データベースを保護するための多くのことの 1 つにすぎません。Web アプリケーションを開発するときは、ユーザー側から来るものは何も信用しないというスタンスを取る必要があります。

セキュリティに関する限り、OWASP は学習の優れたソースです。これは、php 用に開発中の小さなチート シートです。

于 2013-04-05T17:49:30.023 に答える
0

また、配列は GPC 配列からプログラムでコピーする必要があるとも書かれています。

これは、必ずしも次のように書くべきではないことを意味する可能性があります。

$expected = array('carModel', 'year', 'bodyStyle');

むしろ次のように書きます。

$expected = getExpectedInput('carForm');

関数 getExpectInput が、フォーム「carForm」である必要がある入力についてデータベースにクエリを実行する場所。または、ファイル内にある可能性があり、この関数はそのコンテンツを取得します。基本的には、変数をフォームにハードコーディングするのは得策ではありません。むしろ、簡単に変更できるようにどこかに書いてください。フォームを変更して変数を追加したり、変数名を変更したことがある場合は、この特定のコードを変更する必要はありません。これは、この関数がさまざまなフォームで使用できることを意味します。アイデアは、再利用できる関数を書くことです。一つのことに専念する人ではありません。おっと。

getExpectedInput 関数は、おそらく配列を返します。これには好きな名前を付けるか、任意の方法を使用できます。

于 2013-04-05T17:54:17.727 に答える
0

このコードは、$_POST配列内のデータから変数を作成します。変数の名前は、$_POST配列のキーから取得されます。PHP はこれを変数変数と呼びます (つまり、変数に動的に名前を付けます) 。

$_POSTこれは通常、配列内に存在するキーを制御しないため、どの変数が作成されるかを制御できないため、悪い考えです。あなたのウェブサイトのユーザーがこれを制御します。悪意のあるユーザーは、別の目的で意図した変数を上書きするような方法で POST 変数に名前を付ける可能性があります。

この本は、制御された方法で配列内のキーが$_POST変数を上書きできるようにすることを提案しています。それがそのためです。このコードと次のコードは、変数、およびのみを作成します。たとえば、ユーザーがアプリケーションに投稿した場合、値が 1の変数は作成されません。$expected = array('carModel', 'year', 'bodyStyle')$carModel$year$bodyStylecurrent_user_has_admin_rights=1$current_user_has_admin_rights

私の提案は、変数変数から離れて、代わりに$_POST配列のみを介して POST 値にアクセスすることです。これにより、値がどこから来たのかが明確になり、そのような値が安全でない方法で処理されているかどうかを簡単に見つけることができます。

于 2013-04-05T17:49:31.840 に答える