Php 这行代码的意义是什么?

Php 这行代码的意义是什么?,php,virtuemart,Php,Virtuemart,我在administrator/components/com_Virtuemart/classes/ps_product.php的第2136行Joomla的Virtuemart插件中找到了这行代码 eval ("\$text_including_tax = \"$text_including_tax\";"); 它将字符串作为PHP代码进行计算 但它似乎使一个变量等于它自己?奇怪。我猜这是一种将$text\u include\u tax强制为字符串而不是数字的奇怪方式。也许是试图将变量强制转换

我在administrator/components/com_Virtuemart/classes/ps_product.php的第2136行Joomla的Virtuemart插件中找到了这行代码

eval ("\$text_including_tax = \"$text_including_tax\";");

它将字符串作为PHP代码进行计算


但它似乎使一个变量等于它自己?奇怪。

我猜这是一种将$text\u include\u tax强制为字符串而不是数字的奇怪方式。

也许是试图将变量强制转换为字符串?只是猜测。

不,它正在这样做:

$text\u包括税
=“扁平”。此代码计算以下行:

$flat=“flat”

这不一定很好,但我曾经使用过这样一种技术来吸取数组中的所有MySQL变量,如下所示:

    while ($row = mysql_fetch_assoc($result)) {
        $var = $row["Variable_name"];
        $$var = $row["Value"];
    }

此代码似乎不是将
$text\u include\u tax
强制为字符串的好方法

它不好的原因是,如果
$text\u包括税
可以包含用户输入的数据,则用户可能会执行任意代码

例如,如果
$text\u include\u tax
设置为等于:

"\"; readfile('/etc/passwd'); $_dummy = \"";
评估将变成:

eval("$text_include_tax = \"\"; readfile('/etc/passwd'); $_dummy =\"\";");
为恶意用户提供passwd文件的转储

更正确的方法是将变量强制转换为字符串:

$text_include_tax = (string) $text_include_tax;
甚至只是:

$text_include_tax = "$text_include_tax";

如果数据
$text\u include\u tax
只是一个内部变量或包含已验证的内容,则不存在安全风险。但是,将变量转换为字符串仍然是一种不好的方法,因为有更明显、更安全的方法可以做到这一点。

放弃我以前的答案

此eval()出现的原因如中所示

这就是正在发生的事情:

$text_including_tax = '$tax <a href="...">...</a>';

...

$tax = 10;

...

eval ("\$text_including_tax = \"$text_including_tax\";");
单引号可防止
$tax
包含在字符串的原始定义中。通过使用
eval()


我不喜欢这种方法,但它是正确的。另一种方法是使用
sprintf()

正如其他人所指出的,它是由不知道自己到底在做什么的人编写的代码

我还快速浏览了代码,发现在组合HTML/URI/等时完全没有文本转义。除了eval问题之外,这里可能还有很多注入孔,如果您愿意仔细检查的话


我不希望此代码在我的服务器上运行。

我以前已经查看过该代码库。这是我见过的最糟糕的PHP之一


我想你会做那种事来掩盖你在其他地方犯的错误。

你需要评估才能将税率计入产出。刚刚将其移动到新服务器,由于某种原因,此行导致服务器错误。作为快速修复,我将其更改为:

//eval ("\$text_including_tax = \"$text_including_tax\";");
$text_including_tax = str_replace('$tax', $tax, $text_including_tax);

有没有像($string)那样的($int)是($int)吗?是的,我相信有。还有一个是_string()。更简单的$text_include_tax=“$text_include_tax”可以做到这一点。那么为什么要eval呢?是的,eval()完全没有必要。它逃逸了第一个$text\u,使其不是$text\u,包括税的值。它仍然是$text\u,包括税='平',因为逃逸了第一个$text\u,包括税的出租车正要发布同样的东西。。。没有理由在PHP中使用eval()。在代码本身的上下文中,它看起来更奇怪$文本_include_tax是从常量$VM_LANG->_PHPSHOP_include_tax设置的,该常量定义为字符串。对我来说,似乎是巧合。事实上,我是正确的。实际原因在下面我的下一篇文章中。使用eval仍然很愚蠢。他们可以使用sprintf或许多不同的方法进行不同的编码。同意-有很多方法可以做得更好。在Joomla这样的大型公共项目中出现这种情况有点可怕。您可能会认为它至少使用了某种程度的最佳实践,但显然不是。幸好它是开源的,所以任何人都可以去任何地方修复它。(有人想做志愿者吗?)
//eval ("\$text_including_tax = \"$text_including_tax\";");
$text_including_tax = str_replace('$tax', $tax, $text_including_tax);