stripslashes

Eléphant du PHP | 134 Messages

12 janv. 2013, 22:42

Bonsoir

Je cherche a retirer les fameux \ devant les apostrophes et je galère depuis plusieurs heures , j'ai essayé tout ou presque

Côté serveur pas possible même avec un fichier .htaccess

Merci pour votre d'aide

Code : Tout sélectionner

<?php header("content-type: application/json; charset=utf-8"); // Version avec PDO $conn = new PDO('mysql:host=localhost;dbname=**', '**', '****'); $currentTimestamp = time(); $lastTimestamp = (isset($_GET['lastTimestamp'])) ? $_GET['lastTimestamp'] : ($currentTimestamp-1); if (!empty($_POST['pseudo']) && !empty($_POST['message'])) { $sth->bindParam(":pseudo", $pseudo); $sth->bindParam(":message", $message); $sth->bindParam(":timestamp", $currentTimestamp); */ $sth->bindValue('pseudo', (stripslashes($_POST['pseudo'])),PDO::PARAM_STR); //$sth->bindValue('message',$_POST['message'],PDO::PARAM_STR);PDO::PARAM_INT $sth->bindValue('message',(stripslashes($_POST['message'])),PDO::PARAM_STR); $sth->bindValue('timestamp',$currentTimestamp,PDO::PARAM_INT); $sth->execute(); } /* $sth = $conn->prepare("SELECT * FROM minichat WHERE timestamp > :lastTimestamp ORDER BY id DESC LIMIT 0,10"); cette ligne ne peut pas fonctionner, car on ne mélange jamais du pdo avec du mysql c'est soit l'un soit l'autre $conn-> mysql_query("SET NAMES UTF8"); */ //$sth = $conn->query("SET NAMES UTF8"); $sth = $conn->prepare("SELECT * FROM minichat WHERE timestamp > :lastTimestamp ORDER BY id DESC LIMIT 0,10"); $sth->bindParam(":lastTimestamp", $lastTimestamp); $sth->execute(); $result_utf8 = $sth->fetchAll(PDO::FETCH_ASSOC); if(count($result_utf8) > 0) ini_set("zlib.output_compression", "On"); echo json_encode (htmlspecialchars(stripslashes($result_utf8))); ?>

Eléphant du PHP | 120 Messages

13 janv. 2013, 04:13

Fais attention que ces antislashes viennent d'une extension de PHP qui devrait normalement être désactivée parce qu'elle crée une fausse sécurité : magic_quotes. Si tu pouvais demander à ton hébergeur de désactiver cette extension, ce serait la meilleure chose à faire.
Cependant, il y a beaucoup d'hébergeur mal organisés qui ne peuvent pas désactiver des extensions à volonté. Pour cela, il y a un code qui doit être appelé aussi vite que possible pour nettoyer ces variables (je ne l'ai pas sous la main directement, mais je te le note ici from scratch, j'espère que je mettrai pas d'erreur :D) :
function cleanup_magic_quotes() {
	if (!get_magic_quotes_gpc()) {
		return;
	}
	cleanup_magic_quotes_array($_GET);
	cleanup_magic_quotes_array($_POST);
	cleanup_magic_quotes_array($_REQUEST);
	cleanup_magic_quotes_array($_COOKIE);
}
function cleanup_magic_quotes_array(&$array) {
	$copy = $array;
	$array = array();
	foreach ($copy as $key => $value) {
		if (is_string($key)) {
			$key = stripslashes($key);
		}
		if (is_array($value)) {
			cleanup_magic_quotes_array($value);
			$array[$key] = $value;
		} else {
			$array[$key] = stripslashes($value);
		}
	}
}
cleanup_magic_quotes();

Eléphant du PHP | 134 Messages

13 janv. 2013, 04:19

Bonjour

Merci de ta réponse , mon hébergeur ne veut pas ou ne c'est pas le déactiver.

Ou je dois mettre ton code ?

ViPHP
xTG
ViPHP | 7331 Messages

13 janv. 2013, 10:09

