วิธีใช้วิธี sql “AES_DECRYPT” ใน afterFind ใน YII2

ฉันต้องใช้วิธี sql ของ AES_DECRYPT แต่สตริงไม่ได้ถอดรหัส

มันทำงานใน sql แต่ไม่ใช่ในวิธี yii2 afterfind

มันตอบกลับมาเหมือนภาพด้านล่าง ป้อนคำอธิบายรูปภาพที่นี่

นี่คือภาพด้านล่างตาราง db ป้อนคำอธิบายรูปภาพที่นี่

 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 แหล่งที่มา
comment
AES_DECRYPT จะไม่ทำงานใน afterFind() เนื่องจาก MySql จะต้องประมวลผล (คุณ สามารถ ใช้ PHP ได้ แต่คุณก็มักจะต้องการเข้ารหัสใน PHP ด้วย) คุณสามารถใช้ AES_DECRYPT Expression เมื่อดึงข้อมูลของคุณโดยแก้ไขแบบสอบถาม select หรือคล้ายกันได้หรือไม่   -  person ldg    schedule 04.04.2018
comment
deos สิ่งนี้ช่วยคุณได้ stackoverflow.com/questions/16556375/   -  person Muhammad Omer Aslam    schedule 04.04.2018
comment
ไม่ครับ มันไม่ช่วยผมเลย   -  person Bhavin Thummar    schedule 05.04.2018
comment
ข้อผิดพลาดที่แท้จริงคืออะไร? แบบสอบถามอะไรเกิดขึ้น? เพียงแค่ดูแบบสอบถามที่ดำเนินการ คุณสามารถค้นหาแบบสอบถามที่ดำเนินการได้ในแถบเครื่องมือดีบัก   -  person R13e    schedule 05.04.2018
comment
@ R13e โปรดดูภาพหน้าจอตาราง db ฉันจะต้องมีแบบสอบถามที่แน่นอนใน db table scrrenshot ฉันจะใส่ AES_DECRYPT ลงในวิธี afterfind ได้อย่างไร   -  person Bhavin Thummar    schedule 05.04.2018
comment
ฉันคิดว่าคุณเข้าใจคำถามและแนวคิดของ afterFind ของฉันผิด คุณต้องการถอดรหัสระหว่างการสืบค้นหรือหลังจากนั้น? หากคุณเรียก afterFind() ในโมเดล คุณจะดำเนินการ หลังจาก ดำเนินการค้นหา ดังนั้นการใช้คลาสเช่น yii\db\Expression กับแอตทริบิวต์ที่มีประชากรอยู่แล้วจึงไม่สมเหตุสมผล   -  person R13e    schedule 05.04.2018


คำตอบ (2)


ฉันหวังว่านี่จะเป็นประโยชน์สำหรับคุณ:

    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
ขอบคุณท่านสำหรับความช่วยเหลือที่ดีของคุณ - person Bhavin Thummar; 05.04.2018
comment
สิ่งนี้จะสร้างข้อความค้นหาเพิ่มเติมสำหรับแต่ละรุ่น (การแสดง 50 โมเดลในหนึ่งหน้าจะทำให้คุณมีข้อความค้นหาเพิ่มเติม 50 รายการ) ดูที่คำตอบของฉัน ซึ่งน่าจะทำทุกอย่างมหัศจรรย์ได้ในแบบสอบถามเดียว - person rob006; 07.04.2018
comment
นอกจากนี้คุณควรโทร parent::afterFind() แทน return true - person rob006; 07.04.2018

afterFind() ถูกเรียกหลังจากดำเนินการค้นหา SQL แล้ว ซึ่งสายเกินไปที่จะแก้ไขแบบสอบถามและใช้นิพจน์ SQL คุณควรแก้ไข select fileds ก่อนที่จะโทร one() หรือ all()

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

คุณสามารถแทนที่วิธี find() ในโมเดลของคุณเพื่อทำสิ่งนี้โดยอัตโนมัติสำหรับทุกแบบสอบถาม:

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

คุณอาจพิจารณาใหม่ว่าจะไม่ใช้ AES_DECRYPT เลย เมื่อพูดถึงการเข้ารหัส ด้วยเหตุผลด้านความปลอดภัย การเข้ารหัสโดยเร็วที่สุดและถอดรหัสให้ช้าที่สุดจะดีกว่า การย้ายการเข้ารหัสในระดับ SQL ทำให้เกิดภัยคุกคามหลายประการ:

  • การสืบค้น SQL ของคุณอาจถูกบันทึก (ในข้อผิดพลาดหรือบันทึกการสืบค้นที่ช้า) หรือแสดงในข้อความข้อยกเว้น การดำเนินการนี้จะเปิดเผยคีย์เข้ารหัสของคุณ ทำให้การเข้ารหัสทั้งหมดไม่มีจุดหมาย
  • เนื่องจากคุณกำลังส่งคีย์เข้ารหัสและข้อมูลที่ไม่ได้เข้ารหัสระหว่างเซิร์ฟเวอร์ PHP และ MySQL ผู้โจมตีจึงสามารถเข้าถึงได้โดยใช้ การโจมตี MITM
  • การโจมตีเซิร์ฟเวอร์ SQL จะทำให้ผู้โจมตีสามารถเข้าถึงข้อมูลที่เข้ารหัสได้ เนื่องจากคุณส่งคีย์การเข้ารหัสค่อนข้างบ่อยในการสืบค้น SQL

คุณสามารถหลีกเลี่ยงสิ่งนี้ได้โดยการเข้ารหัสและถอดรหัสข้อมูลที่ระดับ PHP (โดยใช้ Yii security องค์ประกอบหรือบางไลบรารี) คุณสามารถทำให้สิ่งนี้โปร่งใสได้โดยการสร้างแอตทริบิวต์เสมือนผ่าน setter และ getter:

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

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

จากนั้นคุณจะสามารถเข้าถึงข้อมูลที่ไม่ได้เข้ารหัสได้ภายใน $model->name

person rob006    schedule 07.04.2018
comment
ขอบคุณครับ คำตอบของคุณก็ถูกต้องเช่นกัน แต่มีคนอื่นตอบผมแล้ว - person Bhavin Thummar; 09.04.2018