2010-12-05 4 views

답변

36

빠른 방법은 인 myscript.php

if(function_exists($_GET['f'])) { 
    $_GET['f'](); 
} 

에 다음

something.com/myscript.php?f=your_function_name 

등의 작업을 수행하는 것입니다 하지만 제발, 모든 새끼 고양이의 사랑을 위해, 이것을 남용하지 마십시오.

+1

+1 이것이 최선의 방법입니다. –

+54

아니, 아니, 아니, 아니, 아니, 아니, 아니, 아니! 방문자가 원하는 PHP 함수를 실행할 수있게되었습니다. 'purgeDatabase' 함수를 실행하기로 결정했다면 어떻게 될까요? 아니면 그냥'phpinfo'? – VoteyDisciple

+0

많은 보안 문제를 방지 할 수있는 클래스 기반 대안에 대해서는 아래를 참조하십시오. – CodeJoust

0

PHP 파일 자체에 특수 코드를 추가하지 않고 URL에서 함수의 이름을 가져 와서 호출 할 수는 없습니다.

1

스크립트에 함수 호출을 넣을 수 있습니다.

myFunction();

myFunction 함수() { .... }

+0

당신이 이런 식으로 할 경우, 스크립트가 그 기능을가 호출 될 때마다 실행됩니다. 특히 파일에 둘 이상의 기능이있는 경우에는 혼란 스러울 수 있습니다. OP는 여러 함수가있는 PHP 파일을 만드는 것에 대해 묻고 있으며 특히 하나만 호출한다고 생각합니다. – ShiningLight

0

여러 가지 방법이 있습니다.

함수 이름을 GET 매개 변수로 전달하는 것이 한 가지 방법이며 함수의 존재 여부에 따라 함수를 호출 할 수 있습니다.

23

스크립트의 기능은 전적으로 귀하에게 달려 있습니다. URL을 통해 마술처럼 아파치, PHP 또는 다른 서버 구성 요소가 특정 동작을 수행 할 수는 없지만 특정 기능을 실행할 수 있도록 프로그램을 작성하면 확실히 가능합니다. 아마도 같은 :

switch($_GET['function']) { 
case 'specificFunction': 
    specificFunction(); 
} 

그런 다음 당신은 특별히 각 허용 기능에게 목록을 myScript.php?function=specificFunction

여기에 특히주의를 방문 할 수있다. $_GET['function'] 매개 변수를 가져 와서 말하는 기능을 맹목적으로 실행하면 안됩니다. 엄청난 보안 위험이 발생할 수 있기 때문입니다.

6

당신은 (보안상의 이유로 권장하지 않음) 같은 것을 할 수있는 : www.exampe.com/myscript.php?run=getNames 다음

:

<?php 
if (isset($_GET['run']) && function_exists($_GET['run'])){ 
    echo $_GET['run'](); 
} else { 
    echo 'Function not Found'; 
} 

당신은 더 떨어져 것을 potenitally 위험한 함수를 호출하거나 결과를 볼 수 없기 때문에 결과를 볼 수 없기 때문에 전역 네임 스페이스에서 함수를 호출하는 대신 php 클래스를 사용합니다.

<?php 
class PublicView { 
    function get_page(){ echo 'hey'; } 
} 
if (isset($_GET['run']) && method_exists('PublicView',$_GET['run'])){ 
    $view = new PublicView(); 
    $view->$_GET['run'](); 
} else { 
    echo 'Function not found'; 
} 

이것은 또한 클래스의 private 함수가 호출되는 것을 허용하지 않습니다.

+0

안녕하세요. 당신이 안드로이드에 익숙하다면 확실하지 않지만 안드로이드를 통해 webservice URL을 호출하면 사용자가 볼 수 없게됩니다.게시 한이 코드를 사용해도 보안 문제가 발생합니까? –

0
if (isset($GET[param_name])){ 

    if($GET[param_name] === value) 
    { 
     function 1... 
    } else if 
{ 

function 2... 
} 

} 
+0

안녕하십니까, StackOverflow에 오신 것을 환영합니다. 코드가 질문에 대답하는 데 도움이 될 수 있지만 답변에 몇 가지 설명을 포함하는 것이 좋습니다. 그렇게하면 OP와이 답변을 읽은 다른 사람이 문제를 해결하는 방법을 더 잘 이해할 수 있습니다. – dhh

9

어떤 방식 으로든 노출해야합니다. 이것은 모든 방법을 공개하는 것이 보안 위험이 있기 때문입니다.

Example.php 그럼 그냥 전화

