Cara menggunakan metode sql “AES_DECRYPT” di afterFind di YII2

Saya perlu menggunakan metode sql AES_DECRYPT tetapi string tidak didekripsi.

ini berfungsi di sql tetapi tidak di metode afterfind yii2

itu mengembalikan respons seperti gambar di bawah ini. masukkan deskripsi gambar di sini

Ini di bawah gambar tabel db. masukkan deskripsi gambar di sini

 public function afterFind() {
            parent::afterFind();

            //$this->name = new Expression('AES_DECRYPT("'.$this->name.'", "key test")  as name ');
            $this->name = new Expression('cast(AES_DECRYPT("'.$this->encrypt_name.'", "key test") as char) as name');

            //return true;

        }

person Bhavin Thummar    schedule 04.04.2018    source sumber
comment
AES_DECRYPT tidak akan berfungsi di afterFind() karena harus diproses oleh MySql (Anda bisa menggunakan PHP tetapi kemungkinan besar Anda juga ingin mengenkripsinya dalam PHP). Bisakah Anda menggunakan Ekspresi AES_DECRYPT saat mengambil data dengan memodifikasi kueri select atau serupa?   -  person ldg    schedule 04.04.2018
comment
deos ini membantu Anda stackoverflow.com/questions/16556375/   -  person Muhammad Omer Aslam    schedule 04.04.2018
comment
Tidak, Pak, itu tidak membantu saya.   -  person Bhavin Thummar    schedule 05.04.2018
comment
apa kesalahan sebenarnya? kueri sebenarnya apa yang terbentuk? lihat saja kueri yang dieksekusi. Anda dapat menemukan kueri yang dieksekusi di bilah alat debug.   -  person R13e    schedule 05.04.2018
comment
@R13e Silakan lihat tangkapan layar tabel db. Saya memerlukan kueri yang tepat di scrrenshot tabel db. Bagaimana saya memasukkan AES_DECRYPT ke dalam metode afterfind.   -  person Bhavin Thummar    schedule 05.04.2018
comment
Saya rasa Anda salah memahami pertanyaan saya dan konsep afterFind. Anda ingin mendekripsi selama kueri atau sesudahnya? Jika Anda memanggil afterFind() dalam model, Anda melakukannya setelah kueri dieksekusi. Jadi, menggunakan kelas seperti yii\db\Expression pada beberapa atribut yang sudah terisi tidak masuk akal.   -  person R13e    schedule 05.04.2018


Jawaban (2)


Saya harap ini bermanfaat bagi Anda:

    public function afterFind() {
        $this->name = (new Query)->select(['AES_DECRYPT("'.$this->encrypt_name.'", "key test") as name'])->scalar();
        return true;
    }
person Harsh Panchal    schedule 05.04.2018
comment
Terima kasih Pak atas bantuannya yang luar biasa. - person Bhavin Thummar; 05.04.2018
comment
Ini akan membuat kueri tambahan untuk setiap model (menampilkan 50 model pada satu halaman akan memberi Anda 50 kueri tambahan). Lihatlah jawaban saya yang seharusnya melakukan semua keajaiban dalam satu kueri. - person rob006; 07.04.2018
comment
Anda juga harus menelepon parent::afterFind(), bukan return true. - person rob006; 07.04.2018

afterFind() dipanggil setelah kueri SQL dilakukan, sudah terlambat untuk mengubah kueri dan menggunakan ekspresi SQL. Anda harus mengubah select file sebelum memanggil one() atau all().

return MyModel::find()
    ->addSelect(['cast(AES_DECRYPT(encrypt_name, "key test") as char) as name'])
    ->one();

Anda dapat mengganti metode find() dalam model Anda untuk melakukan ini secara otomatis untuk setiap kueri:

public static function find() {
    return parent::find()
        ->addSelect(['cast(AES_DECRYPT(encrypt_name, "key test") as char) as name']);
}

Anda dapat mempertimbangkan kembali untuk tidak menggunakan AES_DECRYPT sama sekali. Dalam hal enkripsi, demi alasan keamanan, lebih baik mengenkripsi sesegera mungkin dan mendekripsi selambat mungkin. Memindahkan enkripsi pada tingkat SQL menimbulkan beberapa ancaman:

  • Kueri SQL Anda dapat dicatat (dalam log kesalahan atau kueri lambat) atau ditampilkan dalam pesan pengecualian. Ini akan mengungkapkan kunci enkripsi Anda, membuat keseluruhan enkripsi menjadi tidak ada gunanya.
  • Karena Anda mengirimkan kunci enkripsi dan data tidak terenkripsi antara server PHP dan MySQL, penyerang dapat mengaksesnya menggunakan Serangan MITM.
  • Mengkompromikan server SQL akan memberikan penyerang akses ke data terenkripsi, karena Anda cukup sering mengirimkan kunci enkripsi dalam kueri SQL.

Anda dapat menghindari hal ini dengan mengenkripsi dan mendekripsi data pada level PHP (menggunakan keamanan Yii komponen atau beberapa pustaka). Anda dapat menjadikannya transparan dengan membuat atribut virtual melalui setter dan getter:

public function getName() {
    return $this->decrypt($this->encrypted_name);
}

public function setName($value) {
    $this->encrypted_name = $this->encrypt($value);
}

Kemudian Anda dapat mengakses data yang tidak terenkripsi pada $model->name.

person rob006    schedule 07.04.2018
comment
Terima kasih pak, jawaban Anda juga benar tetapi orang lain sudah menjawab saya. - person Bhavin Thummar; 09.04.2018