Qual è il modo corretto di estrarre e passare parametri per chiamare le funzionalità javascript dalla mia pagina PHP?

1

Questa è la mia situazione: ho una pagina dei risultati di ricerca in PHP dove la maggior parte della logica risiede in un file javascript per evitare di aggiornare la pagina ogni volta che viene eseguita un'azione. La prima cosa che faccio usando PHP è filtrare e salvare valori di stringa di query validi in variabili PHP e faccio uso della funzione htmlspecialchars per prevenire l'iniezione. Ora, mi piacerebbe chiamare la mia funzione javascript usando quelle variabili, così ho creato un tag script in fondo alla pagina per passare le variabili PHP ad esso (vedi il mio esempio).

Quando ho inserito tutto il mio codice javascript all'interno del suo ambito (mentre leggevo questa era una buona pratica di sicurezza), mi sono reso conto che non potevo più chiamare la mia funzione da fuori. Mi rendo anche conto che il metodo javascript può ancora essere chiamato con qualsiasi cosa l'hacker voglia, quindi vuol dire che non posso davvero usare htmlspecialchars nella mia situazione?

Ecco una versione ridotta del mio codice:

<?php
try {       
  if (isset($_GET["id"])) {
    if (!is_numeric($_GET["id"]))
      throw new Exception("URL is not in a correct format");
    $id= $_GET["id"];
  }
  elseif (isset($_GET["keyword"])) {
    $keyword = htmlspecialchars($_GET["keyword"]);
  }
}
catch (Exception $e) {
  // handle error
}
?>
<html>
<head></head>
<body>
  <div class="searchResults"><!-- placeholder --></div>
  <?php
  if (isset($id)) { 
    echo '<script type="text/javascript">ShowSearchResults("id",'.$id.');</script>';        
  }
  elseif (isset($keyword)) { 
    echo '<script type="text/javascript">ShowSearchResults("keyword","'.$keyword.'");</script>'; 
  }
  ?>
</body>
</html>

Questo è fondamentalmente il js:

function ShowSearchResults(key,value)
{
    $.getJSON("includes/search_results.php?"+key+"="+value, 
    function(data) {
      // populate search results
      $(".searchResults").html( "search results" );
    })
    .error(function() { 
       $(".searchResults").html( "no results" );
    });
}

Le mie domande sono (tenendo a mente la sicurezza e le migliori pratiche):

È una cattiva pratica passare i valori della stringa di query alla mia funzione javascript dall'interno del corpo? Inizialmente l'ho fatto perché avevo l'impressione che non fosse una buona idea estrarre i valori della stringa di query usando javascript. Forse ho torto lì.

Dovrei estrarre i valori della stringa di query dalla funzione $ (documento) .ready e poi chiamare le funzioni javascript appropriate da lì? Qual è il modo appropriato per farlo (equivalente a htmlspecialchars)?

Ricorda che all'interno del mio codice javascript, uso $ .getJSON per chiamare un'altra funzione lato server (in PHP) che può rifiutare qualcosa di non sicuro.

Qualsiasi intuizione sarebbe molto apprezzata.

    
posta http203 18.05.2014 - 17:59
fonte

1 risposta

2

Copia solo una delle funzioni da post di Overflow dello stack sul recupero dei valori da una stringa di query e riutilizzalo nel codice JavaScript, come questa funzione:

function getParameterByName(name) {
    name = name.replace(/[\[]/, "\[").replace(/[\]]/, "\]");
    var regex = new RegExp("[\?&]" + name + "=([^&#]*)"),
        results = regex.exec(location.search);
    return results == null ? "" : decodeURIComponent(results[1].replace(/\+/g, " "));
}

Non c'è niente di sbagliato nel tirare i parametri dalla stringa di query nel codice JavaScript finché non esegui nulla dalla stringa della query. L'equivalente JavaScript di htmlspecialchars è qui .

Tuttavia, se il $id non proviene dalla stringa della query, ammettiamo che proviene direttamente dal tuo server, sarebbe opportuno inserirlo nel tuo codice HTML e accedervi da JavaScript. (Prova a premere ctrl-u ora e guarda l'HTML di questa pagina).

    
risposta data 18.05.2014 - 19:16
fonte

Leggi altre domande sui tag