2010-08-15 5 views
5

예를 들어, 결과를 생성하는 실행해야합니다 몇 가지 변수를 저장하는 문자열 한 I : 내가 평가가 경우 안전하지 않은 것을 이해eval() 대신 무엇을 사용할 수 있습니까?

$foo = eval("return ".RUN_THIS.";"); 

: 다음 -uated eval()

define('RUN_THIS', '\$something.",".$somethingElse'); 

어느 평가되는 문자열은 사용자가 입력 한 것입니다. 그러나 예를 들어, 모든 것을 eval()을 지원하지 않는 Facebook의 HipHop에서 실행하고 싶다면이 작업을 수행 할 수 없습니다.

명백하게 나는 call_user_func()을 사용할 수 있습니다 .- eval()과 같은 효과가 있습니까? eval()이 실제로 그렇지 않은 경우 어떻게 안전하다고 간주됩니까?

편집 : 댓글에 대한 응답으로, 원래 목표가 무엇인지 분명히하지 않았습니다. 상수는 구성 상수 나 프로 시저 코드에 액세스 할 수있는 클래스 내에있는 이후 코드가 주어진 변수 문자열을 평가하기 위해이를 사용할 수 있도록 미리 정의됩니다. 상황에 따라 평가해야하는 변수 (완전히 다른 이름, 순서, 형식)가 다를 수 있지만 같은 목적으로 실행됩니다. 따라서 현재 변수의 문자열이이 변수에 상수로 설정되어 있습니다. 방법. 기술적으로 eval()은 상수를 정의하는 config.php가 제어되는 한 안전하지 않습니다.하지만 질문의 요지는 아닙니다.

+9

처음에 변수를 저장하는 이유를 설명 할 수 있다면 도움이 될 것입니다. – Cfreak

+2

그래, 이건 디자인 결함 같아. 나중에 코드에서 파싱되는 더 추상적 인 "RUN_THIS"(실제 코드를 포함하지 않는)를 정의 할 수 있습니까? –

+1

당신이 할 수없는 이유가 있나 :'$ foo = "\ $ something, $ somethingElse";' –

답변

2

켄달이 a simple solution을 갖고있는 것 같아요,하지만 난 다른 질문에 대답하려고합니다 :

분명히 내가 사용할 수 있습니다 call_user_func를() -이 효과적으로 평가와 같은 결과입니다()? eval()이 실제로 그렇지 않은 경우에 어떻게 안전하다고 생각합니까?

call_user_func실제로 때문에 call_user_func는 하나 개의 사용자 함수를 호출 할 수 있다는 사실의 안전보다 더 eval입니다. 반면 eval은 PHP 코드 자체로 문자열을 실행합니다. ';을 추가하고 (문자열을 닫고 코드의 새로운 "줄"을 시작하는) 문자열의 끝에 추가 코드를 추가하고 ;'을 추가합니다 (코드 줄을 끝내고 다른 문자열을 시작하여 구문이 없음). 오류), 따라서 (는 이런 일이주지 않을 등 모든 중요한 파일을 삭제하고 데이터베이스에 대한 정보를 검색을 포함하여 사용자가 서버에서 실행할 수있는 PHP 코드를 많이 포함하도록 일정 RUN_THIS을 허용. 아무튼

call_user_funccall_user_func_array($func, $args)을 실행하면 다음과 같은 이유로 제한된 기능 집합 만 실행할 수 있습니다. (a) 함수를 사용자 정의해야합니다. (b) 사용자가 아무 것도 실행할 수 없도록 $func을 조작 할 수 있습니다. 수표로 원하는 기능 "$func"이 허용 된 함수 목록에 있거나 함수 이름에 user_과 같은 접두사를 붙이면 $func 변수 자체가됩니다 (이 방법으로 사용자는 user_으로 시작하는 함수 만 실행할 수 있습니다).

+1

'exec'! ='eval' –

+0

알아. 내가 놓친 것을 제외하고는, 나는 실제로'exec'가 아니라'eval'에 대해 이야기하고 있습니다. – Umang

+0

게시물을 다시 읽으십시오. "call_user_func은 실제로 ** exec ** **보다 안전합니다 ...". –

1

큰 따옴표 묶음을 사용할 수없는 이유가 없습니다.

$foo = "\$something,$somethingElse"; 
관련 문제