Lavorare direttamente con $ _POST è sicuro?

0

Lavoro con PHP per alcune settimane e mi scuso se la domanda è così banale e sciocca. Ma cercate scrypt php qui e sapete che alcuni preferiscono controllare i valori ricevuti da un modulo direttamente con $ _POST mentre altri prima spostano il contenuto di $ _POST nelle variabili e quindi effettuano i controlli appropriati usando le variabili. Dal punto di vista della sicurezza ci sono differenze o non cambia nulla?

Questo è un esempio di scrypt che funziona direttamente con $ _POST:

if(isset($_POST['test'])) { if(strlen($_POST['test'])>=200) { echo "ok" } else { echo "no!" } }

E questo è un esempio di script che funziona con variabili:

if(isset($_POST['test'])) { $test = $_POST['test']; if(strlen($test)>=200) { echo "ok" } else { echo "no!" } }

    
posta J. Doe 06.09.2017 - 22:17
fonte

1 risposta

0

I tuoi esempi non riescono a illustrare il problema (e inoltre non seguono nessuno stile PHP di cui sono a conoscenza). È improbabile che si veda il problema fino a quando non si arriva a oltre 100 linee di codice.

(Non ho il tuo riferimento per scrypt).

Ci sono 2 problemi a cui si riferisce questa domanda: quella dell'ambito e quella della modifica dei dati. $ _POST è un superglobale, quindi i dati sono sempre in ambito senza essere dichiarati esplicitamente in un blocco. Questo ha alcuni vantaggi, ad es. sai sempre dove trovarlo Tuttavia, fare affidamento sui dati che si desidera elaborare presenti in $ _POST quando si scrive un metodo o una funzione significa che non è possibile riutilizzare questo metodo per altri dati.

Se ti assicuri di non modificare il valore originale, puoi sempre fare riferimento alla versione canonica. per esempio. se si verifica un errore nell'elaborazione e si desidera registrare gli input nonché, ad esempio, una traccia stack.

Il codice seguente sarebbe molto programmazione errata:

foreach ($_POST as $name=>$value) {
   $_POST['name']=mysqli_real_escape_string($connection, $value);
}

In caso di dubbio, la regola d'oro è

  • convalida l'input
  • trasforma l'output

$ _ POST, anzi tutti i superglobali tranne $ _SESSION, sono inseriti.

Le seguenti convenzioni e l'applicazione di buone pratiche di programmazione rendono il codice più gestibile, più facile da recensire e resistente agli errori, quindi meno probabile che abbia effetti collaterali inaspettati (cioè vulnerabilità).

Se lo avessi chiesto, per esempio StackOverflow, mi aspetto che un po 'di burla avrebbe messo in evidenza che il dereferenziamento di un superglobale è più lento di una variabile locale. Nello stesso modo in cui sputando nell'oceano si alza il livello dell'acqua. Tuttavia, anche se penso che questa sia una domanda sulla sicurezza, ho il sospetto che potresti ottenere un feedback migliore su un forum diverso.

    
risposta data 06.09.2017 - 23:11
fonte

Leggi altre domande sui tag