Pagina 1 di 4 1 2 3 ... ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 31
  1. #1

    evitare sql injection e simili

    ho fatto 1 piccolo guestbook per il mio sito dove tramite una banale insert metto i messaggi nel database.

    per garantire una certa sicurezza avevo pensato di sostituire una serie di caratteri con lo spazio vuoto per evitare sql injection.


    io sostituirei <,>,",'
    ci sono altri caratteri "pericolosi"?altre possibili minacce da sventare?
    grazie a tutti

  2. #2

  3. #3
    Ti basta utilizzare htmlentities() prima di memorizzare la variabile in database

    Codice PHP:
    $testo htmlentities($_POST['testo']);
    mysql_query("INSERT INTO tabella (testo) VALUES ('$testo')"); 
    questo per quanto riguarda l'SQL injection.

    Quando devi stampare il testo, dovrai riconvertire le entità in codice html:

    Codice PHP:
    $row mysql_fetch_assoc(mysql_query("SELECT testo FROM tabella"));
    $testo html_entity_decode($row['testo']); 
    A questo punto però sei vulnerabile agli attacchi XSS.

    Per fare ciò devi eliminare tag come <script> e <iframe>


    Codice PHP:
    function strip_selected_tags($text$tags = array()) {
        
    $args func_get_args();
        
    $text array_shift($args);
        
    $tags func_num_args() > array_diff($args,array($text)) : (array)$tags;
        foreach (
    $tags as $tag){
            if(
    preg_match_all('/<'.$tag.'[^>]*>([^<]*)<\/'.$tag.'>/iu',$text,$found) ){
                
    $text str_replace($found[0],$found[1],$text);
            }
        }
        return @
    $text;
    }

    $strip = array('iframe','script');
    $testo strip_selected_tags($testo,$strip); 
    Questo è un modo, ma ve ne sono molti altri

  4. #4
    grazie 1000 per il codice di esempio e per i link

  5. #5
    Originariamente inviato da mem
    Ti basta utilizzare htmlentities() prima di memorizzare la variabile in database

    Codice PHP:
    $testo htmlentities($_POST['testo']);
    mysql_query("INSERT INTO tabella (testo) VALUES ('$testo')"); 
    questo per quanto riguarda l'SQL injection.
    Per favore, se non hai le competenze necessarie, ti prego di non dare suggerimenti in merito alla sicurezza.

    L'utilizzo di htmlentities() (senza ENT_QUOTES) NON protegge da SQL Injection. Con magic quotes disattivi, il codice che hai postato e' aperto a SQL Injection (gli apici singoli non vengono escapati ne convertiti).

  6. #6
    ma tralasciando un attimo che il messaggio verrebbe leggermente storpiato, ma se io sostituissi tutti i caratteri speciali con uno spazio dovrei essere al sicuro da qualunque attacco giusto?
    non permettendo a nessuno di inserire codice javascript,php o query sql..

  7. #7
    Perche' "storpiare" un messaggio se basta utilizzare le funzioni di escaping fornite dal PHP?

  8. #8
    Originariamente inviato da filippo.toso
    Per favore, se non hai le competenze necessarie, ti prego di non dare suggerimenti in merito alla sicurezza.

    L'utilizzo di htmlentities() (senza ENT_QUOTES) NON protegge da SQL Injection. Con magic quotes disattivi, il codice che hai postato e' aperto a SQL Injection (gli apici singoli non vengono escapati ne convertiti).
    Ehm, se mi sono dimenticato di mettere un argomento dalla fretta, non hai bisogno di passare per il via con la bocca piena di roba poco commestibile, non stiamo giocando a monopoli, è sufficiente correggere il mio errore... a me mamma ha insegnato un pochino di educazione

  9. #9
    Questo è un modo, ma ve ne sono molti altri
    Un quesito:
    mi sto impratichendo con le espressioni regolari.
    se nel form/login autorizzo solo i caratteri della classe [a-z,A-Z]...

    non sarei già a posto ?

    stefano

  10. #10
    No perché io malintenzionato potre provocandoti un SQL injection anche attraverso la password, e questo vale per tutti i campi che interagiscono con le query del tuo database

    Se ad esempio il tuo controllo nella query fosse il seguente:

    Codice PHP:
    "SELECT * FROM utenti WHERE user='".$_POST['user']."' AND pass='".$_POST['password']."'" 
    Potrei inviare come password la seguente stringa: ' OR 1='1

    con questo risultato:

    Codice PHP:
    "SELECT * FROM utenti WHERE user='xxxx' AND pass='' OR 1='1'" 
    Non importa quale valore assumeranno user e pass, io ho un 1=1 il quale è sempre vero, ottenendo probabilmente l'accesso alle pagine riservate

    Se invece converto gli apici nella sua entità html, cioè &amp;#039; otterrei:

    Codice PHP:
    "SELECT * FROM utenti WHERE user='xxxx' AND pass='' OR 1='1'" 
    in cui la password è &amp;#039; OR 1=&amp;#039;1 ottenendo login errato

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.