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 ..

È stato utile?

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

  1. del Cliente la codifica correttamente impostato dal mysql_set_charset()
  2. using mysql_real_escape_string()
  3. Dati in sfuggito
  4. e racchiuso tra virgolette

si può essere sicuri che nessuna iniezione di possibile

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top