2017-05-10 7 views
0

を処理するために、変数のメソッドを呼び出すと、私は$ _POSTパラメータactionmoduleは、Ajaxリクエスト

if (isset($_POST["action"])) { 
    $action = strtolower($_POST["action"]); 

    if ($action === "get_notification") { 
     // return session notification messages 
     //... 

    } elseif (isset($_POST["module"])) { 
     require_once("libraries/class.module.php"); 
     $module = new Module; 

     $moduleName = strtolower($_POST["module"]); 

     // check if module-name is valid 
     if ($module->verify($moduleName)) { 
      // load $modulename class 
      require_once("libraries/class.".$moduleName.".php"); 

      // factory used to create instance of $moduleName 
      require_once("libraries/class.factory.php"); 

      // note: moduleName class extends Module class 
      $module = $Factory->create($moduleName); 

      // verify method of $moduleName verifies action/method parameter 
      // using method_exists and cross-checking against a permitted methods list 

      if ($module->verify($action)) { 
       $message = $module->$action(); 
       echo json_encode($message); 

      } else { 
       // handle invalid requests 
       echo json_encode(["0", "Invalid request received"]); 
      } 

     } else { 
      // handle invalid requests 
      echo json_encode(["0", "Invalid request received"]); 
     } 

    } else { 
     // handle invalid requests 
     echo json_encode(["0", "Invalid request received"]); 
    } 

} else { 
    // handle invalid requests 
    echo json_encode(["0", "No request received"]); 
} 

で、AJAX要求を処理するためにcontroller.phpファイルを作ったしかし、私は、変数のメソッドを使用しないように助言するスタックオーバーフローにthis記事を読みます。それぞれ$actionをチェックし、対応するメソッドを呼び出すスイッチケースを選択する必要があります。これは、私がこの可変メソッドの解決策を選択した最初の理由であった、より多くのコードをもたらすでしょう。

+0

Yew、__you shall__クライアント(ブラウザ)がクラスをインポートして呼び出す必要があるパラメータとして変数を送信させることは、非常に危険です。 –

+0

あなたは本当に可能な行動をホワイトリストに載せるべきです。それはそこにあるすべてのフレームワーク(PHPかどうか)がすることです。それ以外は問題を求めています。 – ADyson

+0

@ADyson許可されているものをホワイトリストに載せるのではなく、禁止されているアクションをブラックリストに登録する方法を教えてください:) –

答えて

0

本当に必要なものが正しいルーティングシステムであるように見えます。あなたはそれを自分で作ることができます(hereと記載)。または、FastRouteのような既存のソリューションを使用します。

実際に「可変メソッド」を使用する場合、一般的には悪い考えです。しかし、これらのメソッドが(ブートストラップファイルから実行される)コールスタックの先頭にある場合、それらは実際には実用的なオプションです。

セキュリティ上の懸念がある場合、コントローラクラスの唯一のパブリックメソッドは、呼び出されると予想されるものです。つまり、あなたは単に行うことができます:

if (method_exists($controller, $action)) { 

P.S.strtolower()はPHPでクラスメソッドがではなく、であり、クラス名自体ではないため、strtolower()を実行する必要はありません。

P.P.S.作曲家をPSR-4オートローダとして使用してみる