Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 26
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2012
    Messaggi
    144

    sicurezza in un sito web e sql injection

    Buongiorno a tutti!
    non so se ho postato nella sezione giusta.
    Vorrei dei chiarimenti in merito a due aspetti che mi sono venuti in mente così mentre stavo progettando un sito e essendo alle prime armi non ho trovato una risposta.
    La prima:
    come prevenire sql injection? io tutte le stringhe che vanno a formare la query le filtro con my_sql_real_escape. è sufficiente? se non lo è mi consigliate ?

    la seconda:

    durante ad esempio il login io compilo un form con nome utente e password in "chiaro" utilizzando il metodo POST. ma qualcuno potrebbe intercettare questi dati? e come evitarlo?
    grazie mille a tutti

  2. #2
    Utente bannato
    Registrato dal
    Dec 2012
    Messaggi
    679

    Re: sicurezza in un sito web e sql injection

    Originariamente inviato da lorenzo84
    Buongiorno a tutti!
    non so se ho postato nella sezione giusta.
    Vorrei dei chiarimenti in merito a due aspetti che mi sono venuti in mente così mentre stavo progettando un sito e essendo alle prime armi non ho trovato una risposta.
    La prima:
    come prevenire sql injection? io tutte le stringhe che vanno a formare la query le filtro con my_sql_real_escape. è sufficiente? se non lo è mi consigliate ?
    E' un inizio, ma puoi adottare politiche decisamente più restrittive.
    Una ad esempio è la ricerca dei ;
    Un'altra è la ricerca dei token SQL indebiti
    la seconda:

    durante ad esempio il login io compilo un form con nome utente e password in "chiaro" utilizzando il metodo POST. ma qualcuno potrebbe intercettare questi dati? e come evitarlo?
    grazie mille a tutti
    E' possibile intercettare questi dati se (probabilità decrescenti)

    1) si ha la collaborazione del tuo provider
    2) o quella del provider dell'utente
    3) o di un carrier principale con ad esempio un BGE
    4) virus-malware-etc
    5) qualcuno in grado di manipolare uno dei router intermedi
    6) come sopra per i DNS che vengono utilizzati
    7) qualcuno sulla tua sottorete birichino con una scheda in modalità promiscua

    A parte questi casi, che tipicamente riguardano l'ambito giudiziario, non è per nulla banale intercettare le informazioni che transitano, perfino in chiaro

  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2012
    Messaggi
    144
    ciao e grazie per la risposta.
    per intercettare il ; esiste qualche istruzione particolare? tempo fa avevo trova, sempre in php, una istruzione che eliminava eventuali tag html presenti in una stringa , strip_tags($stringa), potrebbe essere utile?
    tipo eseguire una serie di istruzioni del tipo:
    my_sql real escape
    striptags
    controllo caratteri speciali tipo html entities?

    è una cosa questa, del filtrare i dati in modo che nel db mi arrivino i dati che mi aspetto, che non riesco a capire cioè non riesco a trovare uno standard "sicuro".

  4. #4
    Utente di HTML.it L'avatar di boots
    Registrato dal
    Oct 2012
    Messaggi
    1,626
    con mysql_real_escape dovresti andare sul sicuro, anche se sarebbe meglio:

    Usare sempre gli apici per delimitare un valore.
    Non dovresti fare così:
    $query = "SELECT * FROM table WHERE id=". $id;
    ma
    $query = "SELECT * FROM table WHERE id='{$id}'";
    Anche se hai passato $id con mysql_real_escape

    Inoltre, quando puoi fai il cast con il tipo giusto:
    $id = (int)$id; // Se $id è un intero;

    Per il secondo punto: Http è insicuro by design. Tutto ciò che viaggia con questo protocollo è in chiaro. Se qualcuno sulla tua stessa rete "sniffa" il traffico legge con facilità password o altro.
    L'unico modo per essere sicuro (ma neanche troppo ) è usare https

  5. #5
    Utente di HTML.it
    Registrato dal
    Apr 2012
    Messaggi
    144
    Originariamente inviato da boots
    con mysql_real_escape dovresti andare sul sicuro, anche se sarebbe meglio:

    Usare sempre gli apici per delimitare un valore.
    Non dovresti fare così:
    $query = "SELECT * FROM table WHERE id=". $id;
    ma
    $query = "SELECT * FROM table WHERE id='{$id}'";
    Anche se hai passato $id con mysql_real_escape

    Inoltre, quando puoi fai il cast con il tipo giusto:
    $id = (int)$id; // Se $id è un intero;

    Per il secondo punto: Http è insicuro by design. Tutto ciò che viaggia con questo protocollo è in chiaro. Se qualcuno sulla tua stessa rete "sniffa" il traffico legge con facilità password o altro.
    L'unico modo per essere sicuro (ma neanche troppo ) è usare https
    quindi dovrei fare un cast del tipo di dato che mi aspetto arrivi nel db. ma real escape comprende anche caratteri speciali e tag html?

    quindi ricapitolando dovrei:
    ricevere i dati via GET o POST
    passarli in mysql real escape
    fare il cast
    e metterle in una query mettendo le variabili fra graffe?

    scusa una curiosità ma le graffe con la variabile dentro cosa vorrebbe dire?

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Visto che, comunque, il linguaggio specifico che stai usando è PHP, credo sia più utile (per te), che io sposti la discussione nel forum PHP, dove sicuramente troverai altri sviluppatori che queste problematiche le hanno già incontrate e, magari, anche risolte elegantemente usando proprio PHP come riferimento.

    Sposto.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  7. #7
    Utente di HTML.it L'avatar di boots
    Registrato dal
    Oct 2012
    Messaggi
    1,626
    Le graffe sono solo un modo per inserire una variabile in una stringa. Potevo scrivere anche
    $query = "SELECT * FROM table WHERE id='".$id."'";
    Quello che dicevo è di usare gli apici

    Perchè se io ho ad esempio
    $query = "SELECT * FROM table WHERE id=". $id;
    ed qualcuno passa come $id = "1; Delete from table;"
    Anche se la passi a mysql_real_escape, otterrai sempre

    $query = "SELECT * FROM table WHERE id=1; DELETE from table;"
    Che sono due query sql.
    In questo caso, visto che ti spetti un id numerico, puoi fare anche il cast in modo che la stringa passata diventa un semplice numero

  8. #8
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,505
    Originariamente inviato da boots
    ...
    Perchè se io ho ad esempio
    $query = "SELECT * FROM table WHERE id=". $id;
    ed qualcuno passa come $id = "1; Delete from table;"
    Anche se la passi a mysql_real_escape, otterrai sempre

    $query = "SELECT * FROM table WHERE id=1; DELETE from table;"
    Che sono due query sql.
    ...
    Il che però non è un problema visto che mysql_query() può eseguire una sola query.

  9. #9
    Utente di HTML.it
    Registrato dal
    Apr 2012
    Messaggi
    144
    un'ultima cosa riguardo all'sql iniection.
    Leggendo la guida sulla sicurezza http://www.html.it/pag/16878/sql-injections/ trovo che il malintenzionato potrebbe inserire dei caratteri e stringhe in una query per introdursi e ottenere ad esempio la lista utenti del db.
    SELECT * FROM tabella_utenti
    WHERE usr=’qualsiasi_nome’ OR 1 — ‘ AND pwd=’qualsiasi_stringa’;

    ma io la query la imposto nella pagina in php e non la creo. O meglio la creo ma solo dopo aver sistemato le variabili e costruito la query. è rischioso lo stesso?

    le mie query generalmente le faccio cosi:

    select * from nometabella where id=$id se è un numero
    select * from nometabella where id='$nome' se è un numero

    va bene?

  10. #10
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,505
    Originariamente inviato da lorenzo84
    ...
    le mie query generalmente le faccio cosi:

    select * from nometabella where id=$id se è un numero
    select * from nometabella where id='$nome' se è un numero

    va bene?
    Si, ma se nella variabile $id c'è dentro 5 OR 1

    la query che generi è

    select * from nometabella where id=5 OR 1

    che equivale a un WHERE sempre verificato grazie al OR 1, in questo modo viene preso tutto il contenuto della tabella.

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 © 2025 vBulletin Solutions, Inc. All rights reserved.