2013-07-24 2 views
0
변수

에서 인수를 전달하는 것은 여기 내 ajax_handle 파일입니다. 나는 (동적) $ methodName 함수에 전달하는 가장 좋은 방법이 무엇인지 전혀 모른다.통화 기능 동적

+1

코드와 관련된 보안 문제가 마음에 들지 않습니다. 아마도'$ _POST [ 'req']'의''../../ WhateverPath/Any_xxx '''를 보내서 "Controller.php"로 끝나는 파일 시스템에 파일을 요구할 수 있습니다. 컨트롤러에서 public 메서드를 호출 할 수 있습니다. 필요한 파일이 실제로 생각하는 경로 안에 있는지 확인하십시오. 'realpath()'를 사용하여 얻을 수있는 상대 경로를 확장하거나 관련 "파일 경로"일 수있는 문자를 완전히 금지하십시오. 컨트롤러 이름이이 행성의 어떤 캐릭터가 될 수있는 이유가 있습니까? ASCII 문자로 충분해야합니다. – Sven

+0

@Sven이 점을 지적 해 주셔서 감사합니다.하지만 어떻게 ajax 호출에서 $ _POST [ 'req']를 변경 하시겠습니까? 어쨌든 ASCII 필터 또는 허용 된 filnames 배열을 만들거야. – user1930254

+0

서버로 HTTP 요청을 보내지 못하게하는 방법은 없습니다. 그리고 모든 데이터는 내 통제하에 있습니다. 물건을 난독화할 수는 있지만, 아약스 코드를 항상 보면서 자신이하는 일을보고 똑같이하고 재미있는 행동을 확인하기 위해 물건을 변경하십시오. – Sven

답변

1

동적 방법으로 $_POST['data']을 그대로 전달할 수 있다고 가정합니다. 동적 메서드가 배열을 허용하지만 처음에는 기본값을 설정하여 쉽게 처리하고 의 유효성을 검사 할 수 있습니다. 예 : 또한 nameaddress 이상으로 실제 지역 변수를 변환 extract()를 사용하도록 선택할

class AController 
{ 
    public function dynamicMethod($params) 
    { 
    // Set default values but allow them to be overridden by $params 
    $locals = array_merge(array(
     'name' => 'John Doe', 
     'address' => 'Nowhere', 
    ), $params); 

    // Do stuffs and return result. Example: 
    return array('nameAndAddress' => $locals['name'] . ' lives at ' . $locals['address']); 
    } 
} 

. 아약스 핸들에서

:

$controller = new $className; 
$result = $controller->$methodName($_POST['data']); 
echo json_encode($result); 

이 말했다 모두와 함께, @Sven이 무슨 말을하는가 올바른지 유의하시기 바랍니다. 현재 접근 방식에 몇 가지 보안 문제가 있습니다.

+0

감사합니다. 나는이 솔루션 call_user_func_array (array ($ controller, $ methodName), $ _ POST [ 'data'])를 찾았습니다. – user1930254