2010-04-21 3 views
2
if(get_magic_quotes_gpc()) 
{ 
    $location_name = trim(mysql_real_escape_string(trim(stripslashes($_GET['location_name'])))); 
} 
else 
{ 
    $location_name = trim(mysql_real_escape_string(trim($_GET['location_name']))); 
} 

C'est le code que j'ai jusqu'à maintenant. Il me semble que ce code est fondamentalement ... OK. Pensez-vous que je peux retirer en toute sécurité l'intérieur trim(). S'il vous plaît essayez pas un spam moi avec une version sans fin de cela, je veux essayer de apprendre comment faire mieux.Quelle serait une meilleure façon de faire ce qui suit

MISE À JOUR

après avoir lu quelques-unes des réponses, je pense que je suis venu à comprendre une bonne méthode pour obtenir des données en toute sécurité d'un utilisateur, le stockage, puis l'afficher en arrière.

Lorsque vous chargez la page

$foo = trim($_GET['foo']); 
if(get_magic_quotes_gpc()) 
{ 
    $foo = stripslashes($foo); 
} 

Puis, quand vous venez d'utiliser cette variable dans le cadre d'une chaîne SQL, même si ne pas stocker les données dans la base de données, vous devriez y échapper.

mysql_real_escape_string($foo); 

Et enfin, si la lecture des données de la base de données et de vouloir l'afficher comme HTML, un post sur un blog ou un forum, vous devez passer la variable en utilisant htmlspecialchars

echo(htmlspecialchars($bar)); 

Est-ce que l'une souhaitez suggérer un meilleur ensemble de fonctions à utiliser? d'autres enveloppant alors évidemment ces fonctions pour les rendre plus simples à appeler.

+2

Je pense que vous pouvez supprimer en toute sécurité le ** outer ** 'trim()'. Je ne pense pas que mysql_real_escape_string ajoutera des espaces inutiles. –

+0

Une légère correction. pas "quand vous venez d'utiliser * cette * variable dans le cadre d'une chaîne SQL", mais n'importe quelle variable. ** et ** seulement si vous allez le placer entre guillemets. Mais bien sûr, toutes ces règles deviennent obsolètes une fois que vous vous êtes tourné vers des déclarations préparées, comme Manos l'a mentionné. Le reste est parfait. –

Répondre

1

ici:

$location_name = trim($_GET['location_name']); 
if(get_magic_quotes_gpc()) $location_name=stripslashes($location_name); 

Ensuite, il y a aussi la protection de l'injection SQL, mais ne le font pas jusqu'à ce que le dernier moment avant de coller cette var dans une requête SQL. Et même alors, n'appliquez pas les changements à la var elle-même, mais plutôt une copie. Vous pourriez vouloir montrer $ location_name à l'utilisateur après (par exemple si le formulaire échoue). Donc

$sql="UPDATE whatever(location) VALUES('" . mysql_real_escape_string($location_name) . "')" 

Je suppose bien sûr que $ location_name finira dans la base de données; sinon vous n'avez pas besoin de mysql_real_escape_string.

Enfin, vous souhaitez utiliser htmlspecialchars si vous souhaitez afficher $ location_name sur votre page quelque part.

Éditer: Vous souhaitez utiliser htmlspecialchars() juste avant d'afficher les données (ne sauvegardez certainement pas les données qui ont déjà été transformées via htmlspecialchars dans votre base de données). En général, vous voulez utiliser les fonctions d'échappement au dernier moment, puis sur une copie de votre var. De cette façon, vous savez qu'à tout moment du script, le var est l'original et ne porte pas de caractères d'échappement aléatoires provenant d'une transformation qui s'est produite quelque part auparavant.

Vous savez également où vos fonctions d'échappement sont/devraient être. sql escape est proche de/à votre requête sql. XSS échapper (htmlspecialchars) est proche de la partie où vous affichez des données dans une page Web.

Enfin une fois que vous aurez compris les choses, vous pourriez toujours renoncer à l'échappement SQL en utilisant les fonctions PDO de PHP. Aussi à l'avenir, vous voudrez peut-être prendre à regarder cela: Do htmlspecialchars and mysql_real_escape_string keep my PHP code safe from injection?

+0

C'est un bon point à propos de l'utilisation de la réponse directe de la chaîne d'échappement. 'htmlspecialchars()' l'utilisez-vous sur les données lors de leur stockage ou lors de leur affichage? – thecoshman

+0

Les deux très bons points. @thecoshman, tel qu'il est affiché. Ou vous aurez vos données cassées après la deuxième édition. –

1

Je suis désolé de le dire, mais tout dans votre question est erronée.Tout d'abord, cela n'a rien à voir avec la performance, par tous les moyens. ces fonctions ne deviennent jamais un goulot d'étranglement et ne causent jamais de problème de performance.

Ensuite, vous avez choisi un mauvais endroit pour se débarrasser des citations magiques. Les guillemets magiques sont liés aux données d'entrée et non à la base de données. Il est préférable de faire une fonction distincte et de le placer dans votre fichier de configuration, en étant inclus dans chaque script. Vous pouvez utiliser l'un de here

Ainsi, le code se présente comme suit:

$location_name = mysql_real_escape_string(trim($_GET['location_name'])); 

Mais je vous conseille vivement de ne pas la base de données mix échapper à quoi que ce soit d'autre, car tout est autre option While Escaping base de données est stricte et inconditionnel.

+0

Le Colonel Shrapnel (j'aime ce nom) a raison. – AlexV

Questions connexes