有代码,但是这个错误是什么?

时间:2012-10-08 20:41:55

标签: php

好吧,我正在尝试将文件上传到服务器时加密。我在stackoverflow上找到了代码here,但是我在插入它时遇到了问题。我收到错误unexpected '(', expecting ',' or ';' in where/the/file/is.php。它指向const KEY = md5('somesecretcode');行。我知道它说它会在md5之后期待结束,但我不确定为什么?您认为它会接受现在“加密”的字符串作为有效字符串。如果需要,我会上传更多代码。感谢您的帮助!我对此有点新意,所以请不要太粗暴。

这是代码

<?php

class Encryption
{
const CYPHER = MCRYPT_RIJNDAEL_256;
const MODE   = MCRYPT_MODE_CBC;
const KEY    = md5('somesecretcode');

public function encrypt($plaintext)
{
    $td = mcrypt_module_open(self::CYPHER, '', self::MODE, '');
    $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
    mcrypt_generic_init($td, self::KEY, $iv);
    $crypttext = mcrypt_generic($td, $plaintext);
    mcrypt_generic_deinit($td);
    return base64_encode($iv.$crypttext);
}

public function decrypt($crypttext)
{
    $crypttext = base64_decode($crypttext);
    $plaintext = '';
    $td        = mcrypt_module_open(self::CYPHER, '', self::MODE, '');
    $ivsize    = mcrypt_enc_get_iv_size($td);
    $iv        = substr($crypttext, 0, $ivsize);
    $crypttext = substr($crypttext, $ivsize);
    if ($iv)
    {
        mcrypt_generic_init($td, self::KEY, $iv);
        $plaintext = mdecrypt_generic($td, $crypttext);
    }
    return trim($plaintext);
}
}

?>

我称之为......

$encrypted_string = Encryption::encrypt('this is a test'); // Åž-\Ž“kcþ1ÿ4gî:Xƒã%
$decrypted_string = Encryption::decrypt($encrypted_string); // this is a test

3 个答案:

答案 0 :(得分:6)

您不能将函数调用或数组与const一起使用。您将不得不找到另一种设置常量的方法(或者只是硬编码md5('somesecretcode')的值)。

答案 1 :(得分:2)

你不能使用&#34; const&#34;,因为这会在编译时被解析,而函数调用是不可能的。

你可以像这样使用define函数

define('KEY', md5('somesecretcode'));

这是一个函数,在运行时执行并且可以工作。您必须将它放在可以执行的地方 - 例如类构造函数。

但是在这个上下文中使用define并不是一个非常好的设计,因为然后创建一个类的实例会将一些东西写入全局(或命名空间)范围。

所以你需要重新考虑你的解决方案。如果你坚持保持静态方法调用,可能会将秘密传递给函数作为输入参数?

答案 2 :(得分:1)

您不应该使用函数在const之外初始化constructor变量 你可以这样做:

class Encryption
{
    const CYPHER = MCRYPT_RIJNDAEL_256;
    const MODE   = MCRYPT_MODE_CBC;
    const KEY    = '';

    public function __construct(){
        $this->KEY = md5('somesecretphrase');
    }
...

<强>更新
这不是正确的!
即使这个代码似乎正在工作,它真正做的是创建另一个名为KEY的对象成员(即使它没有$ - 这有点令人困惑)并为其分配{{ 1}}。该成员不是常量,可以随时更改。
md5('somesecretphrase')可以引用的班级成员KEY仍为空!