代码之家  ›  专栏  ›  技术社区  ›  mk.

这行代码的意义是什么?

  •  3
  • mk.  · 技术社区  · 16 年前

    我在joomla的virtuemart插件中的administrator/components/com_virtuemart/classes/ps_product.php第2136行找到了这行代码。

    eval ("\$text_including_tax = \"$text_including_tax\";");
    
    9 回复  |  直到 12 年前
        1
  •  9
  •   Dan Russell    12 年前

    放弃我以前的回答。

    此处显示此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() 它强制它重新评估字符串并包括 税金 在字符串中。

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

        2
  •  4
  •   calebbrown    16 年前

    这段代码似乎是一种不好的强制方式 $text_including_tax 做一个字符串。

    不好的原因是 如果 $TEXT\含税 可以包含用户输入的数据,用户可以执行任意代码。

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

        3
  •  2
  •   Andru Luvisi    16 年前

    我猜这是一种让包括税在内的$TEXT_成为字符串而不是数字的奇怪方式。

        4
  •  1
  •   Tim Lytle    16 年前

    可能是试图将变量强制转换为字符串?只是猜测而已。

        5
  •  1
  •   sjngm quinti    13 年前

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

    //eval ("\$text_including_tax = \"$text_including_tax\";");
    $text_including_tax = str_replace('$tax', $tax, $text_including_tax);
    
        6
  •  0
  •   alex    16 年前

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

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

        7
  •  0
  •   bobince    16 年前

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

    我还快速浏览了代码,发现在将html/uris/etc放在一起时完全没有文本转义。除了评估问题之外,这里可能还有许多注入孔,如果您能费心审核的话。

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

        8
  •  0
  •   Rimian    15 年前

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

    我想你会这样做来掩盖你在其他地方犯下的错误。

        9
  •  -4
  •   Mike Crowe    16 年前

    不,是这样做的:

    $text_including_tax =“平坦”。此代码计算行:

    平=“平”;

    这不一定很好,但我曾经使用过这样的技术,将所有mysql变量都吸进这样的数组中:

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