mysql_real_escape_string non abbastanza?
-
24-10-2019 - |
Domanda
Quindi, utilizzando% 27 si può solo SQL iniettare anche se i dati vengono sterilizzate con mysql_real_escape_string
%27) SQL INJECTION HERE %2F*
Cosa fare?
Modifica con l'esempio:
$sql = sprintf("SELECT *, MATCH(post) AGAINST ('%s*' IN BOOLEAN MODE) AS score FROM Posts WHERE MATCH(post) AGAINST('%s*' IN BOOLEAN MODE)",
mysql_real_escape_string($_GET['searchterm']),
mysql_real_escape_string($_GET['searchterm']));
$results = $db->queryAsArray($sql);
Se si passa %27) SQL INJECTION HERE %2F*
alla querystring searchterm, vengo emesso sulla pagina:
Hai un errore nella sintassi SQL; controllare il manuale che corrisponde la versione del server MySQL per la sintassi diritto di utilizzare nei pressi di BOOLEANO' MODE)' at line 1
Grazie a tutti per trovare il problema nella classe db ..
Soluzione
Ragioniamo il nome del metodo queryAsArray
, sembra che si sta utilizzando questo < em> DbBase di classe dai commenti della funzioni di MySQL pagina di manuale . Se è così, è il metodo query
che rimuove il carattere di fuga dalle virgolette sfuggiti:
function query($sql, &$records = null){
$sql = str_replace(array('\\"', "\\'"), array('"', "'"), $sql);
// …
}
Allora non è un miracolo che il vostro esempio opere (ho semplificato esso):
$input = "', BAD SQL INJECTION --";
$sql = "SELECT '".mysql_real_escape_string($input)."'";
var_dump($sql); // string(33) "SELECT '\', BAD SQL INJECTION --'"
// everything’s OK ↑
$sql = str_replace(array('\\"', "\\'"), array('"', "'"), $sql);
var_dump($sql); // string(32) "SELECT '', BAD SQL INJECTION --'"
// Oops! ↑
Altri suggerimenti
La nota di cui al nostro manuale è stato contrassegnato per l'eliminazione. Una volta che si propaga in tutti gli specchi della nostra rete, che non apparirà più attaccato alla documentazione ufficiale.
~ Daniel P. Brown
Network Infrastructure Manager
http://php.net/
E 'meglio non dichiarazioni di build come questo a tutti, e invece utilizzare le query con parametri utilizzando mysqli o DOP. In questo modo affrontare il problema dell'iniezione MySQL e un giorno (non ancora, purtroppo) esso deve svolgere meglio anche perché le query vengono memorizzati nella cache senza parametri, il che significa che hai solo una query nella cache invece di decine di diversi query a causa di una valore singolo ingresso cambia continuamente. Altri database fanno uso di questo da tempo, ma MySQL appena riuscito a non fare query con parametri più lento dal momento che la versione più recente.
E non sembra plausibile che% 27 sarà effettivamente terminare la stringa. Sembra più come una possibilità di citazioni incorporare all'interno di una stringa, ma non sono sicuro.
A dire il vero, ho deciso di sacrificare il mio server e testare questa. Quando entro% 27 in un campo di input e textarea che sono scappato con mysql_real_escape_string e vengono poi inseriti nella base di dati, ottengo nessun errore. Il %27
testo viene semplicemente inserito. Quindi nessun problema a tutti.
Ti sbagli. No iniezione possibile qui.
Seguendo queste tre semplici regole
- del Cliente la codifica correttamente impostato dal
mysql_set_charset()
- Dati in sfuggito
- e racchiuso tra virgolette
using mysql_real_escape_string()
si può essere sicuri che nessuna iniezione di possibile