亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

從 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 關注
  • 155 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號