<?php 

    function CalculateLength($source) 
    { 
     return strlen($source); 
    } 

    if(isset($_GET['calculate-length']) && isset($_GET['value']){ 
     die(CalculateLength($_GET['value'])); 
    } 

?> 

는 :

http://www.example.com/Example.php?calculate-length&value=My%20example 
+0

예, 알고 있습니다. 그러나 때로는 개발할 때 편리합니다. 프로덕션에 이것을 사용하는 것에 대해 생각하지 않았습니다. –

0

또한 보안를 들어, HTTP 리퍼러를 확인할 수 있습니다. 리퍼러가 자신과 동일한 도메인 인 경우에만 함수를 실행합니다. 아마도 verious 다른 것들도 비교/확인하십시오.

하지만 기능이 실행되어야하는 요청이 동일한 웹 사이트에서 왔는지 확인할 수있는 방법은 다양해야합니다.

+1

Referer 헤더는 위조 될 수 있으므로 전혀 보안을 제공하지 않습니다. – lonesomeday

0

사용하여 PHP 클래스의 생성자 :

<?php 
class YourClass { 

    function __construct() { 
     $functionName = myFunction; 

     if (isset($_GET['functionName']) 
       && $_GET['functionName'] == $functionName)){ 

      myFunction(); 
     } 
     else { 
      echo "Function not found"; 
     } 
    } 
} 
+0

인스턴스를 빌드하지 않으면 시작되지 않습니다. – sics

7

이 하나

$urlParams = explode('/', $_SERVER['REQUEST_URI']); 
$functionName = $urlParams[2]; 
$functionName($urlParams); 


function func1 ($urlParams) { 
    echo "In func1"; 
} 

function func2 ($urlParams) { 
    echo "In func2"; 
    echo "<br/>Argument 1 -> ".$urlParams[3]; 
    echo "<br/>Argument 2 -> ".$urlParams[4]; 
} 

을 시도하고 URL은 다음과 같습니다 당신이 가서 여기
http://domain.com/url.php/func1
http://domain.com/url.php/func2/arg1/arg2

4

수 있습니다. 이건 정말 간단합니다. 특정 기능 만 호출하고 기본 기능을 수행합니다.

<?php 

if (isset($_GET['p'])) $linkchoice=$_GET['p']; 
else $linkchoice=''; 

switch($linkchoice){ 

case 's' : 
    firstfunc(); 
    break; 

case 'second' : 
    secondfunc(); 
    break; 

default : 
    echo 'no function'; 

} 

?> 
+0

IMHO, 이것이 최선의 방법입니다. – ShiningLight

0

저는 이것을 내 웹 사이트에서 사용하고 있습니다. 이 형식을 간단하게 사용하려면 www.something.com/myscript.php?function=myFunction&arg=foo&otherarg=bar URL에서 args를 호출하는 것이 중요하지 않으며 원하는만큼 많은 args를 가질 수 있습니다.

<?php 
     if(isset($_GET["function"])&&!empty($_GET)){ 
      $function = $_GET["function"]; 
      unset($_GET["function"]); 
      $canexec = array(
       "function name that can be executed", 
       "function name that can be executed", 
       "function name that can be executed" 
      ); 
      if(!in_array($function,$canexec)){ 
       die("That function cannot be executed via url."); 
      } 
      $args = array(); 
      if(count($_GET)>0){ 
       //handle args 
       foreach($_GET as $arg){ 
        array_push($args,$arg); 
       } 
      } 
      $result = call_user_func_array($function,$args); 
      //this part is only necessary if you want to send a response to a http request. 
      if(is_bool($result)){ 
       die(($r)?'true':'false'); 
      } 
      else if(is_array($result)){ 
       die(json_encode($result)); 
      } 
      else { 
       die($result); 
      } 
     } 
     myFunction($foo,$bar){ 
      echo $foo." ".$bar; 
     } 
    ?> 
0
//Register Hooks 
$hooks = ['lang','score']; 


function parseHook() { 
    if (isset($_GET['_h'])) { 
     return $hook = explode('/', filter_var(rtrim($_GET['_h'], '/'), FILTER_SANITIZE_URL)); 
    } else { 
     return false; 
    } 
} 


$hook = parseHook(); 


if ($hook && in_array($hook[0],$hooks) && function_exists($hook[0])) { 
    $callMe = $hook[0]; 
    unset($hook[0]); 
    $params = $hook ? array_values($hook) : []; 
    $callMe($params); 
} 

function lang($params) { 
    $Lib = new Lib(); 
    $Lib->printWithPreTag($params); 
} 

function score($params) { 
    $Lib = new Lib(); 
    $Lib->printWithPreTag($params); 
} 

//&_h=hookname/par1/par2/par3 
관련 문제