2012-02-25 9 views
0

eval()の代替案を見つけることはよくある話ですが、私はこれまでにやっていないことをやろうとしています。私は既知の形式のCSVファイルを処理しています。利用可能なソース列に応じてデータをどのように処理するかに関するルールを作成しました。PHPのルールを処理する代わりのeval?

ここに私がしていることの単純化された例があります。この例では、$linedataはCSVファイルからの1行のデータを表します。 $key["type"]私はデータが必要な列を指しています。この列に「IN」の値が入っている場合は、$newcolを「個人」に設定し、そうでない場合は「組織」に設定します。

$key["type"] = 12; 
$linedata[12] = 'IN'; 
$rule = '($linedata[($key["type"])] == "IN" ? "individual" : "organization");'; 
eval ('$newcol = ' . $rule); 

したがって、$ruleはロジックを格納します。 $linedataアレイのフィルタを実行して、CSVファイルから悪意のあるコードが漏れないようにすることができますが、このようなルールを格納して処理するより良い方法があるのだろうか?

+0

ルールの作成場所はわかりません。あなたはcsvファイルから得たPHPコードを評価しようとしていますか、あるいはあなたの処理コードで定義されているルールですか?ルールが処理コードで定義されている場合は、関数を使用するだけです。 –

+0

実際には、データのスニペットと処理された出力を確認するのに役立ちます。あなたがしようとしているのはマッピングなので、そのための 'eval'は必要ありません。 – netcoder

+0

@netcoder - はい、私はマッピングをしようとしていますが、問題はCSVファイルが常に同じ順序で列を持つとは限りません(キーを定義する理由です)。回答はまだ目標に達していないので、質問を編集してより明確にします。 –

答えて

2

CSVファイルに任意のPHPを保存することはできず、eval(または同様の機能)を呼び出すことなく機能するとは限りません。

あなたが求めていることを行う安全な方法は、ファイルではなく、データとしてください。

これは、BBCodeのような言語が存在する理由です。不活性な言語でアクティブな機能を直接起動することはできないため、わかりやすいミニスクリプト言語を作成して、目的を達成できます。

言い換えれば、アクティブな "ルール"を何らかの形で解釈せずにファイルに保存することはできません。また、それらに同時に任意のPHPが含まれていて安全であることを許可することはできません。だから、PHPを解析したり制限したりすることができます(難しいことではありません!)か、簡単な小さな言語を与えて解釈することができます。あるいは、データファイルにロジックを保存しない方が良いでしょう。

+0

答えをありがとう、ちょうどルールが自分のコードに格納されていることを確認する - CSVではありません。 CSVファイルは、データの構造に応じて異なる処理が必要な単なるデータです。私は問題を複雑に過ぎていると思うが、明日の私の質問を更新するだろう。 –

+0

私はこの質問にどのように不満を抱いているかを考慮して、これが最良の答えだと思います。私の場合、論理を完全に回避するために論理を一連のswitch文に完全に変更しました。 –

0

私はが間違ったでした。


私が間違っている可能性があり、しかしcreate_functionは十分かもしれません。

http://www.php.net/manual/en/function.create-function.php

+0

'create_function'は' eval'よりもはるかに優れています。 – Borealid

+0

@Borealidあなたは正しいです。文字列 'GLOBALS'を作成し、' $$ 'を使う方法があまりありません... – Michas

+0

@Borealidなぜそれは安全ですか? PHP Manual: '注意 create_function()関数は、内部的にeval()を実行するため、eval()と同じセキュリティ問題があります。 ' –

関連する問題