Visualizzazione dei risultati da 1 a 8 su 8

Discussione: Consiglio sicurezza su una query di login

  1. #1
    Utente di HTML.it L'avatar di Sonikag
    Registrato dal
    Mar 2004
    Messaggi
    1,914

    Consiglio sicurezza su una query di login

    Sto "aggiornando" il mio vecchio sistema di login che ancora usava mysql_connect per una connessione mysqli
    Il primo step è superato, però vorrei un parere sulla sicurezza.

    Codice PHP:
    $username htmlspecialchars($_POST['username'], ENT_QUOTES);
    $password sha1($_POST['password']);
    $qwt "SELECT * FROM utenticliente WHERE username =?";
    $stmt $connessione->prepare($qwt);
    $stmt->bind_param("s"$username);
    $stmt->execute();
    $result $stmt->get_result(); 
    Nella precedente versione per sicurezza la query era:
    codice:
    "SELECT * FROM utenticliente WHERE username ='" . mysql_real_escape_string($username) . "'"
    Quindi secondo voi anche senza il mysql_real_escape_string è comunque abbastanza sicuro? potrei fare altro?
    Grazie
    Sonia

  2. #2
    Quote Originariamente inviata da Sonikag Visualizza il messaggio
    Sto "aggiornando" il mio vecchio sistema di login che ancora usava mysql_connect per una connessione mysqli
    Il primo step è superato, però vorrei un parere sulla sicurezza.

    Codice PHP:
    $username htmlspecialchars($_POST['username'], ENT_QUOTES);
    $password sha1($_POST['password']);
    $qwt "SELECT * FROM utenticliente WHERE username =?";
    $stmt $connessione->prepare($qwt);
    $stmt->bind_param("s"$username);
    $stmt->execute();
    $result $stmt->get_result(); 
    Nella precedente versione per sicurezza la query era:
    codice:
    "SELECT * FROM utenticliente WHERE username ='" . mysql_real_escape_string($username) . "'"
    Quindi secondo voi anche senza il mysql_real_escape_string è comunque abbastanza sicuro? potrei fare altro?
    Grazie
    Sonia
    Certo, non si usa piu mysql_real_escape_string! Adesso si usano i bind param (così come hai già scritto nel tuo codice). Per essere più precisi puoi anche definire che tipo di elemento è la variabile che devi "supervisionare" http://php.net/manual/it/pdo.constants.php. Una sola cosa che non capisco (spero che qualcun altro intervenga) è perchè utilizzare i bind param all'interno di una query SELECT.

    PS. Puoi semplificare il codice scrivendo (non imporante)
    codice:
    $stmt = $connessione->prepare("SELECT * FROM utenticliente WHERE username =?");
    Invece di
    codice:
    $qwt = "SELECT * FROM utenticliente WHERE username =?";
    $stmt = $connessione->prepare($qwt);
    Ultima modifica di supersqualo; 14-12-2017 a 21:58

  3. #3
    Ho commesso un errore: stai usando mysqli e non pdo quindi non puoi utilizzare le costanti pdo!

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2016
    Messaggi
    295
    Puoi usare mysqli_real_escape_string

    Puoi o meno è come usare la funzione che avevi tu, solo che adesso i parametri sono invertiti, e devi per forza passare l'handle della connessione verso il db (ovviamente solo se usi la forma procedurale).

    Qui il link alla doc: http://php.net/manual/en/mysqli.real-escape-string.php

  5. #5
    Quote Originariamente inviata da M4V1 Visualizza il messaggio
    Puoi usare mysqli_real_escape_string

    Puoi o meno è come usare la funzione che avevi tu, solo che adesso i parametri sono invertiti, e devi per forza passare l'handle della connessione verso il db (ovviamente solo se usi la forma procedurale).

    Qui il link alla doc: http://php.net/manual/en/mysqli.real-escape-string.php
    Tu sai aiutarmi riguardo le query SELECT? A cosa servono i bindparam sulle query SELECT?

  6. #6
    Utente di HTML.it L'avatar di Sonikag
    Registrato dal
    Mar 2004
    Messaggi
    1,914
    Ho utilizzato i parametri perchè username e pass vengono da una form dove uno ci può scrivere qualsiasi cosa! Non per forza dell'injection, ma potrebbe metterci anche erroneamente un apostrofo che mi manda in ciccia tutta la query.
    Solitamente ommetto i parametri solo quando non vi è nessun dato inserito dall'utente.

    Supersqualo, in merito al tuo primo post per me è comodo sempre mettere la query in una variabile per "stamparla". Una volta eseguita la query ho uno script che mi sostituisce i ? con le variabili in modo da salvarle la query in un file di log per aver traccia di tutto e capire più facilemnte dove sono eventuali errori.

    Sonia

  7. #7
    Utente di HTML.it
    Registrato dal
    Sep 2016
    Messaggi
    295
    Per quanto riguarda la sicurezza:

    Io userei i prepared statement (magari passando a pdo) e lascerei perdere la funzione mysqli_real_escape_string che usi adesso, usarli entrambi secondo me è superfluo. I prepared statements invece ti danno una sicurezza ottima in quanto la query viene inviata al db quando viene "preparata" e da quel momento non è modificabile. Quindi inviare dati contenenti vettori di sql injection non servirà a nulla.

    Per quanto riguarda la domanda sulla select:

    puoi fare sql injection anche sulle select, quindi è necessario usare i prepared statement anche li.

  8. #8
    Quote Originariamente inviata da Sonikag Visualizza il messaggio
    Supersqualo, in merito al tuo primo post per me è comodo sempre mettere la query in una variabile per "stamparla". Una volta eseguita la query ho uno script che mi sostituisce i ? con le variabili in modo da salvarle la query in un file di log per aver traccia di tutto e capire più facilemnte dove sono eventuali errori.

    Sonia
    Se la stampi solamente e non la esegui come fai a capire dov'è l errore? Per trovare l errore sicuramente la esegui e poi la salvi nel file di log!

    Quote Originariamente inviata da M4V1 Visualizza il messaggio
    Per quanto riguarda la sicurezza:

    Io userei i prepared statement (magari passando a pdo) e lascerei perdere la funzione mysqli_real_escape_string che usi adesso, usarli entrambi secondo me è superfluo. I prepared statements invece ti danno una sicurezza ottima in quanto la query viene inviata al db quando viene "preparata" e da quel momento non è modificabile. Quindi inviare dati contenenti vettori di sql injection non servirà a nulla.

    Per quanto riguarda la domanda sulla select:

    puoi fare sql injection anche sulle select, quindi è necessario usare i prepared statement anche li.
    Hai ragione, non avevo pensato alle SELECT generate... stavo pensando solo a quelle prestabilite! Grazie
    Ultima modifica di supersqualo; 15-12-2017 a 11:51

Tag per questa discussione

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2018 vBulletin Solutions, Inc. All rights reserved.