我在管理员/组件/com_virtuemart/classes/ps_product.php 的第 2136 行的 Joomla 的 Virtuemart 插件中找到了这行代码
eval ("\$text_including_tax = \"$text_including_tax\";");
我在管理员/组件/com_virtuemart/classes/ps_product.php 的第 2136 行的 Joomla 的 Virtuemart 插件中找到了这行代码
eval ("\$text_including_tax = \"$text_including_tax\";");
废掉我之前的回答。
这个 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()
这段代码似乎是强制$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
只是一个内部变量或包含已验证的内容,则不存在安全风险。但是将变量转换为字符串仍然是一种不好的方法,因为有更明显和更安全的方法可以做到这一点。
我猜这是强制 $text_including_tax 成为字符串而不是数字的一种时髦方式。
也许这是尝试将变量转换为字符串?只是一个猜测。
您将需要评估才能将税率纳入输出。刚把它移到一个新的服务器上,由于某种原因,这条线导致了服务器错误。作为快速修复,我将其更改为:
//eval ("\$text_including_tax = \"$text_including_tax\";");
$text_including_tax = str_replace('$tax', $tax, $text_including_tax);
它将字符串评估为 PHP 代码。
但它似乎使变量本身等于?奇怪的。
正如其他人所指出的,这是由不知道自己在做什么的人编写的代码。
我还快速浏览了代码,发现在放置 HTML/URIs/etc 时完全没有文本转义。一起。除了 eval 问题之外,这里可能还有许多注入漏洞,如果您不屑于对其进行正确审计的话。
我不希望这段代码在我的服务器上运行。
我以前看过那个代码库。这是我见过的最糟糕的 PHP 之一。
我想你会做那种事情来掩盖你在其他地方犯的错误。
不,它正在这样做:
说$text_including_tax
=“平”。此代码评估以下行:
$平=“平”;
这不一定很好,但我确实使用过一次这样的技术来吸收数组中的所有 MySQL 变量,如下所示:
while ($row = mysql_fetch_assoc($result)) {
$var = $row["Variable_name"];
$$var = $row["Value"];
}