$username = $_POST['username']
$password = $_POST['password']; / ユーザー名とパスワードを確認してください
if ($username != $authuser または $password != $authpass):
を入力してくださいユーザー名とパスワード:
endif;
コードをコピーします
コードは次のとおりです:
authorize_user( 「ケビン」、「秘密」
;
とてもシンプルで明確ですよね。ここで、自分の目と経験をテストしてみましょう。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 ' および $password == 'secret')
{
$authorized = true;
?>?php if (!$authorized): ?> !-- ユーザーにログインを促す HTML フォームを表示します -->
そして、最初のプログラムと同様に、このプログラムにもセキュリティ上の脆弱性があり、URL の末尾に ?authorized=1 を追加すると、セキュリティ対策を回避してページのコンテンツに直接アクセスできます。開発者は $authorized をセッション変数として扱い、同じ変数がユーザー入力によって簡単に設定できることを無視できます。
特別な配列 (PHP 4.1) を追加し、register_globals (PHP 4.2) をオフにすると、プログラムは次のようになります:
コードをコピー