プロが教える店舗&オフィスのセキュリティ対策術

aaa.php、bbb.php、ccc.php、・・・・
と、複数のソースファイルが存在します。
その間で、共通に値を保持でき、また、どのソース内でも代入で入れ替えることができる変数ってありますか?
global変数って、同phpファイル内で、function間での保持のみですよね?

ちなみに、使用しているPHP Versionは 4.4.2です。
よろしくお願い致します。

A 回答 (5件)

がるです。

質問を織り交ぜつつ。
> アクセスするユーザー(2種類)によって、表示するメニューを切り替えてくれというものです。
これはまぁ極めてよくある処理かと思われます。

> しかし、ユーザーを認識する何らかの値が渡されるわけではありません。
これは、依頼者からの希望なのでしょうか? 基本的にはこういう振り分けにはCookie(ないしより望ましい回答としてはPOST メソッド)での、セッションID(或いはセッションIDを含む文字列を暗号化したもの。私はこっちを勧めます)を用いるものなのですが。

> Aユーザーには、index_a.phpをアクセスさせ、Bユーザーには、index_b.phpをアクセスしてさせるということで要望されました。
これは、もし「ユーザBがindex_a.phpを手で入力すればアクセスできてしまう」可能性が高いのですが、それはそれでよいんでしょうか? 必要に応じて、依頼者に確認すべきかと。

> 表示メニューのオン・オフは、config.php内での変数に1か0の値の代入で行っているのですが、config.phpはindex.phpだけでなく、すべてのphpソースの先頭でincludeしているので、2種類のindex.phpを作っても、同じconfig.phpを呼んでしまいます。
まずconfig.phpの作りにもよるんでしょうが。もしかして「ベタで書いてあるからincludeしたらいきなり走る」つくりになってませんか?
まずは関数(ないしより好ましい状態としてはclass)での実装にかえるべきです。
で、例えば

index_a.php の行頭
require_once("config.php");
$conf_obj = new config;
$conf_obj->set_flg(0);
$conf_obj->run();

index_b.php の行頭
require_once("config.php");
$conf_obj = new config;
$conf_obj->set_flg(1);
$conf_obj->run();

という風におこなえば、十分に可能だと思うのですが。

ちなみに#4さんの回答にある「多言語からのセッション情報の引継ぎ」ですが。
基本的にセッションは、ほとんどCookieで扱っているのが通例です。ただどういった実装をするかは色々とありますので、そのあたりは上位のプログラムの仕様書をチェックするなりすべきかと思われます。

最後に。個人的見解で恐縮ですが。各種セキュリティ上の脆弱性その他が指摘されているので、PHP標準のセッション関数はあまりお勧めできません。
ご利用は自己責任の下に計画的に、って感じでしょうか。

この回答への補足

> これは、もし「ユーザBがindex_a.phpを手で入力すればアクセスできてしまう」可能性が高いのですが、それはそれでよいんでしょうか? 必要に応じて、依頼者に確認すべきかと。
はい、これについては、完全とは言えませんが、ある程度想像できないindex名(例えば、ad_index_minxxxyyy.phpとか)で考えております。
「ご利用は自己責任・・・」の部分にも関連するかもしれないのですが、社内イントラ内での使用なので、使用者はすべて社内の人となります。
したがって、万一、BユーザーがAユーザーに入ったとしても、重大な問題というわけではありません。

> まずconfig.phpの作りにもよるんでしょうが。もしかして「ベタで書いてあるからincludeしたらいきなり走る」つくりになってませんか?
はい、まったくそのとおりです。すいません。
主にはメニューのオンオフなどのフラグを立てているくらいです。

classの手法を用いたことがないので、classに関して知識が乏しいです。
したがって、
index_a.php の行頭
require_once("config.php");
$conf_obj = new config;
$conf_obj->set_flg(0);
$conf_obj->run();

index_b.php の行頭
require_once("config.php");
$conf_obj = new config;
$conf_obj->set_flg(1);
$conf_obj->run();
について、もう少し詳しくご説明いただけると、非常に助かります。
できれば、classの手法にチャレンジしてみたいと思いますので。
ただ、社内納期が一応、明日3/15までと言われているので、私でどこまで出来るかが問題なのですが・・

「多言語からのセッション情報の引継ぎ」ですが、上位のプログラム仕様書というものが存在しません。
社内システムなので、設計も特になくて、PGのセンス任せでやらされているわけです。
私は通常PGの業務ではないのですが、過去に他社でPG経験があるということで、
サイトのある部分の機能の作り込みについて、助っ人として任されているのです。

