PROBLEMA Evitare SQL injection

EliaRomano

Nuovo Utente
37
3
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 unito automaticamente:

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

Moderatore
Staff Forum
Utente Èlite
2,210
1,845
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
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
37
3
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

Moderatore
Staff Forum
Utente Èlite
2,210
1,845
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
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.
 
  • Mi piace
Reazioni: Moffetta88

EliaRomano

Nuovo Utente
37
3
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 unito automaticamente:

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

Moderatore
Staff Forum
Utente Èlite
2,210
1,845
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
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
Discord Ufficiale Entra ora!

Discussioni Simili