2010-12-28 10 views
0

私は関数の名前を2番目の引数として受け取ることができる関数を記述しようとしています。関数の名前を検証するために 私のようなfunction_existsを使用する(つまりはevalの文で使用されます):function_exists php

if(function_exists($type)){ 
    $toEval= $type.'(\''.$file.'\');'; 
    }else{ 

しかし、送られたargは(含めるか(とバリエーション「一度」)このコードは失敗し必要であればfunction_existsはfalseを返します)。

+0

Eval is evil ... – Mironor

+0

ここではEvalは必要ない場合があります。 '$ type($ file);'も同様に動作します。しかし、@CommanderZが述べているように、この全部が設計上の瑕疵を示す可能性があります。 –

答えて

2

私はあなたのアプリケーションが本当にうまく設計されているかどうかを考えるべきだと思います。この種のコードでは、全体的な設計に何か問題があることがよくあります。あなたはまた、そのようなメソッドに渡すものに非常に注意する必要があります。非常に重大なセキュリティ上の問題が発生する可能性があります。

if($type == 'require' || $type == 'require_once' || .. || function_exists($type)){} 

またはそれ以上

$constructs = array('include', 'require', ...); 
if(in_array($type, $constructs) || function_exists($type)){}; 
+0

セキュリティ上の問題は考えられませんが、2番目のスニペットでは非常にうまくいくと思います。 – Mark

+0

誰かが何らかの形で$ typeパラメータを操作する危険性があります。その結果、サーバ上で任意のコードが実行される可能性があります。 –

1

includerequireおよびその他のコール数は、言語構造、いない機能です。

これらは手動で確認する必要があります。

これらのリストについては、this manual pageを参照してください。

関連する問題