6

私は最近、いくつかのphpソースコード、特にphpbbやesotalkなどのフォーラムソフトウェアを閲覧していました。

私は1つのことに気づきました。それらのほとんどは、次のような何らかのセキュリティとして、ページの先頭でグローバル変数を使用していました。

if (!defined("IN_ESOTALK")) exit; //For esotalk
if (!defined("IN_PHPBB")) exit; //FOR phpbb

これはどのようなセキュリティですか?理解できない。これが何をどのように防ぐのか説明してもらえますか?

ありがとう、Vidhu

4

3 に答える 3

7

フレームワークが起動しない限り、phpスクリプトが実行されないようにすることで機能します。このように、ユーザーは適切なページを経由せずにスクリプトを実行することはできません。

これが例です。2つのファイルがあります:

index.php

<?php
     define("_MY_FRAMEWORK", 1);
     echo 'started';
     require('script.php');
?>

およびscript.php

<?php
    if (!defined("_MY_FRAMEWORK")) exit;
    echo "my script";
?>

script.phpを直接実行すると、_MY_FRAMEWORK定義されていないため何も起こりません。終了します。

ただし、script.phpを含むindex.phpを実行すると、_MY_FRAMEWORK最初に定義したため、スクリプトは続行されます。完全な出力が得られます:startedその後にmy script

@Gumboは良い点を示しています。defineをこれまでに見たことがない場合は、変更できない定数を定義します。PHPドキュメントへのユーザーの貢献は、それがどのように機能するかを理解するのに役立ちます。

于 2013-01-01T21:59:45.827 に答える
1

これにより、register_globalsを使用した変数の操作も防止されます。

php.iniでregister_globalsが有効になっている場合、ユーザーはURLの変数を変更することでスクリプト内の変数を変更できますが、これでは、define関数を使用して定義された定数変数の値を変更できません。

于 2013-01-01T22:02:30.770 に答える
1

これらはグローバル定数です。これらを使用して、ソフトウェアが意図したとおりに実行されていることを確認します。

于 2013-01-01T22:05:17.260 に答える