Discussion:
Je cherche un équivalent php de mysql_real_escape_string()
(trop ancien pour répondre)
Jean Francois Ortolo
2014-04-21 09:07:08 UTC
Permalink
Bonjour

Je suis en train d'adapter des scripts, des fonctions mysql_*() vers
celles de la librairie PDO de mysql.

Il s'agit d'un script de prise en compte de paiements PayPal, qui est
...schtroumpfement bien fait, mais malheureusement est fait avec ces
fonctions mysql_*().


J'ai trouvé sur le net, un équivalent théorique à la fonction
mysql_real_escape_string().

J'ai besoin de toute façon d'une telle fonction de remplacement, car
j'utilise la librairie PDO de MySQL et PHP, et non plus les fonctions (
bientôt obsolètes ) de type : mysql_*().

J'ai ajouté à cette fonction ( voir ci-dessous ), la traduction des
caractère spéciaux : "\b" et "\t".

Le problème ( en gros ), est que PHP traduit : "\\" en : "\", ce qui
fait que le caractère lu : "\\" correspond au caractère existant : "\" (
backslashe ).

D'autre part, la documentation MySQL, dit qu'il faut convertir le
caaractère ASCII : 26 ( Ctrl-Z, ou EOF ( fin de fichier ) ), en : "\Z".

Merci de me dire si cette fonction ci-dessous, est correcte sur le
plan des fonctionnalités, et n'oublie pas de caractères.


function reverse_escape($str)
{
$search = array("\\", "\0", "\n", "\r", "\b", "\t", "\x1a",
"'", '"');

$replace = array("\\\\", "\\0", "\\n", "\\r", "\\b", "\\t",
"\\Z", "\'", '\"');

return str_replace($search, $replace, $str);
}


Merci beaucoup de vos réponses.

Amicalement.

Jean François Ortolo
Jean Francois Ortolo
2014-04-21 15:49:19 UTC
Permalink
Rebonjour

Est-ce que je ne ferais pas mieux, de remplacer les caractères par
leurs équivalents en code ascii : chr(x) ?

Exemple :

function str_escape($str)
{
$search = array("\\", "\0", "\n", "\r", "\b", "\t", "\x1a",
"'", '"');

$replace = array("\\\\", "\\0, chr(10), chr(13), chr(8), chr(9),
"\\Z", "\'", '\"');

return str_replace($search, $replace, $str);
}


Je laisse le "\\Z" au lieu de chr(26), car ce caractère "\Z" est
préconisé dans la doc de MySQL.

Merci beaucoup de vos réponses.

Jean François Ortolo
Post by Jean Francois Ortolo
Bonjour
Je suis en train d'adapter des scripts, des fonctions mysql_*() vers
celles de la librairie PDO de mysql.
Il s'agit d'un script de prise en compte de paiements PayPal, qui est
...schtroumpfement bien fait, mais malheureusement est fait avec ces
fonctions mysql_*().
J'ai trouvé sur le net, un équivalent théorique à la fonction
mysql_real_escape_string().
J'ai besoin de toute façon d'une telle fonction de remplacement, car
j'utilise la librairie PDO de MySQL et PHP, et non plus les fonctions (
bientôt obsolètes ) de type : mysql_*().
J'ai ajouté à cette fonction ( voir ci-dessous ), la traduction des
caractère spéciaux : "\b" et "\t".
Le problème ( en gros ), est que PHP traduit : "\\" en : "\", ce qui
fait que le caractère lu : "\\" correspond au caractère existant : "\" (
backslashe ).
D'autre part, la documentation MySQL, dit qu'il faut convertir le
caaractère ASCII : 26 ( Ctrl-Z, ou EOF ( fin de fichier ) ), en : "\Z".
Merci de me dire si cette fonction ci-dessous, est correcte sur le
plan des fonctionnalités, et n'oublie pas de caractères.
function reverse_escape($str)
{
$search = array("\\", "\0", "\n", "\r", "\b", "\t", "\x1a",
"'", '"');
$replace = array("\\\\", "\\0", "\\n", "\\r", "\\b", "\\t",
"\\Z", "\'", '\"');
return str_replace($search, $replace, $str);
}
Merci beaucoup de vos réponses.
Amicalement.
Jean François Ortolo
Otomatic
2014-04-21 16:24:57 UTC
Permalink
Post by Jean Francois Ortolo
Il s'agit d'un script de prise en compte de paiements PayPal, qui est
...schtroumpfement bien fait, mais malheureusement est fait avec ces
fonctions mysql_*().
Pourquoi pas mysqli à la place de PDO ?
Jean Francois Ortolo
2014-04-21 19:16:50 UTC
Permalink
Post by Otomatic
Post by Jean Francois Ortolo
Il s'agit d'un script de prise en compte de paiements PayPal, qui est
...schtroumpfement bien fait, mais malheureusement est fait avec ces
fonctions mysql_*().
Pourquoi pas mysqli à la place de PDO ?
Bonjour Monsieur

Vous savez ce que c'est...

Les Habitudes de programmation çà ne se Schtroumpfe pas. ;)

J'attends le Super Super Schtroumpf , Schtroumpfement au courant des
problèmes de MySQL...

D'abord, je sais que mes variables $_POST éventuelles, seront
stripslashées comme il se doit, si get_magic_quotes_gpc() est à true.

En plus de çà, je viens de schtroumpfer une agréable fonction poru me
stripslasher correctement les $_POST :


function stripslashes_deep($value)
{
$value = is_array($value) ?
array_map('stripslashes_deep', $value) :
stripslashes($value);

return $value;
}

