Domanda

Potete per favore darmi consigli? Ho cercato per domande, ma non ho trovato qualcosa di simile al mio.

come faccio a rendere il mio input dell'utente fuggiti automaticamente quando sono destinati ad utilizzare nelle query SQL? Non mi piace nel mio codice pieno di qualcosa di simile

$var_x = $DB->Escape($_POST['var_x']);
$another_var = $DB->Escape($_POST['another_var']);
$some_string = $DB->Escape($_POST['some_string']);
...

Supponendo che ho classe di database con il metodo di fuga che svolge mysql_real_escape_string

Ma non riesco a impostare la fuga auto on query SQL pure, perché rompe le query di inserimento:

function Exec($sql){
   $result = mysql_query($this->Escape($sql));
}

$q = $DB->Exec("SELECT * FROM table WHERE id = 'xxx'");

E 'li rende \ 'xxx \'. che non è corretto.

L'ultima cosa che voglio fare è fare dichiarazioni con parametri, in quanto renderà il sistema più complicato. Prenderò in considerazione questa opzione quando niente sarà lasciato.

In breve -? Come fare Smart Auto-escape che funziona con tutto query e sfugge solo valori

È stato utile?

Soluzione

In realtà, l'unico e l'unica cosa che si dovrebbe sempre prendere in considerazione (non stiamo parlando di progetti di test qui, ovviamente) è quello di utilizzare le dichiarazioni con parametri. Questo è l'unico modo (quando SQL SYNAX consente loro, naturalmente). Fatto correttamente, questi non rendere il sistema più complicato, ma renderlo più robusto.

Altri suggerimenti

Siamo spiacenti, non si può auto nulla. Quando si sono concatenazione di stringhe, si avrà sempre carattere sfuggire problemi lì; questo non è qualcosa che si può ‘risolvere’ una volta e non hanno mai pensare di nuovo.

Se lo fate:

$a= "a'b";
$query= "SELECT * FROM things WHERE name='$a'";

Quindi la stringa di query contiene due apostrofi che sono veri e propri apostrofi in stringhe letterali, e apostrofi che sono delimitatori di stringa:

SELECT * FROM things WHERE name='a'b'

Uno ha bisogno di essere sfuggito; l'altro non deve. Come si può sapere quale è quale? Non è possibile, che l'informazione è persa per sempre. È necessario invece dire:

$query= "SELECT * FROM things WHERE name='".mysql_real_escape_string($a)."'";

(o qualsiasi altra funzione di fuga è più adatto per il database che si sta utilizzando.)

Ugly? Hell yeah. Ecco perché usiamo le query parametrizzate, invece. Questo si allontana dalla concatenazione di stringhe con tutti i suoi guai.

La concatenazione di stringhe sembra facile. La gente pensa che capiscono stringhe clodging insieme. Ma in realtà, non lo fanno.

Io uso questo metodo:

$db->set('name',$name);
$db->set('title',$title);
$db->insert('users');

Ecco il metodo $db->set() sfugge automaticamente il valore (cioè il 2 ° argomento).

Con PHP 5, si può anche fare questo:

$db->set('name',$name)->set('title',$title)->insert('users');
  

L'ultima cosa che voglio fare è fare dichiarazioni con parametri, come farà sistema più   complicato. Prenderò in considerazione questa opzione quando niente sarà lasciato.

Cura per spiegare la sua affermazione che parametrizzate query sono "più complicato"? Non concateno dati esterni in query - mai - ed è la cosa più semplice del mondo per fare, oltre ad essere molto più vicino a "prova di proiettile" di qualsiasi tecnica di fuga è mai probabile che sia.

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