2010-09-22 11 views
3

Je passe une variable à une fonction qui exécute une requêteAlternative sûre à mysql_real_escape_string? (PHP)

La connexion MySQL ne se produit que dans la fonction, et ferme dans la fonction

Je veux être en mesure d'échapper en toute sécurité cordes avant que je les envoyer à la fonction

Je ne peux pas utiliser mysql_real_escape_string car il nécessite une connexion MySQL (qui est uniquement faite à l'intérieur de la fonction)

Je sais que la réponse simple serait d'échapper à des chaînes dans la fonction, mais Je ne peux pas faire ça parce que je doivent envoyer certains se sont échappés, et certaines parties non échappé d'une chaîne

Par exemple, je dois exécuter la fonction comme ceci:

myquery("'" . escape_me("My string") . "'"); 

Avis J'envoie deux apostrophe's-- non échappés, avec un chaîne échappée à l'intérieur. Pour cette raison, je ne peux pas faire une couverture mysql_real_escape_string sur les arguments à l'intérieur de la fonction myquery.

Je trouve le code suivant, ce qui suggère que je pourrais l'utiliser comme une alternative à mysql_real_escape_string:

// escape characters 
function escape_me($value) { 
    $return = ''; 
    for($i = 0; $i < strlen($value); ++$i) { 
     $char = $value[$i]; 
     $ord = ord($char); 
     if($char !== "'" && $char !== "\"" && $char !== '\\' && $ord >= 32 && $ord <= 126) 
      $return .= $char; 
     else 
      $return .= '\\x' . dechex($ord); 
    } 
    return $return; 
} 

Je ne sais pas si cette fonction est à l'abri des attaques multi-octets, mais je pense que je dois aussi défaire la fonction à chaque fois que je fais une recherche

Par exemple, l'entrée: Test 3 est « OK » est transformé en test 3x27s x22OKx22 dans la base de données

ma question principale est: Do vous savez s'il y a une autre fonction que je peux utiliser comme alternative à mysql_real_escape_string qui va échapper en toute sécurité aux caractères?

+0

avez-vous un exemple de choses non échappées? –

Répondre

5
  • C'est une mauvaise idée de se connecter chaque fois que vous appelez cette fonction. Une bonne application planifiée n'aurait pas une telle limitation étrange.
  • vous pouvez utiliser des substitutions, comme celui-ci
    myquery("SELECT * FROM table WHERE id = %s","My string");

  • Vous pouvez utiliser une autre façon moderne des substitutions: déclarations préparées. il sera décrit dans de nombreuses autres réponses.

comme Noone a posté encore, voici par exemple rude

function fetchAll(){ 
$args = func_get_args(); 
$query = array_shift($args); 
$stmt = $pdo->prepare($query); 
$stmt->execute($args); 
return $stmt->fetchAll(); 
} 
$a=$db->fetchAll("SELECT * FROM users WHERE status=? LIMIT ?,?",$status,$start,$num); 
  • Tant que vous utilisez l'encodage d'un octet ou utf-8, pas besoin d'utiliser mysql_real_escape_string, si mysql_escape_string (déconseillés) ou addslashes seraient assez
+2

'mysql_escape_string' a été [obsolète] (http://php.net/manual/fr/function.mysql-escape-string.php) (en faveur de mysql_real_escape_string), mais à part ça, c'est bien. +1 – NullUserException

+0

merci, j'ai oublié que –

+0

Cela a du sens, la connexion une fois pour chaque pageload est mieux que la connexion pour chaque requête - je peux juste faire une connexion db avant que la fonction fonctionne, je faisais une connexion en pensant qu'il était préférable d'ouvrir et fermer les connexions pour chaque requête – samJL

0

Je suggère passer dans un tableau de valeurs à l'aide et se sont échappés sprintf() formate la requête en échappant à chacune des valeurs.Voici la première partie de ma fonction de requête:

public function querya($query, $args=null){ 
    //check if args was passed in 
    if($args !== null){ 
     //if an array... 
     if(is_array($args)){ 
      //...escape each value in the args array 
      foreach($args as $key=>$value){ 
       $args[$key] = mysql_real_escape_string($value); 
      } 
      //add the query to the beginning of the args array 
      array_unshift($args, $query); 
      //call sprintf with the array as arguments to sprintf 
      $query = call_user_func_array("sprintf", $args); 
     } else { 
      //if args is not an array, then string (single argument passed in). 
      $query = sprintf($query, mysql_real_escape_string($args)); 
     } 
    } 

    //perform query, other stuff 
} 
+0

dans la fonction similaire J'ajoute des guillemets aux caractères génériques de% s, tout comme un infaillible, pour être sûr qu'aucun% s dans la requête n'est laissé de côté. –

+0

a du sens. Ceci est utilisé par moi-même, donc j'écris habituellement mes requêtes comme '$ DB-> querya (" SELECT COLUMN FROM TABLE WHERE VALEUR = '% s' ET 1 =% d ", array ('test', 1)); 'et inclure les guillemets autour du% s dans la requête si nécessaire. –