PHP eval()在我的代码中可以利用它吗?(动态参数)

PHP eval()在我的代码中可以利用它吗?(动态参数),php,mysqli,eval,prepared-statement,Php,Mysqli,Eval,Prepared Statement,编辑:在阅读了其他用户的所有输入后,我决定使用@chris建议的调用用户函数数组()还有一个不使用eval()的原因,它比调用用户函数数组()要慢,但到目前为止,没有人能够利用我的方法,如果你找到一种方法,请将其作为答案或评论发布:)。所以每个人都可以从中学习。 祝大家圣诞快乐 ---编辑结束--- 好的,我需要制作一个动态代码: 我得到的用户输入像$\u POST['a'],$\u POST['b']//取决于每个查询有多少用户输入 $sql = "SELECT 1, 2, 3 FROM x

编辑:在阅读了其他用户的所有输入后,我决定使用@chris建议的调用用户函数数组()还有一个不使用eval()的原因,它比调用用户函数数组()要慢,但到目前为止,没有人能够利用我的方法,如果你找到一种方法,请将其作为答案或评论发布:)。所以每个人都可以从中学习。 祝大家圣诞快乐

---编辑结束---

好的,我需要制作一个动态代码:

我得到的用户输入像$\u POST['a'],$\u POST['b']//取决于每个查询有多少用户输入

$sql = "SELECT 1, 2, 3 FROM x WHERE b = ? AND a = ? LIMIT 10"; // SQL STATEMENT
$input = array($_POST['a'], $_POST['b']);
$output = 3; // Number of variables need for 1, 2, 3
$data = readDB2($sql, $input, $output);
var_dump($data);
此输入将传递给mysqli->prepared语句

原因变量的数量是动态的($input和$output)

我使用了php函数eval();现在我的问题是,在我的代码中,这可以被利用吗

只需查看我的函数readDB2,了解我是如何使用eval()函数的(使用了3次)

为隐姓埋名编辑:

$input = array($_POST['pwnd']);

$data = readDB2($sql, $input, $output) {

public function readDB2($sql, $input, $output) {
    ...
    $inputn = count($input) - 1;
    for($i = 0; $i <= $inputn; $i++) {
            if($i !== $inputn) {
                $data .= '$input[' . $i . "],";
            } else {
                $data .= '$input[' . $i . "]";
            }
            $sp .= "s";
        }
        $bind = '$stmt->bind_param(\''. $sp . '\',' . $data . ');';
        eval("return $bind");

    ...
}
得到

得到


不是你说的。

你在评估用户提交的数据,有效地允许攻击者执行任意代码。这是应用程序可能存在的最严重的安全漏洞,除无漏洞外。我是认真的。您的程序实际上具有程序可能具有的最糟糕的漏洞

您正在将
$\u POST['a']
作为
$input
参数传递。
$input
参数被视为一个数组,它的各个元素被附加到一个字符串中,该字符串将被计算。如果有人向您的应用程序发布可执行代码,您可能会无意中运行它

我甚至不会发布一个有效的漏洞,但是假设
$\u post['a']
包含一个元素,该元素包含字符串
);rmdir(“/etc”)//

这一行:

    $bind = '$stmt->bind_param(\''. $sp . '\',' . $data . ');';
变成这样:

    $stmt->bind_param(''); rmdir("/etc"); //);';

也就是说,您的原始语句的意图无效,相反,用户让您删除了
/etc
目录。同样,这可能不是一个有效的示例,但这是一种通过信任用户提交的数据将其传递给
eval
的攻击,您正在评估用户提交的数据,有效地允许攻击者执行任意代码。这是应用程序可能存在的最严重的安全漏洞,除无漏洞外。我是认真的。您的程序实际上具有程序可能具有的最糟糕的漏洞

您正在将
$\u POST['a']
作为
$input
参数传递。
$input
参数被视为一个数组,它的各个元素被附加到一个字符串中,该字符串将被计算。如果有人向您的应用程序发布可执行代码,您可能会无意中运行它

我甚至不会发布一个有效的漏洞,但是假设
$\u post['a']
包含一个元素,该元素包含字符串
);rmdir(“/etc”)//

这一行:

    $bind = '$stmt->bind_param(\''. $sp . '\',' . $data . ');';
变成这样:

    $stmt->bind_param(''); rmdir("/etc"); //);';
也就是说,您的原始语句的意图无效,相反,用户让您删除了
/etc
目录。同样,这可能不是一个有效的示例,但这是一种通过信任用户提交的数据将其传递给
eval
fyi,()来打开自己的攻击,这是您调用具有未知参数数的函数的方式

array_unshift($input, str_repeat('s', count($input)));
$callable = array($stmt, 'bind_param');
call_user_func_array($callable, $input);
()将“sss”字符串元素推到数组的前面(我们需要前面的元素,因为它必须是第一个提供给bind_param的参数)

$callable是psuedo类型

另外,将来,如果您发现自己正在使用eval,请熟悉php的()函数,它可以帮助您构造安全字符串。但尽量不要使用eval。

仅供参考,()是使用未知参数数调用函数的方式

array_unshift($input, str_repeat('s', count($input)));
$callable = array($stmt, 'bind_param');
call_user_func_array($callable, $input);
()将“sss”字符串元素推到数组的前面(我们需要前面的元素,因为它必须是第一个提供给bind_param的参数)

$callable是psuedo类型



另外,将来,如果您发现自己正在使用eval,请熟悉php的()函数,它可以帮助您构造安全字符串。但尽量不要使用eval。

是。是的,你很脆弱。也没有必要进行评估。你可以使用call\u user\u func\u数组…你能给我一个如何利用它的例子吗?你能用call\u user\u func\u数组来代替吗?我可以试试,但我现在使用eval,想看看它是否可以利用,如果是的话,如何利用,以便我理解:-)只是说它很邪恶,不要帮我造成,我不知道它为什么不好以及如何被利用。如何调用
readDB2
?是的。是的,你很脆弱。也没有必要进行评估。你可以使用call\u user\u func\u数组…你能给我一个如何利用它的例子吗?你能用call\u user\u func\u数组来代替吗?我可以试试,但我现在使用eval,想看看它是否可以利用,如果是的话,如何利用,以便我理解:-)只是说它很邪恶,不要帮我造成,我不知道它为什么不好以及如何被利用。
readDB2
是如何被调用的?$data实际上只包含
$input[0]
(字面意思,不是它的内容!)如果你能在我的代码中看到,$sp和$data是我的代码,所以它可能是,经过我的思考始终只有:查看我的编辑:编辑meagar只有变量可以包含$bad user input,这个错误的输入会传递给mysqli->prepared语句,这应该是不可利用的。第一个代码部分不会插入传入的值。它只是在求值代码中使用原始的
\$input[123]
。对下半部分和
$out
不太确定,但这可能不是输入(看起来像是一个繁琐的varvars解决方案,很难理解)。mario第2-3次评估,只是我的代码,没有用户交互,只是创建空的vars,需要多少。@user1015314:这就是我想知道的。如果您知道数组是如何工作的,为什么要绑定输出呢
    $stmt->bind_param(''); rmdir("/etc"); //);';
array_unshift($input, str_repeat('s', count($input)));
$callable = array($stmt, 'bind_param');
call_user_func_array($callable, $input);