Php 如何使用sql方法&x201C;AES#u解密”;在YII2的后发现中

Php 如何使用sql方法&x201C;AES#u解密”;在YII2的后发现中,php,sql,yii2,Php,Sql,Yii2,我需要使用AES_DECRYPT的sql方法,但字符串不是DECRYPT 它在sql中工作,但在yii2 afterfind方法中不工作 它返回的响应如下图所示。 这是下面的db表图像。 我希望这对您有用: public function afterFind() { $this->name = (new Query)->select(['AES_DECRYPT("'.$this->encrypt_name.'", "key test") as nam

我需要使用AES_DECRYPT的sql方法,但字符串不是DECRYPT

它在sql中工作,但在yii2 afterfind方法中不工作

它返回的响应如下图所示。

这是下面的db表图像。


我希望这对您有用:

    public function afterFind() {
        $this->name = (new Query)->select(['AES_DECRYPT("'.$this->encrypt_name.'", "key test") as name'])->scalar();
        return true;
    }
执行SQL查询后调用了
afterFind()
,现在修改查询和使用SQL表达式已经太晚了。在调用
one()
all()
之前,应该修改
选择
文件

您可以覆盖模型中的
find()
方法,以便为每个查询自动执行此操作:

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

您可以重新考虑根本不使用
AES\u DECRYPT
。当涉及到加密时,出于安全原因,最好尽快加密并尽可能晚解密。在SQL级别移动加密会带来几种威胁:

  • 您的SQL查询可能会被记录(在错误或慢速查询日志中)或显示在异常消息中。这将显示您的加密密钥,使整个加密变得毫无意义
  • 由于您正在PHP和MySQL服务器之间发送加密密钥和未加密数据,因此攻击者可以使用
  • 破坏SQL server将使攻击者能够访问加密数据,因为您在SQL查询中经常发送加密密钥
您可以通过在PHP级别加密和解密数据(使用或)来避免这种情况。您可以通过setter和getter创建虚拟属性使其透明:

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

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

然后,您可以通过
$model->name

AES\u DECRYPT
访问未加密的数据,这在
afterFind()
中不起作用,因为它必须由MySql处理(您可以使用PHP,但很可能还需要在PHP中对其进行加密)。在通过修改
选择
查询或类似查询获取数据时,是否可以使用
AES\u DECRYPT
表达式?这对您有帮助吗?不,先生,这对我没有帮助。确切的错误是什么?究竟形成了什么样的疑问?只需查看已执行的查询。您可以在调试工具栏中找到已执行的查询。@R13e请参见db表格屏幕截图。我需要在db表scrrenshot中进行精确查询。我是如何将AES_DECRYPT放入afterfind方法的。谢谢您的帮助。这将为每个模型创建额外的查询(在一个页面上显示50个模型将为您提供50个额外的查询)。看看哪一个可以在一个查询中发挥所有的作用。另外,您应该调用
parent::afterFind()
而不是
return true
。谢谢您,先生,您的答案也是正确的,但其他人已经回答了我。
public static function find() {
    return parent::find()
        ->addSelect(['cast(AES_DECRYPT(encrypt_name, "key test") as char) as name']);
}
public function getName() {
    return $this->decrypt($this->encrypted_name);
}

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