View Full Version : [PHP] Cosa usate x fare escape dei caratteri in input ed evitare SqlInject?
Matrixbob
24-07-2010, 14:37
:confused:
addslashes
htmlspecialchars
htmlentities
mysql_real_escape_string
urlencode
mysqli_prepare
:mbe: ...................................................... :stordita: :fagiano:
wingman87
24-07-2010, 14:50
addslashes: http://php.net/manual/en/function.addslashes.php
htmlspecialchars serve a sostituire i caratteri speciali (non so se si chiamano proprio così) in entità html, quindi ad esempio & verrà sostituito con & e < con <
E' molto utile per evitare gli attacchi xss: Prima di stampare i dati presi dal database o passati tramite post o get gli dai una passata con htmlentities.
Matrixbob
24-07-2010, 14:52
addslashes: http://php.net/manual/en/function.addslashes.php
OK, e sta famosa get_magic_quotes_gpc() ormai è dreprecata?
wingman87
24-07-2010, 14:55
Non mi sembra (da quanto leggo nella documentazione), ti conviene fare sempre il controllo
lock cmpxchg8b %ebx
24-07-2010, 14:57
http://www.php.net/manual/en/mysqli.prepare.php
Matrixbob
24-07-2010, 14:58
http://www.php.net/manual/en/mysqli.prepare.php
MySqlI non presuppone che utilizzi mysqlI?
CMQ studio anche quello, 1 altro utene sul foru postò:
PHP Security Guide (http://phpsec.org/projects/guide/)
lock cmpxchg8b %ebx
24-07-2010, 15:42
MySqlI non presuppone che utilizzi mysqlI?
Si, perché?
È soltanto un modulo di PHP diverso, il database d'appoggio è sempre MySQL.
Matrixbob
24-07-2010, 16:56
Si, perché?
È soltanto un modulo di PHP diverso, il database d'appoggio è sempre MySQL.
Ah ok, tutto pienamente compatibile?
Matrixbob
24-07-2010, 16:56
Si, perché?
È soltanto un modulo di PHP diverso, il database d'appoggio è sempre MySQL.
Ah ok, tutto pienamente compatibile?
Matrixbob
24-07-2010, 16:56
Si, perché?
È soltanto un modulo di PHP diverso, il database d'appoggio è sempre MySQL.
Ah ok, tutto pienamente compatibile?
OK, e sta famosa get_magic_quotes_gpc() ormai è dreprecata?
Si può disattivare dal PHP.ini, solo in PHP6 verrà tolta (così si dice).
Io uso una mia funzione che elimina determinati caratteri (in sequenza) ed esegue l'escape finale con addslashes.
Hiskrtapps
26-07-2010, 09:36
Ah ok, tutto pienamente compatibile?
Si, ed è la soluzione più corretta.
Matrixbob
26-07-2010, 09:58
?
htmlspecialchars
htmlentities
mysql_real_escape_string
urlencode
Quindi basta la sola mysqli_prepare? Stop? Nessuna di queste altre?
Non funzionasse sugli Host tipo Aruba/Netsons sarebbe perchè non hanno caricato il modulo?
Oppure non c'è possibilità che non funzioni? Dove c'è PHP5 c'è questo set di funzioni?
Ho visto che c'è sia OO che procedurale, dato che restituisce la stessa cosa "mysqli_stmt" posso usare nella mia procedura anche quella ad oggetti o è meglio non mischiare?
Object oriented style
mysqli_stmt mysqli::prepare ( string $query )
Procedural style
mysqli_stmt mysqli_prepare ( mysqli $link , string $query )
Noto:
$link = mysqli_connect("localhost", "my_user", "my_password", "world");
devo cambiare tutte le varie aperture/chiusure con le nuove mysqli_X?
Matrixbob
26-07-2010, 10:14
Piccolo :ot:
voi per caso utilizzate anche
mysql_free_result($result);
oppure a fine script c'è auto dispose del fetch?
Matrixbob
28-07-2010, 16:34
UP!
Questo lo chiudiamo con la soluzione: "mysqli_prepare"?
malocchio
28-07-2010, 23:37
UP!
Questo lo chiudiamo con la soluzione: "mysqli_prepare"?
Mi permetto di fare il pignolo e precisare che la soluzione non è "mysqli_prepare", ma l'utilizzo dei Prepared Statements (supportati appunto solo dalla libreria MySQLi). La funzione mysqli_prepare è solo il primo passo per ottenere un resultset da uno statement.
La cosa interessante è che viene fatto automaticamente dal sistema l'escaping dei valori assegnati ai parametri dello statement.
Attenzione che però la libreria MySQLi non è supportata da tutti gli hosting, soprattutto quelli gratuiti, quindi informarsi bene prima di utilizzarla.
Matrixbob
18-09-2010, 09:04
http://www.php.net/manual/en/mysqli.prepare.php
Rieccomi rientrato da vacanze e tour in London per vedre se migrare :) spero vi siate riposati a che voi! [chiuso :ot:]
Effettivamente vedo che ritorna un mysqli statemant
mysqli_stmt mysqli_prepare ( mysqli $link , string $query )
, quindi non un testo normale che posso inserire, ma qualcosa a usare con altri mysqli:qualcosa? :confused:
Matrixbob
18-09-2010, 09:09
Rieccomi rientrato da vacanze e tour in London per vedre se migrare :) spero vi siate riposati a che voi! [chiuso :ot:]
Effettivamente vedo che ritorna un mysqli statemant
, quindi non un testo normale che posso inserire, ma qualcosa a usare con altri mysqli:qualcosa? :confused:
Eh si, intuitivamente direi di si leggendo la spiegazione del prepare
Procedural style only: A link identifier returned by mysqli_connect() or mysqli_init()
, devo passare i mysql_ a mysqli_
Sto iniziando col cambiare il tipico
//Stringa di connessione
$connessione=@mysql_connect($server, $utente, $password) or die(errore());
//selezione del database
$db=mysql_select_db($database, $connessione) or die(errore());
con
//Stringa di connessione e selezione del database
$link = @mysqli_connect($server, $utente, $password, $database);
/* check connection */
if (!$link) {
die('Connect Error: ' . mysqli_connect_error() . ' ' . mysqli_connect_errno());
}
Matrixbob
18-09-2010, 09:27
Ma nell'esempio del manuale online qui sotto riportato
$city = "Amersfoort";
$link = mysqli_connect("localhost", "my_user", "my_password", "world");
/* create a prepared statement */
if ($stmt = mysqli_prepare($link, "SELECT District FROM City WHERE Name=?")) {
/* bind parameters for markers */
mysqli_stmt_bind_param($stmt, "s", $city);
/* execute query */
mysqli_stmt_execute($stmt);
/* bind result variables */
mysqli_stmt_bind_result($stmt, $district);
/* fetch value */
mysqli_stmt_fetch($stmt);
printf("%s is in district %s\n", $city, $district);
/* close statement */
mysqli_stmt_close($stmt);
}
, a che servono i due "bind"
/* bind parameters for markers */
mysqli_stmt_bind_param($stmt, "s", $city);
e
/* bind result variables */
mysqli_stmt_bind_result($stmt, $district);
, sono obbligatori altrimenti exec e fetch non funzionano?
Matrixbob
18-09-2010, 09:57
Ok funziona. Ma in questo modo non devo fare l'escape di nient'altro? Only mysqli statement and stop?
<?php
include("connetti.php");
$titolo = strtoupper($titolo);
$datatime = date('Y-m-d H:i:s');
$query = "INSERT INTO privato (u_modifica, titolo, testo) VALUES (?, ?, ?)";
if ($stmt = mysqli_prepare($link, $query))
{
mysqli_stmt_bind_param($stmt, 'sss', $datatime, $titolo, $testo);
print("<font color=\"green\">Elemento:<br />$titolo<br />inserito correttamente.</font><br />");
mysqli_stmt_execute($stmt);
}
else{ die(errore()); }
include("disconnetti.php");
print("<meta http-equiv=\"Refresh\" content=\"5; url=http://$HTTP_HOST/ciccio/pasticcio.php\" />");
?>
Matrixbob
18-09-2010, 14:12
Il risultato su una stringa così:
PROVA "CIAO" voglio un po' <
è
PROVA \"CIAO\" voglio un po\' <
peccato che ora quando ne faccio il fetch in questo formato fa schifo, coe la ritrasformereste leggibile?
http://www.php.net/manual/en/function.stripslashes.php
Matrixbob
18-09-2010, 14:28
http://www.php.net/manual/en/function.stripslashes.php
Fatto funziona, sanza utilizzare altro che gli mysqli statemant e stripslash s'ottiene:
PROVA "CIAO" voglio un po' <
optimus!;)
Supdario
19-09-2010, 01:02
Io sono abituato ad usare mysql_real_escape_string($stringa) (http://php.net/manual/en/function.mysql-real-escape-string.php).
E' fatto apposta per l'escaping delle query ed è immediato.
Matrixbob
19-09-2010, 19:59
Io sono abituato ad usare mysql_real_escape_string($stringa) (http://php.net/manual/en/function.mysql-real-escape-string.php).
E' fatto apposta per l'escaping delle query ed è immediato.
... e adesso leggendo della libreria mysqli continuerai a usare la escape_string?
Trovi che faccia qualcosa che queste librerie non facciano? O per abitudine?
Non sto prendendo in giro, sto solo chiedendo sia chiaro. ;)
Matrixbob
18-10-2010, 13:05
[PHP - mySQL] Richiesta guide prevenzione hackeraggi (http://www.hwupgrade.it/forum/showthread.php?t=2218045)
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.