3

我在管理员/组件/com_virtuemart/classes/ps_product.php 的第 2136 行的 Joomla 的 Virtuemart 插件中找到了这行代码

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

9 回答 9

9

废掉我之前的回答。

这个 eval() 在这里的原因显示在php eval 文档中

这就是正在发生的事情:

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

...

$tax = 10;

...

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

最后$text_including_tax等于:

"10 <a href="...">...</a>"

单引号防止$tax包含在字符串的原始定义中。通过使用eval()它强制它重新评估字符串并在字符串中包含 for 的值$tax

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

于 2009-01-16T02:10:58.277 回答
4

这段代码似乎是强制$text_including_tax成为字符串的不好方法。

它不好的原因是因为如果 $text_including_tax可以包含用户输入的数据,他们就有可能执行任意代码。

例如,如果$text_include_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_include_tax只是一个内部变量或包含已验证的内容,则不存在安全风险。但是将变量转换为字符串仍然是一种不好的方法,因为有更明显和更安全的方法可以做到这一点。

于 2009-01-16T01:52:00.060 回答
2

我猜这是强制 $text_including_tax 成为字符串而不是数字的一种时髦方式。

于 2009-01-16T01:18:46.447 回答
1

也许这是尝试将变量转换为字符串?只是一个猜测。

于 2009-01-16T01:20:15.367 回答
1

您将需要评估才能将税率纳入输出。刚把它移到一个新的服务器上,由于某种原因,这条线导致了服务器错误。作为快速修复,我将其更改为:

//eval ("\$text_including_tax = \"$text_including_tax\";");
$text_including_tax = str_replace('$tax', $tax, $text_including_tax);
于 2012-01-19T18:09:17.873 回答
0

它将字符串评估为 PHP 代码。

但它似乎使变量本身等于?奇怪的。

于 2009-01-16T01:18:29.787 回答
0

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

我还快速浏览了代码,发现在放置 HTML/URIs/etc 时完全没有文本转义。一起。除了 eval 问题之外,这里可能还有许多注入漏洞,如果您不屑于对其进行正确审计的话。

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

于 2009-01-16T02:21:09.050 回答
0

我以前看过那个代码库。这是我见过的最糟糕的 PHP 之一。

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

于 2009-12-14T14:30:53.337 回答
-4

不,它正在这样做:

$text_including_tax=“平”。此代码评估以下行:

$平=“平”;

这不一定很好,但我确实使用过一次这样的技术来吸收数组中的所有 MySQL 变量,如下所示:

    while ($row = mysql_fetch_assoc($result)) {
        $var = $row["Variable_name"];
        $$var = $row["Value"];
    }
于 2009-01-16T01:28:10.373 回答