セキュリティ|スクリプト
原著: Kevin Yank 転載元: www.linuxforum.net (再び開設おめでとうございます)
長い間、サーバーサイド スクリプト言語としての PHP の最大のセールス ポイントの 1 つは、グローバルなスクリプト言語を自動的に作成することでした。フォームから送信された値の変数。 PHP 4.1 では、PHP 作成者は送信されたデータにアクセスする代替手段を推奨しました。 PHP 4.2 では、その古い慣行が廃止されました。この記事で説明するように、このような変更を行う目的はセキュリティ上の理由です。 PHP がフォーム送信やその他のデータを処理する新しい方法を見て、そうすることでコードの安全性が高まる理由を説明します。
ここで何が問題ですか?
次の PHP スクリプトを見てください。これは、入力されたユーザー名とパスワードが正しい場合に Web ページへのアクセスを承認するために使用されます:
// ユーザー名とパスワードを確認します
if ($username == ' kevin' $password == 'secret')
$authorized = true;
;
ユーザー名とパスワードを入力してください:
フォーム action="=$PHP_SELF?> ;input type="text" name="ユーザー名" />
パスワード:
type="submit" />
ユーザー名とパスワードを入力してください:
ユーザー名とパスワードを入力してください:
;?=$PHP_SELF?>" method="POST">ユーザー名:
パスワード: < input type="password" name="password" />
exit ();
}
?>
authorize_user( 'kevin','secret'); ?>
とてもシンプルでわかりやすいですね。ここで、自分の目と経験をテストしてみましょう。authorize_user 関数に何が欠けているのでしょうか?
$_POST は関数内でグローバル変数として宣言されていません! php 4.0 では、 register_globals がオンになっている場合、関数内で $username 変数と $password 変数を取得するコード行を追加する必要があります:
function authorize_user($authuser, $authpass)
{
global $username, $password ;
.. .
PHP では、同様の構文を持つ他の言語とは異なり、関数の外部にある変数は、グローバル スコープからのものであることを指定するために、上で説明したように行を追加する必要があります。
PHP 4.0 では、セキュリティを提供するために register_globals がオフになっている場合、$HTTP_POST_VARS 配列を使用してフォームによって送信された値を取得できますが、この配列をグローバル スコープからインポートする必要があります:
function authorize_user($ authuser, $authpass )
{
global $HTTP_POST_VARS;
$username = $HTTP_POST_VARS['username'];
ただし、PHP 4.1 以降のバージョンでは、特別な $_POST 変数が使用されます。 (および上記の他の変数) はすべてのスコープで使用できます。これが、関数内で $_POST 変数をグローバル変数として宣言する必要がない理由です。
function authorize_user($authuser, $authpass)
{
$username = $_POST['username'];
$password = $ _POST[' パスワード'];
これはセッションにどのような影響を与えますか?
特別な $_SESSION 配列の導入は、実際にセッション コードを簡素化するのに役立ちます。セッション変数をグローバル変数として宣言し、どの変数が登録されているかを追跡する代わりに、$_SESSION['varname'] からすべてのセッション変数を簡単に参照できるようになりました。
次に、ユーザー認証の別の例を見てみましょう。今回は、セッションを使用して、サイトに滞在し続けるユーザーが認証されたことを示します。まず、PHP バージョン 4.0 (register_globals が有効) を見てみましょう:
session_start();
if ($username == 'kevin' and $password == 'secret')
{
$authorized = true ;
session_register('authorized');
?>
URL の最後に ?authorized=1 を追加すると、セキュリティ対策を回避してページのコンテンツに直接アクセスできます。開発者は $authorized をセッション変数として扱い、同じ変数がユーザー入力によって簡単に設定できることを無視できます。
特別な配列 (PHP 4.1) を追加し、 register_globals (PHP 4.2) をオフにすると、プログラムは次のようになります:
session_start()
if ($username == 'kevin ' and $password == 'secret')
$_SESSION['authorized'] = true;
ユーザーにログインを促すフォーム -->
もっと簡単じゃないですか?通常の変数をセッション変数として登録する必要はなくなり、セッション変数を直接 ($_SESSION 配列内で) 設定し、同じ方法で使用するだけで済みます。プログラムが短くなり、どの変数がセッション変数であるかについて混乱が少なくなります。
まとめ
この記事では、PHP スクリプト言語の変更の根本的な理由について説明しました。 PHP 4.1 では、外部データにアクセスするために特別なデータ セットが追加されました。これらの配列は任意のスコープで呼び出すことができるため、外部データへのアクセスがより便利になります。 PHP 4.2 では、経験の浅い開発者が安全でない PHP コードを作成することを避けるために、これらの配列の使用を奨励するために、 register_globals はデフォルトでオフになっています。
--------------------
皆さんのお役に立つと思います〜