|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Jul 2007
Città: Bordighera (IM)
Messaggi: 1047
|
[PHP] SQL-INJECTION
Ciao a tutti, premetto che programmo in PHP da pochissimo. Ho sentito parlare di SQL-Injection dal mio prof e mi sono informato su cos'è. Ho capito il funzionamento, ma per prevenire questi attacchi non ho le idee chiarissime... però mi è venuta in mente una soluzione (che probabilmente esiste già) cioè controllare col javascript ogni singolo carattere inserito nel form (ad esempio dando un range dei caratteri ASCII validi) e se qualche carattere può risultare pericoloso il login fallisce, altrimenti si procede con lo script di login. Può essere un idea fattibile? Ce ne sono altre molto più semplici da implementare? La mia idea è facilmente bypassabile? Grazie a tutti quelli che risponderanno in anticipo
__________________
.:Programmatore web e Windows, WebDesigner - Portfolio:. TRATTATIVE CONCLUSE: 10 TUTTE POSITIVE! Case Corsair 240 *** CPU AMD 1700 *** MotherBoard Asus PRIME B350M *** VGA Nvidia Zotac GTX1060 6gb *** RAM Corsair 16gb DDR4 *** PSU Corsair CX650M *** SSD Samsung 850 evo 500gb *** HardDisk 1tb |
|
|
|
|
|
#2 | |
|
Senior Member
Iscritto dal: Mar 2006
Città: Bergamo
Messaggi: 2499
|
Quote:
queste sono le idee di base, conta che esistono funzioni specifiche di php proprio per queste necessità e anche funzioni specifiche per il motore sql (ad esempio per mysql)
__________________
ho concluso con: kvegeta, doctordb, Leland Gaunt.
|
|
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: May 2005
Città: Napoli - Fuorigrotta
Messaggi: 471
|
Utilizzare solo javascript non è abbastanza, basta infatti avere un tool specifico per disabilitarlo, così la tua protezione cadrebbe.
La prima cosa da fare è vietare l'utilizzo del carattere di apice nei campi username e password, se li utilizzi tu all'interno delle query sql; questo però non è abbastanza, in quanto potrebbero utilizzare dei valori che fanno inceppare l'engine sql. Bisogna fare uno studio approfondito che, come già suggerito, dipende dal motore sql che utilizzi. Una veloce ricerca ha tirato fuori questo esempio: Codice:
<?php
// Quote variable to make safe
function quote_smart($value)
{
// Stripslashes
if (get_magic_quotes_gpc()) {
$value = stripslashes($value);
}
// Quote if not a number or a numeric string
if (!is_numeric($value)) {
$value = "'" . mysql_real_escape_string($value) . "'";
}
return $value;
}
// Connect
$link = mysql_connect('mysql_host', 'mysql_user', 'mysql_password')
OR die(mysql_error());
// Make a safe query
$query = sprintf("SELECT * FROM users WHERE user=%s AND password=%s",
quote_smart($_POST['username']),
quote_smart($_POST['password']));
mysql_query($query);
?>
__________________
Acquisti sul mercatino: grabrihc, LucaXbox360, Yarsha,micanto1,American horizo,Fnac,schumyFast,STECCO,Ezechiele25,17 Vendite sul mercatino: musodatopo,alexbands,mspr,anto.wajo |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Mar 2007
Messaggi: 7863
|
Javascript non serve a nulla in questi casi, perchè la richiesta può essere inviata bypassando il js stesso.
|
|
|
|
|
|
#5 |
|
Registered User
Iscritto dal: Aug 2006
Messaggi: 305
|
L'utilizzo di JEE invece di PHP è un buon rimedio
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Mar 2007
Messaggi: 7863
|
Non vuol dire assolutamente nulla. Tutti i linguaggi server side forniscono gli strumenti necessari, a patto che il programmatore sia in grado di saperli far fruttare.
Per quanto nn mi piaccia il PHP non è in questa circostanza che si può mettere in evidenza la superiorità di altri linguaggi come J2EE. |
|
|
|
|
|
#7 |
|
Registered User
Iscritto dal: Aug 2006
Messaggi: 305
|
io parlo per esperienza personale. Non conosco molto php, ma conosco bene il problema della injection. In JEE l'injection è difficile che funzioni persino se il progettista si impegna a fare in modo che funzioni.
Esempio: Codice:
public boolean login(String username, String password) {
Query q=em.createQuery("FROM Utente u WHERE u.username=:PARAM");
q.setParameter("PARAM", username);
Utente u =(Utente)q.getSingleResult();
if(u.getPassword().equals(password)) return true;
else return false;
}
Inoltre ho provato anche a inserire injection con DROP TABLE ecc, prese da siti qua e là e non hanno mai funzionato, senza che io progettista nemmeno ci pensassi ad evitare che funzionassero. Infine utilizzando JPQL invece di SQL puro si rende la vita ancora più difficile all'aspirante hacker Ultima modifica di Barbalbero : 04-08-2009 alle 22:48. |
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Quote:
Che mi dici di questo? Codice:
$dbConnection = new mysqli("localhost", "user", "pass", "db");
$statement = $dbConnection->prepare("SELECT * FROM Utente u WHERE u.username = ?");
$statement->bind_param("s", $username);
$statement->execute();
Come vedi in questo caso il linguaggio non c'entra niente. |
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Nov 2004
Città: Padova
Messaggi: 2342
|
se usi il php, penso che una funzione addslashes() possa prevenire la maggior parte dei tentativi (banali) di injection.
Eventualmente la funzione dedicata per il mysql è mysql_real_escape_string. In pratica non fa altro che aggiungere dei caratteri di escape prima dei caratteri speciali. Rimangono fuori alcuni caratteri quali % che viene usato nella sintassi del LIKE, eventualmente lo correggi a mano, sempre via php.
__________________
CPU Ryzen 2600 @ 3,95Ghz + Bequiet Dark Rock TF / MB Asus X470-F Gaming / RAM 2x8GB DDR4 G.Skill FlareX 3200 CL14 / VGA Sapphire RX 7900 XT Nitro+ @ 3200Mhz / SSD Samsung 970 Pro 512GB + Sandisk 240GB Plus + Sandisk 960GB Ultra II PSU Seasonic Platinum P-660 / Headset Kingston HyperX Flight |
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Jul 2007
Città: Bordighera (IM)
Messaggi: 1047
|
ok alcune cose le ho capite cioè quello che mi interessava.. alcuni di voi sono troppo tecnici non mi sforzo nemmeno a cercare di capire
comunque il link di wikipedia è molto esaustivo grazie. quindi ci sono gli strumenti apposta lato server è inutile che provo altri metodi. vi ringrazio! ciao!
__________________
.:Programmatore web e Windows, WebDesigner - Portfolio:. TRATTATIVE CONCLUSE: 10 TUTTE POSITIVE! Case Corsair 240 *** CPU AMD 1700 *** MotherBoard Asus PRIME B350M *** VGA Nvidia Zotac GTX1060 6gb *** RAM Corsair 16gb DDR4 *** PSU Corsair CX650M *** SSD Samsung 850 evo 500gb *** HardDisk 1tb |
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: Mar 2007
Messaggi: 7863
|
Quote:
Ultima modifica di nuovoUtente86 : 05-08-2009 alle 00:41. |
|
|
|
|
|
|
#12 | ||
|
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Quote:
Scrivere: Codice:
"FROM Utente u WHERE u.username=:PARAM"
q.setParameter("PARAM", username);
Codice:
"SELECT * FROM Utente u WHERE u.username = ?"
$statement->bind_param("s", $username);//s indica che la variabile username è di tipo stringa
Con questo codice posso benissimo evitare i controlli per i classici casi di inserimento/ricerca per cognomi contenenti il carattere ' è il dbms che sa che tutto quello che gli sto passando sono dati e non dati con istruzioni. Quote:
Senza ulteriori controlli a monte gli attacchi injection che possono andare a segno sono quelli che fanno schiantare il dbms con sequenze particolari di dati, ma questo rientrerebbe più nei bug di sicurezza del dbms che non del codice utente. Chiaramente il mio era solo un codice di esempio che traduceva il codice java di cui sopra per quanto riguarda la parte di sql injection. Ultima modifica di tomminno : 05-08-2009 alle 12:31. |
||
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Feb 2008
Messaggi: 1027
|
ciao, ti passo la funzione che ho creato anni fà per l'esame di php
Codice:
// controlla i valori nell'array $_POST
function SQL_Injection(){
foreach ($_POST as $chiave => $elemento) {
// elimino i caratteri _ e % sensibili per le query sql con LIKE
$_POST["$chiave"] = str_replace("_", "", $_POST["$chiave"]);
$_POST["$chiave"] = str_replace("%", "", $_POST["$chiave"]);
//sostituisco le parentesi angolari, onde evitare la creazione di codice html
$_POST["$chiave"] = str_replace("<", "<", $_POST["$chiave"]);
$_POST["$chiave"] = str_replace(">", ">", $_POST["$chiave"]);
//rimuovo gli spazi all'inizio e alla fine
$_POST["$chiave"] = trim($_POST["$chiave"]);
// se magic_quotes_gpc è disattivo, mi appoggio a mysql_real_escape_string() contro attacco di tipo SQL Injection
if ( !get_magic_quotes_gpc() ) {
// e quoto i caratteri \ " ' sensibili per php
$_POST["$chiave"] = mysql_real_escape_string($_POST["$chiave"]);
}
}
}
__________________
PC DESKTOP B450M-A II Asus * Ryzen 5 3600 (6c/12th) * Rtx 2060 6GB Gigabyte biventola * 32GB Ram 4133Mhz Mushkin Redline RGB ( 2 x 16GB) * Dissipatore a Liquido Corsair H80i v2 * SSD Kingston 240gb * SSD Toshiba 1TB * Alimentatore 550W Sharkoon WPM Gold Zero semi modulare 80+ Gold * Case CoolerMaster N300 finestrato e con usb 3.0 * Windows 11 Pro SIM RACING Logitech G920 * Logitech D9 * GT Omega Classic TUTTE LE MIE COMPRAVENDITE!!! (sempre positive!) ed ora in vendita: nulla Ultima modifica di ckingpin : 05-08-2009 alle 14:44. |
|
|
|
|
|
#14 | |
|
Senior Member
Iscritto dal: Jul 2007
Città: Bordighera (IM)
Messaggi: 1047
|
Quote:
__________________
.:Programmatore web e Windows, WebDesigner - Portfolio:. TRATTATIVE CONCLUSE: 10 TUTTE POSITIVE! Case Corsair 240 *** CPU AMD 1700 *** MotherBoard Asus PRIME B350M *** VGA Nvidia Zotac GTX1060 6gb *** RAM Corsair 16gb DDR4 *** PSU Corsair CX650M *** SSD Samsung 850 evo 500gb *** HardDisk 1tb |
|
|
|
|
|
|
#15 | |
|
Senior Member
Iscritto dal: Feb 2008
Messaggi: 1027
|
Quote:
__________________
PC DESKTOP B450M-A II Asus * Ryzen 5 3600 (6c/12th) * Rtx 2060 6GB Gigabyte biventola * 32GB Ram 4133Mhz Mushkin Redline RGB ( 2 x 16GB) * Dissipatore a Liquido Corsair H80i v2 * SSD Kingston 240gb * SSD Toshiba 1TB * Alimentatore 550W Sharkoon WPM Gold Zero semi modulare 80+ Gold * Case CoolerMaster N300 finestrato e con usb 3.0 * Windows 11 Pro SIM RACING Logitech G920 * Logitech D9 * GT Omega Classic TUTTE LE MIE COMPRAVENDITE!!! (sempre positive!) ed ora in vendita: nulla |
|
|
|
|
|
|
#16 | ||
|
Senior Member
Iscritto dal: Feb 2007
Città: Verona
Messaggi: 1060
|
Quote:
Secondo me è meglio usare funzioni dedicate specificatamente allo scopo, come la mysql_escape_string(). In PHP io ho utilizzato SEMPRE i prepared statements. Sono comodi e sicuri (non posso dirlo al 100%, però...). Quote:
__________________
|
||
|
|
|
|
|
#17 |
|
Senior Member
Iscritto dal: Jul 2007
Città: Bordighera (IM)
Messaggi: 1047
|
volevo chiedervi un'altra cosa dato che mi sembrate preparatissimi in materia:
avete presente il codice che genera adobe dreamweaver automaticamente se si crea un recordset? ecco... quel codice mi sembra incomprensibile in alcuni punti che vi farò vedere... (cioè solo la parte iniziale dove effettua la connessione (quindi non parlo del ciclo che scrive i dati)). due domande: 1_ vi sembra buono come codice a livello di sicurezza e ottimizzazione? (a parte la query che ho fatto ora: SELECT * FROM tblUtenti) 2_ potreste descrivermi brevemente cosa fa codice? perchè vista così mi crea molta confusione... ve lo riporto qui. GRAZIE!! Codice PHP:
__________________
.:Programmatore web e Windows, WebDesigner - Portfolio:. TRATTATIVE CONCLUSE: 10 TUTTE POSITIVE! Case Corsair 240 *** CPU AMD 1700 *** MotherBoard Asus PRIME B350M *** VGA Nvidia Zotac GTX1060 6gb *** RAM Corsair 16gb DDR4 *** PSU Corsair CX650M *** SSD Samsung 850 evo 500gb *** HardDisk 1tb |
|
|
|
|
|
#18 | ||
|
Senior Member
Iscritto dal: Feb 2008
Messaggi: 1027
|
Quote:
Quote:
...vedi che ho fatto bene allora a togliermi il vizio di commentare? quei commenti erano didattici e servivano a far capire al prof che avevo capito......
__________________
PC DESKTOP B450M-A II Asus * Ryzen 5 3600 (6c/12th) * Rtx 2060 6GB Gigabyte biventola * 32GB Ram 4133Mhz Mushkin Redline RGB ( 2 x 16GB) * Dissipatore a Liquido Corsair H80i v2 * SSD Kingston 240gb * SSD Toshiba 1TB * Alimentatore 550W Sharkoon WPM Gold Zero semi modulare 80+ Gold * Case CoolerMaster N300 finestrato e con usb 3.0 * Windows 11 Pro SIM RACING Logitech G920 * Logitech D9 * GT Omega Classic TUTTE LE MIE COMPRAVENDITE!!! (sempre positive!) ed ora in vendita: nulla |
||
|
|
|
|
|
#19 | |
|
Senior Member
Iscritto dal: Feb 2007
Città: Verona
Messaggi: 1060
|
Quote:
2) get_magic_quotes_gpc() ritorna true o false in base all'impostazione magic_quotes dell'installazione di php, che è una funzionalità intergrata che si occupa di fare l'escape dei dati specificati negli array $_GET e $_POST. Qui un bel link: LINK (è deprecata) Se php fa l'escape di suo, viene eseguita la fuzione stripslashes() che annulla l'escape, altrimenti non fa niente ($theValue = $theValue). 3) $theValue è un dato di cui non conosciamo il tipo (sto parlando di tipi del Php). Tramite $theType si specifica il tipo di $theValue che ci si aspetta di avere e si fa la conversione esplita. Sempre che sia questo il tuo dubbio... conosci il costrutto switch...case vero? 4) mysql_free_result() è una funzione usata per chiudere il recordset e liberare la memoria occupata da esso; questo lo rende inutilizzabile. Lo so che non mi sono spiegato benissimo e in caso chiedi, come sempre
__________________
|
|
|
|
|
|
|
#20 | |
|
Senior Member
Iscritto dal: Feb 2007
Città: Verona
Messaggi: 1060
|
Quote:
![]() maledetti prof
__________________
|
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 12:08.












ho concluso con: kvegeta, doctordb, Leland Gaunt.









