从 PHP 函数中删除 eval

我想知道是否有办法eval()从我的代码中删除。


在此函数中,我通过 POST 加载一些变量,以根据管理员在表单上插入的内容在我的数据库上更新或插入新用户。


public function alterUser()

{

    

    $name = $_POST['name']; //required field 

    $contact = $_POST['contact']; //required field 

    $password = $_POST['password']; //required field 

    

    $string = "DB::table('users')";

    

    if(isset($_POST['id'])){

        $string = $string."-> where ('id', \$_POST['id']) ->update([";

    }else{

        $string = $string."-> insert([";

    }

    

    $string = $string."'name' => \$_POST['name'],";

            

    if (isset($_POST['email'])) 

        $string = $string."'email' => \$_POST['email'],";

    

    $string = $string."'password' => Hash::make(\$password),'contacto' => \$contact,";

    

    if (isset($_POST['nif'])) 

        $string = "$string.'nif' => \$nif,";

    

    $string = $string."]);";


    eval($string);

    return redirect('/user');

}

由于这会带来一些安全漏洞,还有其他替代方案可以使其发挥作用吗?


慕尼黑5688855
浏览 109回答 3
3回答

四季花海

如前所述,绝对没有理由在这里使用 eval。您需要做的是构建一个要传入的值数组,然后决定是否需要成为新用户或更新。public function alterUser(){    $name = $_POST['name']; //required field    $contact = $_POST['contact']; //required field    $password = $_POST['password']; //required field    $values = [        'name' => $name,        'password' => Hash::make($password),        'contacto' => $contact    ];    if (isset($_POST['email'])) {        $values['email'] = $_POST['email'];    }    if (isset($_POST['nif'])) {        $values['nif'] = $_POST['nif'];    }    if(!empty($_POST['id'])) {        DB::table('users')->insert($values);    } else {        DB::table('users')->where('id', $_POST['id'])->update($values);    }        return redirect('/user');}

BIG阳

看来您可以大大简化代码,并消除eval()除非万不得已而不应使用的需求。代码中不需要所有 IF 块,因为如果未设置该值,它也不会添加到数组中$values。只需将您的$_POST变量分配给一个$values变量,Laravel 就会为您完成大部分繁重的工作。public function alterUser(){    $values = $_POST;    //remove _token variable created by Laravel in all POST requests    unset($values['_token']);     //perform any actions needed on values before being send to database    $values['password'] = Hash::make($values['password']);    if(!empty($values['id'])) {        DB::table('users')->insert($values);    } else {        DB::table('users')->where('id', $values['id'])->update($values);    }        return redirect('/user');}我在您的代码中看到您将变量重命名contact为contacto. 我建议更改您的表单以匹配此变量名称,但如果不可能,您仍然可以在设置后重命名它,$values = $_POST如下所示:$values['contacto'] = $values['contact'];unset($values['contact']);另外,如果您的表单发送了任何您不想发送到数据库的变量,例如“密码验证”字段或类似的字段,那么您可以在设置后取消设置它们,如下所示$values = $_POST:unset($values['VALUE_TO_REMOVE']);

慕少森

我会将逻辑分解成更小的部分,以使其更易于阅读。public function alterUser(){    $values = $this->readPostValues();    $this->performUpsert($values);    return redirect('/user');}private function performUpsert(array $values): void{    if (!empty($_POST['id'])) {        DB::table('users')->insert($values);        return;    }    DB::table('users')->where('id', $_POST['id'])->update($values);}private function readPostValues(): array{    $values = [        'name' => $_POST['name'],        'password' => $_POST['password'],        'contacto' => $_POST['contact'],    ];    if (isset($_POST['email'])) {        $values['email'] = $_POST['email'];    }    if (isset($_POST['nif'])) {        $values['nif'] = $_POST['nif'];    }    return $values;}
打开App,查看更多内容
随时随地看视频慕课网APP