2012-10-08 2 views
2

좋아, 파일을 서버에 업로드 할 때 암호화하려고합니다. 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); 
} 
} 

?> 

있고 난 당신이 const과 함께 함수 호출 또는 배열을 사용할 수 없습니다 ... 같은

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

답변

6

그것을 호출하고 있습니다. 상수를 설정하는 또 다른 방법을 찾아야합니다 (또는 단지 하드 코드의 값은 md5('somesecretcode')입니다).

+0

좋아, 나는 네가하는 말을 이해하고 있는지 확인하고 싶다. 'const'는 함수 호출을 가질 수 없기 때문에 md5 암호화를 사용하고 있는지 또는 자체 문자열 암호화 함수를 호출하는지는 중요하지 않습니다. 권리? 따라서 함수를 호출하는 대신 문자 그대로 암호화 된 코드를 넣어야합니까? Ex..'const KEY = '9319ca52f60ac20f620a1a3b265ade79'; '그게 당신이 말하는거야? 그건 그렇고, 나는 이것을 비밀 코드로 유지하지 않을거야. 그것은 우스꽝 스럽다. –

+4

메소드에 없다면 클래스에 함수 호출을 넣을 수 없습니다 (예 :'public $ var = myfunction()'도 작동하지 않습니다). – deizel

+1

@MichaelHarvey 맞다. 그냥 const로 md5의 문자열을 가질 수있다. deizel의 의견에도주의를 기울이십시오. –

1

constructor 외부 변수 const을 초기화하는 함수를 사용하지 마십시오.
대신 수행 할 수 있습니다

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

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

업데이트 :
이것은 사실이 아니다!
비록이 코드가 실제로 작동하는 것처럼 보일지라도 $이 없어도 KEY이라는 다른 객체 멤버를 생성하고이를 md5('somesecretphrase')으로 지정하면됩니다. 이 멤버는 상수가 아니며 언제든지 변경할 수 있습니다.
self::KEY에 의해 참조 될 수있는 반원 KEY은 비어 있습니다!

+0

'암호화 '를'__construct'로 변경할 수 있습니까? PHP4는 5 년 전에 끝났습니다. :) – deizel

+0

@deizel 저는 자바 프로그래머입니다 - 용서해주십시오 ... (고정! :) – alfasin

+0

아니, 할 수 없습니다. 상수는 일정하며 더 이상 변경되지 않습니다. – Sven

2

"const"는 함수 호출이 아직 가능하지 않은 컴파일 타임에 구문 분석되므로 사용할 수 없습니다.

당신이

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

이 같은 함수를 정의 할 수 있습니다 런타임에 실행됩니다 및 작동, 기능입니다. 예를 들어 클래스 생성자와 같이 실행될 수있는 어딘가에 배치해야합니다.

하지만이 문맥에서 define을 사용하는 것은 아주 좋은 디자인이 아닙니다. 클래스의 인스턴스를 생성하면 전역 (또는 네임 스페이스) 범위에 무언가를 쓸 것이기 때문입니다.

그래서 솔루션을 다시 생각해 봐야합니다. 정적 메서드 호출을 유지하려고한다면 입력 매개 변수로 함수에 비밀을 전달해야할까요?