PROBLEMA Evitare SQL injection

EliaRomano

Nuovo Utente
28
1
Buon giorno a tutti! Io sto cercando di creare una pagina admin dove sia possibile anche (inserendo del testo) creare nuove pagine. Il problema viene quando devo inserire degli apostrofi. Quando mi sono accorto di questo problema sono subito ricorso a mysqli_real_escape_string($connessione, $stringa) e naturalmente ha funzionato inserendomi correttamente il testo nel database. Il problema ora sorge nel momento in cui voglio prendere quel testo e inserirlo nella nuova pagina che deve essere creata... a questo punto infatti mi viene trascritto anche \ vicino agli apostrofi, cosa che non voglio. Qualcuno mi sa consigliare in maniera abbastanza dettagliata quale può essere un altro metodo per evitare la SQL injection? Calcolate che tutto quello che so sulla programmazione l'ho imparato da youtube e internet quindi la mia conoscenza è abbastanza ridotta. E poi non ho neanche trovato nulla di decente che mi spiegasse una cosa di questo tipo.

Il mio codice attuale è il seguente:
Codice:
<form action="#" method="POST" enctype="multipart/form-data">
                        <tr>
                            <td></td>
                            <td><input type="text" name="nomeevento" placeholder="Evento" class="textAdmin"></td>
                            <td><textarea name="descrizione" id="msg" cols="30" rows="10" placeholder="Scrivi qui la descrizione dell'evento ..."></textarea><br/><span id="conteggio"></span></td>
                            <td><p>Data: </p><input type="text" placeholder="<?php echo date('d/m/Y', time()); ?>" name="data" class="textAdmin"><br><p>Orario: </p><input type="text" name="ora" placeholder="<?php echo date('H:i', time()); ?>" class="textAdmin"></td>
                            <td><input type="file" name="nomeimg"></td>
                            <td></td>
                            <td><button class="home hover" name="addevent" type="submit">Aggiungi Evento</button></td>
                        </tr>
                    </form>
                    <?php
                        if(isset($_POST['addevent'])){
                           
                            // Aggiunta Dati a Database
                            $NomeEventoText = $_POST['nomeevento'];
                            $DescrizioneText = $_POST['descrizione'];
                            $Data = $_POST['data'];
                            $Ora = $_POST['ora'];
                            $Immagine = $_POST['nomeimg'];
                           
                            $NomeEvento = mysqli_real_escape_string($connessione, $NomeEventoText);
                            $Descrizione = mysqli_real_escape_string($connessione, $DescrizioneText);
                           
                            if(!empty($NomeEvento) && !empty($Descrizione) && !empty($Data) && !empty($Ora)){
                                $query = "INSERT INTO `eventiorganizzati`(`nomeevento`, `descrizione`, `data`, `ora`, `nomeimmagine`) VALUES  ('$NomeEvento', '$Descrizione', '$Data', '$Ora', '$Immagine')";

                                $inserisciDati = mysqli_query($connessione,$query);

                                header("Location: index.php?EventoAggiunto=$NomeEvento");

                                if(!$inserisciDati){
                                    die('Query fallita' . mysqli_error($connessione));
                                    echo "Errore inserimento dati";
                                }
                            }else{
                                header("Location: index.php?EventoNonAggiunto");
                                echo "Inserire tutti i dati necessari";
                            }
Ringrazio tutti coloro che mi vorranno aiutare
Post automatically merged:

Forse ho risolto... ditemi se sto dicendo una cavolata o meno... comunque funziona.
Riflettendoci un attimo la risposta è molto semplice: io ho creato una variabile $DescrizioneText di cui poi ho fatto l'escape inserendolo in una variabile $Descrizione. Se creando la nuova pagina uso la prima variabile invece che la seconda mi inserisce il testo come interessa a me senza crearmi problemi
 
Ultima modifica:

DispatchCode

Utente Attivo
924
575
CPU
Intel i7 6700HQ, 2.60Ghz, 4 core 8 threads
Scheda Madre
Asustek
HDD
Hitachi 7200 rpm, 1TB
RAM
16GB DDR4 (2 slot su 4)
GPU
Nvidia Geforce GTX 960M, 4GB
Audio
Realtek
Net
30Mbps/3Mbps con Eolo
OS
Windows 10 64bit
Non è il modo corretto quello che stai seguendo.
Dovresti usare stripslashes quando vai a leggerla.

Comunque un modo migliore (ed è consigliato) è quello di utilizzare PDO. Qui fai il bind dei parameteri e poi viene eseguita la query.
Qui trovi un esempio che ti chiarirà sicuramente l'utilizzo: https://www.php.net/manual/en/pdostatement.bindvalue.php

Ah, se posso aggiungere un consiglio: cerca di separare un pò la logica dell'applicazione dalla parte grafica (le viste).
 

EliaRomano

Nuovo Utente
28
1
Ah, se posso aggiungere un consiglio: cerca di separare un pò la logica dell'applicazione dalla parte grafica (le viste).

A cosa ti riferisci precisamente? Intendi di separare meglio diciamo la parte backend dalla frontend? Secondo te non lo sto facendo? Comunque quella è solo una piccola parte di oltre 400 righe di codice... in ogni caso ogni consiglio è bene accetto dato che sono ancora alle prime armi ??
 
Ultima modifica:

DispatchCode

Utente Attivo
924
575
CPU
Intel i7 6700HQ, 2.60Ghz, 4 core 8 threads
Scheda Madre
Asustek
HDD
Hitachi 7200 rpm, 1TB
RAM
16GB DDR4 (2 slot su 4)
GPU
Nvidia Geforce GTX 960M, 4GB
Audio
Realtek
Net
30Mbps/3Mbps con Eolo
OS
Windows 10 64bit
A cosa ti riferisci precisamente? Intendi di separare meglio diciamo la parte backend dalla frontend? Secondo te non lo sto facendo? Comunque quella è solo una piccola parte di oltre 400 righe di codice

Secondo me? No ?
Lo dico non per la presenza del PHP nell'HTML, che è inevitabile, ad esempio per mostrare dei dati tramite un ciclo, ma piuttosto ad esempio per la costruzione di una query direttamente nella pagina che presenta un form dei dati.
Questo mi fa anche pensare che ogni volta che fai una INSERT/UPDATE/SELECT scrivi sempre tutto da zero.

Poi visto che sei agli inizi, tutto è lecito, avrai tempo per adottare poi gli accorgimenti necessari con il progredire dell'esperienza e delle conoscenze. ;)
Ciò che invece ti consiglio di guardare già da ora, è PDO, per la costruzione delle query.

Poi una volta che avrai preso confidenza con PHP e il frontend, dai un occhio anche al pattern MVC (ma se non conosci la programmazione a oggetti (OOP), allora inizia da questa), che ti sarà utile non solo per scriverti qualcosa da zero (per afferrare i concetti, soprattutto) ma anche per avvicinarti ai framework, che di solito è il pattern che usano.
Ma qui sto andando un pò OT... ti ho detto queste cose solo perchè - magari - non ne avevi sentito parlare, e quindi potrebbero darti una direzione futura nella quale muoverti.
 
  • Like
Reactions: Moffetta88

EliaRomano

Nuovo Utente
28
1
Secondo me? No ?
Lo dico non per la presenza del PHP nell'HTML, che è inevitabile, ad esempio per mostrare dei dati tramite un ciclo, ma piuttosto ad esempio per la costruzione di una query direttamente nella pagina che presenta un form dei dati.
Questo mi fa anche pensare che ogni volta che fai una INSERT/UPDATE/SELECT scrivi sempre tutto da zero.

Poi visto che sei agli inizi, tutto è lecito, avrai tempo per adottare poi gli accorgimenti necessari con il progredire dell'esperienza e delle conoscenze. ;)
Ciò che invece ti consiglio di guardare già da ora, è PDO, per la costruzione delle query.

Poi una volta che avrai preso confidenza con PHP e il frontend, dai un occhio anche al pattern MVC (ma se non conosci la programmazione a oggetti (OOP), allora inizia da questa), che ti sarà utile non solo per scriverti qualcosa da zero (per afferrare i concetti, soprattutto) ma anche per avvicinarti ai framework, che di solito è il pattern che usano.
Ma qui sto andando un pò OT... ti ho detto queste cose solo perchè - magari - non ne avevi sentito parlare, e quindi potrebbero darti una direzione futura nella quale muoverti.
Grazie mille! Cercherò di fare come mi hai consigliato. Provo già da subito a studiarmi un po' i PDO (che avevo già cominciato ad usare ma che non avevo ancora studiato bene) e anche la OOP. Grazie ancora
Post automatically merged:

Quindi per esempio ti riferisci ad usare il PDO per connettersi al database (questo è solo un primo esempio che ho trovato) in questo modo:
Codice:
<?php
try{
    $dsn = "mysql:host=[ip host];dbname=[nome database]";
    $PDOconn = new PDO($dsn, "uname", "password");
    $PDOconn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}catch(PDOException $e){
    echo $e->getMessage();
}
?>

anziché connettermi così:
Codice:
<?php
$connessione = mysqli_connect('host','uname','password','dbname');
?>

Giusto?
 
Ultima modifica:

DispatchCode

Utente Attivo
924
575
CPU
Intel i7 6700HQ, 2.60Ghz, 4 core 8 threads
Scheda Madre
Asustek
HDD
Hitachi 7200 rpm, 1TB
RAM
16GB DDR4 (2 slot su 4)
GPU
Nvidia Geforce GTX 960M, 4GB
Audio
Realtek
Net
30Mbps/3Mbps con Eolo
OS
Windows 10 64bit
Si esatto.
Non so se hai un minimo di familiarità con la OOP, ma ciò che hai visto nell'esempio è la creazione di un oggetto (in questo caso PDO).
Se guardi la doc, in particolare https://www.php.net/manual/en/pdo.construct.php vedrai un esempio con dati completi:

PHP:
<?php
/* Connect to a MySQL database using driver invocation */
$dsn = 'mysql:dbname=testdb;host=127.0.0.1';
$user = 'dbuser';
$password = 'dbpass';

try {
$dbh = new PDO($dsn, $user, $password);
} catch (PDOException $e) {
echo 'Connection failed: ' . $e->getMessage();
}

?>
 

Entra

oppure Accedi utilizzando

Hot: PS5 VS XBOX X/S?

  • Playstation 5

    Voti: 442 63.2%
  • XBOX Series X/S

    Voti: 257 36.8%

Discussioni Simili