这行代码有什么意义?

时间:2009-01-16 01:14:54

标签: php virtuemart

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

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

9 个答案:

答案 0 :(得分:9)

废弃我之前的回答。

此eval()的位置显示在php eval docs

这就是发生的事情:

$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(),它强制它重新评估字符串并在字符串中包含$tax的值。

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

答案 1 :(得分:4)

这段代码似乎是迫使$text_including_tax成为字符串的坏方法。

错误的原因是因为如果 $text_including_tax可以包含用户输入的数据,那么他们就可以执行任意代码。

例如,如果$text_include_tax设置为相等:

"\"; readfile('/etc/passwd'); $_dummy = \"";

eval将成为:

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

答案 2 :(得分:2)

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

答案 3 :(得分:1)

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

答案 4 :(得分:1)

您需要使用eval将税率纳入输出。刚将此移动到新服务器,由于某种原因,此行导致服务器错误。作为快速解决方案,我将其更改为:

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

答案 5 :(得分:0)

它正在将字符串作为PHP代码进行评估。

但它似乎使变量等于自己?怪异。

答案 6 :(得分:0)

正如其他人所指出的那样,它是由一个不知道他们在做什么的人写的代码。

我还快速浏览了代码,以便在放置HTML / URI /等时发现完全没有文本转义。一起。除了eval问题之外,这里可能还有许多注入漏洞,如果您可能需要进行正确的审计。

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

答案 7 :(得分:0)

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

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

答案 8 :(得分:-4)

不,它正在这样做:

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

$ flat =“flat”;

它不一定好,但是我确实使用过这样的技术来吸取像这样的数组中的所有MySQL变量:

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