Question

Pouvez-vous s'il vous plaît me donner des conseils? Je cherchais des questions, mais n'a pas trouvé quelque chose de similaire à la mienne.

Comment puis-je faire mes entrées utilisateur se sont échappés automatiquement lorsqu'ils sont destinés à utiliser dans des requêtes SQL? Je n'aime pas dans mon code rempli de quelque chose comme

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

En supposant que j'ai la classe de base de données avec la méthode Escape qui effectue mysql_real_escape_string

Mais je ne peux pas définir escape automatique sur requête SQL aussi bien, car il casse les requêtes d'insertion:

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

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

Il les rend \ 'xxx \'. ce qui est incorrect.

La dernière chose que je veux faire est de faire des déclarations paramétrés, car il rendre le système plus complexe. Je considère cette option quand rien d'autre ne reste.

En bref - comment faire l'auto-évasion intelligente qui fonctionne avec la requête entière et échappe uniquement des valeurs

Était-ce utile?

La solution

En fait, l'une et la seule chose que vous devriez considérer jamais (nous ne parlons pas de projets de test ici, évidemment) est d'utiliser des déclarations paramétrées. Ceci est la seule façon (quand SYNAX SQL permet, bien sûr). Bien fait, ils ne seront pas rendre votre système plus compliqué, mais ils le rendre plus robuste.

Autres conseils

Désolé, vous ne pouvez pas quoi que ce soit automatique. Lorsque vous Concaténation, vous aurez toujours le caractère échapper là des questions; ce n'est pas quelque chose que vous pouvez « résoudre » une fois et ne jamais avoir à penser à nouveau.

Si vous faites:

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

Ensuite, votre chaîne de requête contient des apostrophes qui sont réels apostrophes dans des chaînes et des apostrophes qui sont chaîne délimiteurs:

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

Il faut être échappé; l'autre ne doit pas. Comment pouvez-vous dire qui est qui? Vous ne pouvez pas, cette information est perdue à jamais. Vous devez plutôt dire:

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

(ou tout autre autre fonction d'échappement est plus approprié pour la base de données que vous utilisez.)

Laid

? Hell yeah. Voilà pourquoi nous utilisons des requêtes paramétrées à la place. Cela se éloigne de concaténation de chaîne avec tous ses malheurs.

concaténation de chaîne semble facile. Les gens pensent qu'ils comprennent les chaînes clodging ensemble. Mais vraiment, ils ne le font pas.

J'utilise cette méthode:

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

Voici la méthode $db->set() échappe automatiquement la valeur (i.e. le 2ème argument).

Avec PHP 5, vous pouvez aussi faire ceci:

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

La dernière chose que je veux faire est de faire des déclarations paramétrées, comme il fera système plus   compliqué. Je considère cette option quand rien d'autre ne reste.

soin d'expliquer votre affirmation selon laquelle les requêtes paramétrées sont « plus compliquée »? Je ne concaténer des données externes dans les requêtes - jamais - et il est la que toute technique échapper chose la plus simple dans le monde à faire, tout en étant beaucoup plus proche de « pare-balles » est toujours susceptible d'être.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top