评估PHP中处理规则的替代方案?

评估PHP中处理规则的替代方案?,php,eval,Php,Eval,我知道找到eval()的替代品是一个常见的话题,但我正在尝试做一些我以前从未做过的事情。我正在处理已知格式的CSV文件,并且我已经根据可用的源列建立了如何处理数据的规则 下面是我正在做的一个简单的例子。在本例中,$linedata表示CSV文件中的一行数据$key[“type”]指向我需要从中获取数据的列。如果此列包含“IN”的值,我希望$newcol设置为“个人”,否则设置为“组织” 因此,$rule存储逻辑。我可以在$linedata数组上运行一个过滤器,以尝试防止来自CSV文件的恶意代码,

我知道找到
eval()
的替代品是一个常见的话题,但我正在尝试做一些我以前从未做过的事情。我正在处理已知格式的CSV文件,并且我已经根据可用的源列建立了如何处理数据的规则

下面是我正在做的一个简单的例子。在本例中,
$linedata
表示CSV文件中的一行数据
$key[“type”]
指向我需要从中获取数据的列。如果此列包含“IN”的值,我希望
$newcol
设置为“个人”,否则设置为“组织”


因此,
$rule
存储逻辑。我可以在
$linedata
数组上运行一个过滤器,以尝试防止来自CSV文件的恶意代码,但我想知道是否有更好的方法来存储和处理这样的规则?

您不能在CSV文件中存储任意PHP,然后期望它在不调用
eval
(或类似功能)的情况下工作

执行您要求的操作的安全方法是将文件视为数据,而不是代码

这就是为什么像BBCode这样的语言存在的原因:您不能让惰性语言直接触发活动特性,所以您可以创建一种易于解释的迷你脚本语言,让您实现您想要的


换句话说,如果不以某种方式解释活动的“规则”,就不能将其存储在文件中,并且不能同时允许它们包含任意PHP和“安全”。因此,您可以尝试解析和限制PHP(不要,这很难!),也可以为它们提供一种简单的语言,并对其进行解释。或者,更好的是,不要将逻辑存储在数据文件中。

我错了


我可能错了,但是
create\u函数
可能足够好了


我不清楚规则是在哪里制定的。您是在尝试评估从csv文件获得的php代码,还是在处理代码中定义了规则?如果规则是在处理代码中定义的,为什么不使用函数呢?实际上,查看数据片段和处理后的输出会有所帮助。看起来您要做的只是映射,而不需要使用
eval
。@netcoder-是的,我正在尝试进行映射,但问题是CSV文件的列顺序并不总是相同(这就是为什么我必须定义键的原因)。我将编辑这个问题以使其更加清晰,因为答案还没有达到目标。@FrancisAvila-规则会根据CSV文件的来源而变化,这些文件有几种不同的格式。我越是考虑这个问题(睡眠不足,在提问之前应该考虑得更多),我就越觉得你是对的,我只需要一系列条件来描述数据。睡觉后,我会看看是否需要进一步澄清这个问题。:)
create_函数
几乎不比
eval
好多少@Borealid你说得对。创建字符串
GLOBALS
和使用
$$
的方法太多了。@Borealid为什么更安全?来自PHP手册:
Caution create_function()函数在内部执行eval(),因此具有与eval()相同的安全问题
@IliaRostovtsev在这个上下文中,“几乎”一词的意思是“不重要”。谢谢你的回答,只是为了澄清规则存储在我的代码中,而不是CSV中。CSV文件只是需要根据数据的结构进行不同处理的数据。不过,我认为我把问题复杂化了,明天会更新我的问题。考虑到我问的问题有多糟糕,我认为这是最好的答案。在我的例子中,我将逻辑完全更改为一系列switch语句,以完全避免eval。
$key["type"] = 12;
$linedata[12] = 'IN';
$rule = '($linedata[($key["type"])] == "IN" ? "individual" : "organization");';
eval ('$newcol = ' . $rule);