以这种方式处理方程是否安全?

时间:2015-09-26 22:11:13

标签: php regex

我正在使用用户提供的字符串,例如'm * 0.2',其中'm'是$value并评估字符串。允许用户使用4个基本数学运算符,小数和负数。任何使用其他任何东西的尝试都被省略。

$equation = $metric['formatter'];

$equation = preg_replace("/[^0-9*m.\/\+\-]/", "", $equation); //strips extra params

if (strlen($equation) > 1) {
    $equation = str_replace("m", ' $value ', $equation);

    $code = '$newValue = '.$equation.';';

    if (validExec($code)) { //validates syntax
        eval($code);

        $newValue = (int) $newValue; //unnecessary security step?

        if ($newValue != 0) {
            $value = $newValue;
        }
    }
}

function validExec($code) {
    $code = escapeshellarg('<?php ' . $code . ' ?>');

    $lint = 'echo $code | php -l'; // command-line PHP

    // maybe there are other messages for good code?
    return (preg_match('/No syntax errors detected in -/', $lint));
}

我想知道我的方法是否100%安全,允许上述操作。

1 个答案:

答案 0 :(得分:1)

我正在考虑修复用户输入公式的代码。

您正在做的事情似乎阻止了任何用户恶意代码在您的服务器上运行,因为它们只允许使用字母m,数字和数学运算符。

然而,它只需要一个明亮的火花来找到解决方法,危及你的系统,我认为大多数人会同意允许用户输入进行评估可能不是一个好的做法,无论你有多少验证它。

当我查看我的问题时,我开始寻找处理库的公式,例如电子表格中使用的库。 类似Excel的库将采用数学表达式并能够安全地评估它们。

我从未尝试过测试,但希望如果你能找到合适的产品,你甚至可以向后兼容你现有的公式。

祝你好运。

相关问题