我在管理员/ components / com_virtuemart / classes / ps_product.php中的第2136行的Joomla的Virtuemart插件中找到了这行代码
eval ("\$text_including_tax = \"$text_including_tax\";");
答案 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"];
}