このような背景ですが、ご理解いただけると幸いです。
また、お手数でなければ、さらにご教授いただけると助かります。
m(_"_)m

補足日時:2006/03/14 15:40
    • good
    • 0
この回答へのお礼

PHPのセッション関数と、クッキー関数までは試すことができましたが、クラスまでに手が届きませんでした。
でも、勉強になりました。
どうもありがとうございました。

お礼日時:2006/03/15 17:59

難しいことを考えるよりセッションを勉強したほうがはるかに楽ですよ。



何も難しくありません。

全てのソースの先頭でsession_start()呼んで、
使いたいセッション変数に値を入れておけば、どのPHPに遷移しても値の参照、代入ができます。

この回答への補足

そうすると上位でログインされた、ユーザー情報を当方のPHPから見に行かないといけないように思うのですが・・
以下は、上位で行われているセッション処理の部分で、管理者の場合の処理でメールの書き込みが可能か判断する部分です。
(rubyかpealでコーディングしてると思われる。PHPではない。)
このセッション情報(ユーザID?)を取得して、PHPで処理させないといけないように思うのですが・・・どうでしょう?

<% if ! User.find(@session[:user].id).is_comu? %>
<%= link_to image_tag('msg20.gif', :border => 0)+'メール作成を行う', :action => 'new' %>
<% end %>

補足日時:2006/03/14 09:24
    • good
    • 0
この回答へのお礼

PHPのセッション関数もクッキー関数も試してみました。
しかし、javascriptのonclickで、変数の値を入れ替えるように記述しているので、マウスクリックしていないのにブラウザ表示しただけで一番最後のonclickの値が代入されてしまいます。
どうやら、javascriptがセットされる時点で、変数に代入されてしまうようでダメでした。
どうもありがとうございました。

お礼日時:2006/03/15 17:58

データの受渡しをしたいだけならGETやPOSTでも


できます。

この回答への補足

ありがとうございます。
GETやPOSTの存在も知っているのですが、未熟な上あまり使ったことがなく、具体的な手法が思い浮かばなくて・・

補足日時:2006/03/13 18:40
    • good
    • 0
この回答へのお礼

どうもありがとうございました。

お礼日時:2006/03/15 17:56

がると申します。


Global変数でもよく言われる話なのですが。「どのソース内でも代入で入れ替えることができる変数」が必要なのは、失礼ながら、多分設計自体にミスがあるのではないかと。
データは原則的に「局所にまとめる」ほうがよいです。
そのあたりはPHPに限らず色々なプログラムで応用がきくので、一度しっかりと履修されることをお勧めいたします。

この回答への補足

ありがとうございます。
当初の設計とは違う、別の要件が今頃になって指定されました。
アクセスするユーザー(2種類)によって、表示するメニューを切り替えてくれというものです。
しかし、ユーザーを認識する何らかの値が渡されるわけではありません。
Aユーザーには、index_a.phpをアクセスさせ、Bユーザーには、index_b.phpをアクセスしてさせるということで要望されました。
表示メニューのオン・オフは、config.php内での変数に1か0の値の代入で行っているのですが、config.phpはindex.phpだけでなく、すべてのphpソースの先頭でincludeしているので、2種類のindex.phpを作っても、同じconfig.phpを呼んでしまいます。
ユーザーを識別する引数を、上からもらえるなら、config.phpを2種類用意して判定で切り替えられるのですが、2種類のindex.phpでという方法では困難を極めています。
そこで、全ソースで値を保持できる変数が使えれば、その変数にindex_a.phpにアクセスされた場合には“0”、index_b.phpにアクセスされた場合は“1”というようにフラグセットし、他のソースからそのフラグ見て、2酢類のconfig.phpのどちらをincludeさせるか判定できると考えています。

他に良い方法があればいいのですが・・・そのようなわけです。

補足日時:2006/03/13 18:39
    • good
    • 0
この回答へのお礼

どうもありがとうございました。

お礼日時:2006/03/15 17:56

そんな場合はperlであればクッキーを使用しますが、PHPでもクッキーでも可能ですがセッション関数が使えます。


調べてみて下さい。

この回答への補足

ありがとうございます。
セッション関数というのが使えるということは、
ネット上でも見ました。
ただ、具体的にどのように使うのか、理解できていません。
調べてはみたいとは思います。

補足日時:2006/03/13 18:21
    • good
    • 0
この回答へのお礼

PHPのセッション関数もクッキー関数も試しました。
javascriptのonclickで、変数の値を入れ替えるように記述しているのですが、マウスクリックもしていないのにブラウザ表示しただけで一番最後のonclickの値が代入されてしまいます。
どうやら、javascriptがセットされる時点で、すでに代入されてしまうようでダメでした。
どうもありがとうございました。

お礼日時:2006/03/15 17:55

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!