if((function_exists("get_magic_quotes_gpc") && get_magic_quotes_gpc())
|| (ini_get('magic_quotes_sybase') &&
(strtolower(ini_get('magic_quotes_sybase'))!="off")) ){
stripslashes_deep($_GET);
stripslashes_deep($_POST);
stripslashes_deep($_COOKIE);
}

Le problème étant : Les variable en amont sont propres, ma fonction
str_escape() sera-t-elle viable et complète ?

Merci beaucoup de vos réponses.

Amicalement.

Jean François Ortolo
YBM
2014-04-22 01:04:48 UTC
Permalink
Post by Jean Francois Ortolo
D'abord, je sais que mes variables $_POST éventuelles, seront
stripslashées comme il se doit, si get_magic_quotes_gpc() est à true.
ce qui est une très mauvaise idée.
Post by Jean Francois Ortolo
En plus de çà, je viens de schtroumpfer une agréable fonction poru me
effort vain et absurde. Utilisez les requêtes préparées et ces
saloperies de escape_* vous seront superflues. mysqli ET PDO vous
les offrent sur un plateau.
Jean Francois Ortolo
2014-04-22 06:52:20 UTC
Permalink
Post by YBM
Post by Jean Francois Ortolo
D'abord, je sais que mes variables $_POST éventuelles, seront
stripslashées comme il se doit, si get_magic_quotes_gpc() est à true.
ce qui est une très mauvaise idée.
Post by Jean Francois Ortolo
En plus de çà, je viens de schtroumpfer une agréable fonction poru me
effort vain et absurde. Utilisez les requêtes préparées et ces
saloperies de escape_* vous seront superflues. mysqli ET PDO vous
les offrent sur un plateau.
Bonjour

Quelle agréable "suggestion"... ?

Requêtes préparées...

Et pour les INSERT ? ;)

Moi, "j'arrange" un script, mais je ne le détruis pas...

Comme dirait l'autre : "Pourquoi faire compliqué quand on peut faire
simple" ?

Et surtout :

Je suis patient, j'attends la réponse à ma question.


Et voici de nouveau ma fonction : Est-elle fiable ou non ?

Lequel des deux $replace est le plus adapté ?


function str_escape($str)
{
$search = array("\\", "\0", "\n", "\r", "\b", "\t", "\x1a",
"'", '"');

// $replace = array("\\\\", "\\0", "\\n", "\\r", "\\b", "\\t",
"\\Z", "\'", '\"');
$replace = array("\\\\", "\\0, chr(10), chr(13), chr(8), chr(9),
"\\Z", "\'", '\"');

return str_replace($search, $replace, $str);
}


Merci encore pour vos réponses.

Amicalement.

Jean François Ortolo
YBM
2014-04-22 10:22:57 UTC
Permalink
Post by Jean Francois Ortolo
Post by YBM
Post by Jean Francois Ortolo
D'abord, je sais que mes variables $_POST éventuelles, seront
stripslashées comme il se doit, si get_magic_quotes_gpc() est à true.
ce qui est une très mauvaise idée.
Post by Jean Francois Ortolo
En plus de çà, je viens de schtroumpfer une agréable fonction poru me
effort vain et absurde. Utilisez les requêtes préparées et ces
saloperies de escape_* vous seront superflues. mysqli ET PDO vous
les offrent sur un plateau.
Bonjour
Quelle agréable "suggestion"... ?
Requêtes préparées...
Et pour les INSERT ? ;)
Les requêtes préparées fonctionnent aussi bien avec les INSERT qu'avec
tout autre ordre SQL.
Post by Jean Francois Ortolo
Moi, "j'arrange" un script, mais je ne le détruis pas...
Comme dirait l'autre : "Pourquoi faire compliqué quand on peut faire
simple" ?
Les requêtes préparées sont à la fois plus simple, plus fiable, plus
performantes et plus sûre que cette aberration de bidule_escape et
cette idiotie de magic_quote.

Maintenant c'est vous qui voyez, venez pas vous plaindre quand votre
site se sera fait compromettre.
Jean Francois Ortolo
2014-04-23 17:13:54 UTC
Permalink
Rebonjour

Après tests ( affichage seulement, pas de database ), je pense que
voici la dernière version de la fonction :


function str_escape($str)
{
$search = array("\\", "\0", "\n", "\r", "\b", "\t", "\x1a", "'",
'"');

$replace = array("\\\\", "\\0", "\\n", "\\r", "\\b", "\\t",
"\\Z", "\'", '\"');

return str_replace($search, $replace, $str);
}

A côté de çà, je me pose des questions par rapport à l'utilité du "\b".

Le caracatère escape : "\b" fait partir de la table des séquences de
caractères escape interprétés par MySQL, qui veut que ces caractères
soient échappés par un "\".


En ce qui concerne les paramètres "$_GET", "$_POST" et tout çà, le
script que je veux arranger les tire directement de cette manière :


foreach ($_GET as $key=>$value)
{
if(get_magic_quotes_gpc())
{
$value = stripslashes($value);
}

// Traitement de $key et $value...
}


Il y a une autre manière de faire, peut-être plus propre :

// Reading POSTed data directly from $_POST causes serialization issues
with array data in the POST.
// Instead, read raw POST data from the input stream.
$raw_post_data = file_get_contents('php://input');
$raw_post_array = explode('&', $raw_post_data);
$myPost = array();
foreach ($raw_post_array as $keyval) {
$keyval = explode ('=', $keyval);
if (count($keyval) == 2)
$myPost[$keyval[0]] = urldecode($keyval[1]);
}

Quelle est, à votre avis, la meilleure solution ?

Donc, deux questions : A propos de la fonction str_replace(), et de
la meilleure façon de collecter les paramètres $_GET, $_POST, etc...

Merci beaucoup de vos réponses.

Respectueusement.

Jean François Ortolo

Loading...