グローバル変数への登録を使用
セキュリティを向上させるために使用可能なPHPの機能の一つは、
PHPでregister_globals = offを指定して設定を行なうことです。
ユーザが投稿した変数が全てPHPコードに導入されるこの機能を
オフにすることにより、潜在的な攻撃者が攻撃できる変数の数を
減らすことが可能となります。これにより、投稿を作成するため
により多くの時間を要し、内部変数はユーザにより投稿されたデ
ータから効率的に隔離することが可能となります。
この場合、PHPで動作させるために必要なコードの量は若干増加
しますが、その利益は努力を上回ると議論されています。
例 5-14register_globals=offを指定しない場合の動作 <?php
if ($username) { // get/post/cookiesで上書きされる可能性がある
$good_login = 1;
}
if ($good_login == 1) { // get/post/cookiesで上書きされる可能性がある
fpassthru ("/highly/sensitive/data/index.html");
}
?> |
|
例 5-15register_globals = offを指定した場合の動作 <?php
if($HTTP_COOKIE_VARS['username']){
// クッキーから来るもののみ
$good_login = 1;
fpassthru ("/highly/sensitive/data/index.html");
}
?> |
|
これを賢く使用することにより、偽の入力が試みされた際に警告を
発生する防止策をとることさえ可能になります。変数が入力される
場所を事前に正しく知っている場合、投稿されたデータが適当な場
所からのものであるかを調べることが可能です。これは、データが
偽造されていないことを保証するものではありませんが、攻撃者に
正しい偽造の方法を推定することを強いることになります。
例 5-16簡単な変数の汚染の有無の検出 <?php
if ($HTTP_COOKIE_VARS['username'] &&
!$HTTP_POST_VARS['username'] &&
!$HTTP_GET_VARS['username'] ) {
// ユーザ名を認証する他の手段を実行する
$good_login = 1;
fpassthru ("/highly/sensitive/data/index.html");
} else {
mail("admin@example.com", "侵入が試みられました", $HTTP_SERVER_VARS['REMOTE_ADDR']);
echo "管理者による警告:セキュリティ違反です。";
exit;
}
?> |
|
もちろん、register_globalsをoffに変えただけでは、コードが安全である
ことを意味しません。投稿されたデータのあらゆる部分について、他の
手段でも確認する必要がありません。