Unico problema... Se ti hanno defacciato il sito oggi non è che domani se ne stanno fermi (purtroppo per noi)... Devi trovare i bug che hanno sfruttato nel tuo sito (se ci sono) e tapparli. Alle volte non ce se ne rende conto di avere dei buchi e anche i più esperti sbagliano.
Io di solito uso questa (l'ho fatta io ma non ci vuole un mega genio per farla quindi te la regalo):
Codice PHP:
<?php
class DB {
private $dbHandle;
private $LastResource;
public function __destruct() {
$this->Close();
}
/*
* Invoca mysql_connect. Implementato solo per rendere più semplice e di facile comprensione
* l'utilizzo di questa classe.
*/
public function Connect($Host, $Username, $Password) {
mysql_connect($Host, $Username, $Password);
}
/*
* $Query è la stringa SQL da inviare. Deve contenere dei caratteri %0, %1, %2... ai quali verrÃ
* sostituito il parametro con indice corrispondente. Ad esempio %0 verrà sostituito con $Params[0].
* $Params è un array di stringhe da modificare e inserire in $Query. La modifica subita dipende da
* $ParamsHandlingType. $ParamsHandlingType è un array di stringhe, le quali possono assumere i
* seguenti valori: 'md5', 'SQLSafe', 'None'.
*/
public function SendSafeQuery($Query, array $Params, array $ParamsHandlingType) {
for ($i = 0; $i <= count($Params) - 1; $i++) {
if (is_integer(strpos($Query, '%'.$i))) {
switch ($ParamsHandlingType[$i]) {
case 'md5':
$Query = str_replace('%'.$i, md5($Params[$i]), $Query);
break;
case 'SQLSafe':
$Query = str_replace('%'.$i, mysql_real_escape_string($Params[$i]), $Query);
break;
case 'HTMLSafe':
$Query = str_replace('%'.$i, htmlentities($Params[$i]), $Query);
break;
case 'SQL_HTMLSafe':
$Query = str_replace('%'.$i, htmlentites(mysql_real_escape_string($Params[$i])), $Query);
break;
case 'None':
$Query = str_replace('%'.$i, $Params[$i], $Query);
break;
default:
die('[FATAL ERROR]: '.$ParamsHandlingType[$i]." is not recognised. Use one of the following values instead: 'md5', 'SQLSafe', 'HTMLSafe', 'SQL_HTMLSafe', 'None'.");
}
}
}
if (isset($this->LastResource)) {
mysql_free_result($this->LastResource);
}
$Result = mysql_query($Query) or die;
$this->LastResource = $Result;
return $Result;
}
/*
* Invoca mysql_query. Implementato solo per rendere più semplice e di facile comprensione
* l'utilizzo di questa classe.
* ATTENZIONE! Questo metodo non è in grado di difendersi da SQL Injections. Per difendersi da questo
* tipo di attacchi bisogna utilizzare il metodo SendSafeQuery(...).
*/
public function SendQuery($Query) {
$Result = mysql_query($Query) or die;
return $Result;
}
/*
* Chiude il database e libera la memoria. è consigliato l'utilizzo di unset nel caso ci si debba collegare
* a un altro database. Successivamente deve essere creata una nuova istanza.
*/
public function Close() {
if (isset($this->LastResource)) {
mysql_free_result($this->LastResource);
}
if (isset($this->dbHandle)) {
mysql_close($this->dbHandle);
}
}
}
?>
Ecco come usarla:
Codice PHP:
$db = new db;
$db->Connect(...);
$db->SendSafeQuery("SELECT * FROM users WHERE username='%0' AND password='%1'", array($uname, $passwd), array('SQL_HTMLSafe', 'md5'));
Usa:
'HTMLSafe' per evitare Code Injection di JavaScript o HTML;
'SQLSafe' per evitare SQL Injections;
'SQL_HTMLSafe' usa le due precedenti insieme;
'md5' cripti la password (io direi che è indispensabile);
'None' non fai niente.
Inoltre potrebbe esserti utile questo:
http://blacklight.gotdns.org/wiki/in...curezza_in_PHP
Parla di come difenderti da ciò che ti è successo.