Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Je cherche un équivalent php de mysql_real_escape_string()

7 réponses
Avatar
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

7 réponses

Avatar
Jean Francois Ortolo
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("", "", "n", "r", "b", "t", "x1a",
"'", '"');

$replace = array("\", ", 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





Le 21/04/2014 11:07, Jean Francois Ortolo a écrit :

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("", "", "n", "r", "b", "t", "x1a",
"'", '"');

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

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


Merci beaucoup de vos réponses.

Amicalement.

Jean François Ortolo



Avatar
Otomatic
Jean Francois Ortolo
écrivait :

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 ?
Avatar
Jean Francois Ortolo
Le 21/04/2014 18:24, Otomatic a écrit :
Jean Francois Ortolo
écrivait :

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
Avatar
YBM
Le 21/04/2014 21:16, Jean Francois Ortolo a écrit :
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.

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



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.
Avatar
Jean Francois Ortolo
Le 22/04/2014 03:04, YBM a écrit :
Le 21/04/2014 21:16, Jean Francois Ortolo a écrit :
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.

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



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("", "", "n", "r", "b", "t", "x1a",
"'", '"');

// $replace = array("\", "", "n", "r", "b", "t",
"Z", "'", '"');
$replace = array("\", ", 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
Avatar
YBM
Le 22/04/2014 08:52, Jean Francois Ortolo a écrit :
Le 22/04/2014 03:04, YBM a écrit :
Le 21/04/2014 21:16, Jean Francois Ortolo a écrit :
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.

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



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.

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.
Avatar
Jean Francois Ortolo
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("", "", "n", "r", "b", "t", "x1a", "'",
'"');

$replace = array("\", "", "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