2011-09-22 2 views
0

나는 각 Ajax 함수에 대해 하나의 PHP 파일을 작성하지 않아도되도록 매개 변수를 전달하는 일반 함수를 사용하여 Ajax에서 게시 할 수 있도록 함수를 작성 중이다.PHP : params를 사용하는 방법은 무엇입니까?

이 제 기능을 우편으로 수신 후 PHP 측에서 지금의 모습, 당신은 코드에서 볼 수있는 PARAMS : 그것은 PARAMS의 일부에서 제외하고있다

$class_name = $_POST['class_name']; 
$function_name = $_POST['function_name']; 
$params = "'" . implode("','", $_POST['params']) . "'"; 
$model = new $class_name(); 

//Apply the function 
echo $model->$function_name($params); 

. .. PHP는 하나의 매개 변수로 해석하고 있습니다. 그래서 어떻게하면 $ params가 단일 문자열로 해석되지 않습니까?

+3

이 코드는 상당히 위험한 매우 임의 코드의 실행을 허용합니다. 이것이 클래스 및 메소드 이름에 대한 화이트리스트 검사를 제거하는 간단한 예제가되기를 바랍니다. – johannes

+0

별로 임의적이지는 않습니다. 정의 된 (또는 자동로드 가능) 클래스의 메소드 여야합니다. (예를 들어, 일부 전역'makeMeAnAdmin()'함수를 호출 할 수는 없습니다.) 그러나 이것은 일종의 화이트리스트 (또는 적어도 클래스의 isCallable 변수/메소드가 없으면 위험 할 수 있습니다. 분산 화이트리스트의 일종). – cHao

답변

3

세 번째 줄은 실제로 $params 모든 PARAMS을 포함하는 단일 문자열을 만든다.

프레임 워크 (그리고 Ajax에서 매개 변수를 전달하는 방법)에 따라 $params을 전달하는 대신 $_POST['params']을 그대로 전달할 수 있습니다. 어떤 경우에는 문자열을 전혀 만들 필요가 없습니다. 당신이 PARAMS는 대신 같은 배열에 개별적으로 전달 될 것으로 기대하고 함수를 호출해야하는 경우

, '

call_user_func_array(array($model, $function_name), $params) 

$params 1이 포함 된 경우, 2, 3, $function_name는 시도 foo '이면 위의 표현식은 $model->foo(1, 2, 3)과 같습니다.

참고,이 기능을 사용하면 스크립트에서 사용할 수있는 모든 클래스의 공개 메소드를 호출 할 수 있습니다. 사람들이 무작위로 실행되는 것을 막기 위해 어떤 종류의 액세스 제어가 필요합니다. 귀하의 질문에 대한 의견에서 제안했듯이 어떤 종류의 화이트리스트 (클래스가 이처럼 임의의 코드에서 사용되도록 의도 된 것인지 여부를 나타내는 멤버 변수 일지라도)는 보안 문제를 방지하는 데 큰 도움이됩니다.

+0

감사합니다! 정확히 내가 필요한 것! – luqita

0

묵살하지 마십시오. 이미 $_POST처럼 배열로 전달하십시오.

echo $model->$function_name($_POST['params']); 
+0

이것은 생각이 아닌 함수를 수정하는 것을 의미합니다 ... 일부 함수는 3 개의 매개 변수를 받고, 다른 함수는 4를받습니다. 이것은 유연해야합니다. – luqita

+1

그럴 수도 있습니다. 그러나 당신의 질문은 $ params가 하나의 문자열로 해석되지 않도록 만드는 방법을 물었습니다. implode을 수행하면 $ params가 단일 문자열이됩니다. –

관련 문제