- ベストアンサー
ファイル内の危険な関数をチェックするスクリプトを作成したい
- PHPファイル内で危険な関数、非推奨になった関数が含まれているかをチェックするスクリプトを作成したい。
- php.iniにてdisable_functionsを使用する方法もありますが、対処が必要な場合に使用したいです。
- スマートに書く方法を知りたいです。ファイルに結果を整形して出力したいです。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
> ここでは例として、PHPの関数のみの質問として書かせていただきましたが、汎用性を考えております。 って事はやはりひっかけたい文字列は独自に定義するしかないって事ですかね? で、あれば言語ごとにひっかけるワードをどっかで定義する必要がありそう。 (てっとり早くテキストファイルとか) キーワード自体のチェックは別に今のままでよいんじゃないかと思います。 ただ、同じ行にひっかけたい関数が複数あると、二つ目以降が気付かれなくなっちゃうかも。 なので2重にループしてやる必要がありそうですね。 で、ひっかかった時に連想配列に「どのファイルに」「何行目」、「どの関数が」、「何個」って情報をセットしとけばいいんじゃないでしょうか? if ( isset ($array[ $funcName ]) ) { $array[ $funcName ]['length']++; $array[ $funcName ][ $array[ $funcName ]['length'] ] = array( 'fileName' => ファイル名, 'line' => 行番号 ); } else { $array[ $funcName ] = array( 'length' => 1, 0 => array( 'fileName' => ファイル名, 'line' => 行番号 ) ); } って感じの配列でも作って入れとけばよさそうな気がしますが・・・ あとは出来上がった配列をassignして、テンプレート側でforeachでもすりゃよさそうな気がします。
その他の回答 (1)
- 1minn
- ベストアンサー率57% (52/90)
コードの細かい部分は置いといて・・・ このやり方だと、ひっかけたい関数やらを自分で定義しなきゃいけないんですよね? あくまで非推奨なってる関数を・・・ って話ならあえてnoticeを吐き出させてそれを取得する仕組みを考えてみるのもいいのかな~と思いました。 ただ、chdirもsettypeも別に非推奨じゃないけど、これは「危険な関数」なんですか? 「chdir」「system」はコマンド実行につながるのでなんとなくわからなくもないんですが、settypeって危険なの? 「preg_match」は危険って意味もわからないし、非推奨でもない。 > php.iniにてdisable_functionsを使用すればいいのでしょうが、急に非推奨になったり、 > コード規約で省かれたりと言った時に対処するような場合に使用したいと思っております。 コード規約ってのは、内部ルールみたいなものでしょうから、分からなくはないんですが、「急に非推奨」ってのはどういう事でしょうか? 誰かが気がつかないうちにPHPのバージョンを変えたりするかな? > 自分としてはecho()で出力していくのではなく、「どの関数が、どの行に、いくつあるのか」を貯めていって、Smartyの変数にassign()で格納し出力といった感じにしたいと思っているのですが SmartyってCUIで使えるんですか?
お礼
>>1minnさん ここであげた関数は、ただの例です。 説明不足ですみません。 HITするかしないかだけに使いました。 自分が使っていたスクリプトの一部を使い、同じ行に複数HITする関数があるかを調べるためにsettypeなど入れました。 >SmartyってCUIで使えるんですか? これまた失礼しました。 CUIでは使えません。 字数を考えたり、急いで書いたせいか、説明を大幅に省いて書いてしまいました。 CUIの例文は動くかどうかの練習用でして、自分はディレクトリ全部を検索し、全てをあるファイルに「どこに何が・・・」とか格納し、そのファイルを読み込んで別のスクリプトによって表を・・・と考えていました。 例文の示し方と文章の説明がめちゃくちゃで申し訳ないです。 >誰かが気がつかないうちにPHPのバージョンを変えたりするかな? バージョンが上がった際にテスト環境を作り、その際エラー等が出たり、非推奨になった関数をって意味でした。 PHPなく、Smartyにせよフレームワークにせよ、特定の関数、定数などを検索したいと思いまして。 Smartyを例に挙げると、2と3では結構変わってる部分もありますので、それをテンプレート、Smartyのライブラリを含めてと思っています。 sedとかでもいいのですが、自分がPHPの方が書きやすいのでこちらにしました。 ここでは例として、PHPの関数のみの質問として書かせていただきましたが、汎用性を考えております。 文章の説明が悪くて本当に申し訳ないです。
お礼
ありがとうございます。 参考になりました。 一応、もうちょっと自分で試行錯誤してみます。