为了账号安全,请及时绑定邮箱和手机立即绑定

从 PHP 函数中删除 eval

从 PHP 函数中删除 eval

PHP
慕尼黑5688855 2023-10-01 17:03:13
我想知道是否有办法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');}由于这会带来一些安全漏洞,还有其他替代方案可以使其发挥作用吗?
查看完整描述

3 回答

?
四季花海

TA贡献1811条经验 获得超5个赞

如前所述,绝对没有理由在这里使用 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');

}


查看完整回答
反对 回复 2023-10-01
?
BIG阳

TA贡献1859条经验 获得超6个赞

看来您可以大大简化代码,并消除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']);


查看完整回答
反对 回复 2023-10-01
?
慕少森

TA贡献2019条经验 获得超9个赞

我会将逻辑分解成更小的部分,以使其更易于阅读。


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;

}


查看完整回答
反对 回复 2023-10-01
  • 3 回答
  • 0 关注
  • 67 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信