Securitate Apelare functie dinamic in php din Ajax

Discutii si intrebari legate de scripturi si functii JavaScript, jQuery si Ajax, cod JavaScript in general.
sterica
Mesaje:285

Securitate Apelare functie dinamic in php din Ajax

Salutare,
Am urmatorul cod js:

Cod: Selectaţi tot

function fetch_select(){
  val_name = $('#name').val();
  $.ajax({
    type: 'POST',
   url: 'include/get_db.inc.php',
   data: {
           name: val_name,
   },
   success: function (response) {
     document.getElementById('higtchart_medie_gen').innerHTML=response;
     columnChart( JSON.parse(response));
    }
  });
}

function columnChart(data_v){
  if(data_v.length >0){
    $(function () {
     $('#higtchart_medie_gen').highcharts({
       chart: {
        type: 'column'
       },
......
si functia php (in fisier sunt mai multe functii)

Cod: Selectaţi tot

<?php
function test_name () {
  $ret = [];
  if(isset($_POST['name'])){
    $name = $_POST['name'];
    $sql = "SELECT
            ......
            WHERE ID = $name ";
    $result = $conn->query($sql);
    if($result->num_rows > 0){
      while($row = $result->fetch_assoc()) {
        $ret [] = [$row['NAME'] . ' ' . $row['LASTN'], floatval($row['AVGG'])];
      }
    }
  }
  if(count($ret) >1) echo json_encode($ret);
  else echo 'Not working';
}
?>
Pentru a o putea apela am incercat ceva de genul:
in ajax la url am adaugat: include/get_db.inc.php?action=test_name iar in php vreau sa adaug:

Cod: Selectaţi tot

$actions = ['nume_functie_1', 'nume_functie_2'];

if (isset($_GET['action']) && is_string($_GET['action']) && in_array($_GET['action'], $actions))) {
    call_user_func($_GET['action'], $conn);
}

sau 

switch($_GET['action']) {
   case "nume_functie_1":
       call_user_func($_GET['action'], $conn);
       break;
   case "nume_functie_2":
        call_user_func($_GET['action'], $conn);
        break;
   // etc.
   default:
   // banez utilizatorul.
   break;
}
Artificiul meu in creeaza o gaura in securitatea siteului. Nu ma pricep foarte bine la securitate php, cum as putea apela functia din php fara a-mi "gauri" siteul.

Multumesc!

MarPlo Mesaje:4343
Salut
Pentru o siguranta mai buna poti face asa:
1. Ca sa nu apara numele functiei in adresa de apelare, trimiti prin POST o referinta /cheie la numele ei setat in php.

Cod: Selectaţi tot

$.ajax({
  type: 'POST',
  url: 'include/get_db.inc.php',
  data: {
    name: val_name,
    nf: 'f1'
  }
  //...
}
2. Iar in php asa:

Cod: Selectaţi tot

$actions =['f1'=>'nume_functie_1', 'f2'=>'nume_functie_2'];

if(isset($_POST['nf']) && isset($actions[$_POST['nf']])){
  call_user_func($actions[$_POST['nf']], $conn);
}

sterica Mesaje:285
Super intelegenta miscare. Multumesc mult MarPlo