Ce code est à placer avant tout traitement des variables $_GET, $_POST, ect. (avant tout traitement mais qu'une seule fois dans le script ;) )

Eléphant du PHP | 120 Messages

13 janv. 2013, 11:26

Bonjour

Merci de ta réponse , mon hébergeur ne veut pas ou ne c'est pas le déactiver.

Ou je dois mettre ton code ?
Dans ce cas, je te conseille fortement de changer d'hébergeur.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

13 janv. 2013, 12:30

Ce n'est pas forcément aussi simple de dire à des gens qui ont un truc qui tourne depuis dix ans qu'ils doivent mettre leur code à jour ou se barrer ailleurs (surtout de le cas des entreprises) :?

Un array_walk pourrait faire la même chose ? (P´tet plus rapidement ?)

@+
Il en faut peu pour être heureux ......

ViPHP
ViPHP | 928 Messages

13 janv. 2013, 12:52

J'aurai aussi utilisé un array_walk, comme ça :
function cleanup_magic_quotes() {
        if (!get_magic_quotes_gpc()) {
                return;
        }

        array_walk_recursive($_GET, 'cleanup_magic_quotes_array');
        array_walk_recursive($_POST, 'cleanup_magic_quotes_array');
        array_walk_recursive($_REQUEST, 'cleanup_magic_quotes_array');
        array_walk_recursive($_COOKIE, 'cleanup_magic_quotes_array');
}
function cleanup_magic_quotes_array(&$value) {
        $value = stripslashes($value);
}
cleanup_magic_quotes();
++

Eléphant du PHP | 120 Messages

13 janv. 2013, 13:06

Non, car les clés des tableaux sont aussi affectées par les quotes magiques.

Eléphant du PHP | 134 Messages

13 janv. 2013, 13:24

Bonjour

Ok je vais essayer cette solution , mais j'attend car après avoir tenté un php.ini pour déactiver magic quotes , mon ip est bannis du site , et l'hébergeur fait le sourd pour retirer mon bannissement donc j'attend . Peut-être que mon Dimanche sera foutu pour résoudre ce problème !!!

Merci pour votre aide

Eléphant du PHP | 120 Messages

13 janv. 2013, 16:10

Encore mieux ! Je me répète, changer d'hébergeur ou au moins faire marcher la concurrence est la meilleure chose à faire.

D'ailleurs il y a des hébergeurs qui te permettent de t'aider pour une migration sans bavure.

Eléphant du PHP | 134 Messages

13 janv. 2013, 19:51

RE

Bon j'ai essayé la solution proposé par Perine , mais cela ne fonctionne, jai essayé avec htmlentities , rien à faire , je suis usé avec ce problème . 8-|

Code : Tout sélectionner

<?php header("content-type: application/json; charset=utf-8"); // Version avec PDO $conn = new PDO('mysql:host=localhost;dbname=***', '**', '***'); function cleanup_magic_quotes() { if (!get_magic_quotes_gpc()) { return; } array_walk_recursive($_GET, 'cleanup_magic_quotes_array'); array_walk_recursive($_POST, 'cleanup_magic_quotes_array'); array_walk_recursive($_REQUEST, 'cleanup_magic_quotes_array'); array_walk_recursive($_COOKIE, 'cleanup_magic_quotes_array'); } function cleanup_magic_quotes_array(&$value) { $value = stripslashes($value); } cleanup_magic_quotes(); $currentTimestamp = time(); $lastTimestamp = (isset($_GET['lastTimestamp'])) ? $_GET['lastTimestamp'] : ($currentTimestamp-1); if (!empty(htmlentities($_POST['pseudo'])) && !empty(htmlentities($_POST['message']))) { /* Attention jamais faire un htmlspecialchars() sur une variable avant mise en bd cela donne un gros risque de coruption de valeur $message = htmlspecialchars ($_POST['message']); $pseudo = htmlspecialchars($_POST['pseudo']); */ //mysql_query("SET NAMES UTF8"); $sth = $conn->prepare("INSERT INTO minichat(pseudo,message,timestamp) VALUES(:pseudo, :message, :timestamp)"); /* pour sécuriser une variable en pdo cette méthode est meilleur $sth->bindParam(":pseudo", $pseudo); $sth->bindParam(":message", $message); $sth->bindParam(":timestamp", $currentTimestamp); */ htmlentities($_POST['pseudo'], ENT_QUOTES, "UTF-8"); htmlentities($_POST['message'], ENT_QUOTES, "UTF-8"); //htmlentities ($_POST['message'], ENT_QUOTES); //$sth->bindValue('pseudo', (htmlentities($_POST['pseudo'])),PDO::PARAM_STR); //$sth->bindValue('message',$_POST['message'],PDO::PARAM_STR);PDO::PARAM_INT //$sth->bindValue('message',(htmlentities($_POST['message'])),PDO::PARAM_STR); $sth->bindValue('timestamp',$currentTimestamp,PDO::PARAM_INT); $sth->execute(); } /* $sth = $conn->prepare("SELECT * FROM minichat WHERE timestamp > :lastTimestamp ORDER BY id DESC LIMIT 0,10"); cette ligne ne peut pas fonctionner, car on ne mélange jamais du pdo avec du mysql c'est soit l'un soit l'autre $conn-> mysql_query("SET NAMES UTF8"); */ //$sth = $conn->query("SET NAMES UTF8"); $sth = $conn->prepare("SELECT * FROM minichat WHERE timestamp > :lastTimestamp ORDER BY id DESC LIMIT 0,10"); $sth->bindParam(":lastTimestamp", $lastTimestamp); $sth->execute(); $result_utf8 = $sth->fetchAll(PDO::FETCH_ASSOC); if(count($result_utf8) > 0) ini_set("zlib.output_compression", "On"); echo json_encode (htmlspecialchars(stripslashes($result_utf8))); ?>

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

13 janv. 2013, 20:21

salut,


A tu vérifié la configuration php du serveur ? (dont notamment les magic_quote)

coté code :

ajoute des var_dump() dans ton code pour voir ce qui ce passe.

par exemple avant l'utilisation de la fonction de Perine et après pour contrôler ce qui ce qui se passe ;)

Même chose à la sortie de ta requête SQL

Quand tu utilise le script directement dans un navigateur tu as quoi ?

A l'insertion dans la table tu utilise et htmlentities et htmlspecialchars, hors tu ne devrais utiliser ni l'un ni l'autre ;)
Ceci afin d'avoir les données brutes en base (ce qui n'est pas gênant) et utilise la fonction que tu veux pour l'affichage (mais pas les deux c'est pas forcément utile).
Tu pourras ainsi, si tu le souhaite utiliser ces données pour faire autre chose (export sous un format quelconque autre que tu html ;) ).


@+
Il en faut peu pour être heureux ......