2010-08-09 31 views
7

J'utilise normalement cette fonction pour aseptiser mes entrées de forme avant de les stocker dans ma base de données:formulaire de contact Désinfecter sans mysql_real_escape_string

//Function to sanitize values received from the form. Prevents SQL injection 
function clean($str) { 
    $str = @trim($str); 
    if(get_magic_quotes_gpc()) { 
     $str = stripslashes($str); 
    } 
    return mysql_real_escape_string($str); 
} 

Jusqu'à aujourd'hui, je ne savais pas que mysql_real_escape_string requiert une connexion de base de données comme je l'ai seulement utilisé quand j'ai nettoyé les données avant de les stocker dans la base de données.

J'ai essayé d'utiliser la fonction sur un formulaire de contact et j'ai obtenu l'erreur "Un lien vers le serveur n'a pas pu être établie". Je pourrais me connecter à la base de données mais ce n'est pas nécessaire parce que j'essaie simplement d'assainir les données avant qu'elles ne soient envoyées à mon adresse e-mail via le formulaire de contact. Quel est le meilleur moyen d'assainir les données qui ne sont pas stockées dans une base de données mysql et ces données doivent-elles encore être nettoyées?

Répondre

15

utilisation filter_var()

http://php.net/manual/en/function.filter-var.php

comme si vous voulez aseptiser un email:

$_POST['email'] = filter_var($_POST['email'], FILTER_SANITIZE_EMAIL); 

au message

$_POST['message'] = filter_var($_POST['message'], FILTER_SANITIZE_STRING); 

est enogth

+0

Quels filtres voulez-vous dire, s'il vous plaît? il ya tellement d'entre eux –

1

Le but de la désinfection des données avec mysql_real_escape_string est d'éviter l'injection SQL. Si vous n'utilisez pas SQL, vous êtes déjà immunisé.

Les hommes ne contractent pas le cancer du col de l'utérus.

Utilisez une fonction de désinfection adaptée aux caractères spéciaux que vous devez éviter. Idéalement, ne dépouillez pas quelque chose qui ne causera pas de dommages.

+0

mysql_real_escape_string seul n'aident rien –

-1

Tout le concept est faux. Cette fonction n'aide pas pour l'email même pas pour la base de données.

mysql_real_escape_string ne "désinfecte" rien. Il est simplement délimiteurs d'échappement et rien d'autre. Juste pour éviter les erreurs de syntaxe si vous avez un délimiteur dans vos données:

SELECT * FROM table WHERE name = 'it's me' # error! 

après que les données sont échappés, vos données deviennent 'it\'s me' et il n'y a pas d'erreur.
Par conséquent, cette fonction fonctionne uniquement avec une requête SQL et pour les données, entre guillemets seulement. Ainsi, il n'y a aucun sens à faire juste mysql_real_escape_string sans avoir de guillemets autour de. mysql_real_escape_string doit être utilisé
a) seul. b) juste avant la composition de la chaîne de requête et pas ailleurs
c) uniquement avec les données qui seront placées entre guillemets.
d) toutes les autres données ont besoin d'un autre moyen de désinfection

Comme pour le courrier électronique, vous n'avez pas besoin de nettoyage, vous l'envoyez en texte brut. La seule précaution que vous devez prendre est contre injection de courrier
Ce n'est pas un gros problème. Il suffit de mettre l'entrée de l'utilisateur dans le corps du message uniquement. pas dans le sujet, à ou à partir de ou tout autre en-tête. Corps du message uniquement. Et vous êtes en sécurité

+0

Quoi? Toujours utiliser l'assainissement. Ne faites jamais confiance à l'utilisateur. Un tel conseil suppose que a) il n'y a aucun moyen d'injecter un en-tête différent dans le script (si vous n'êtes pas en train d'assainir l'entrée, comment le savez-vous?) Et b) que tous les clients mail feront la bonne chose même avec un texte/en-tête. J'en doute sérieusement. – Cfreak

+0

@Cfreak le seul point sensible ici est à propos de certains clients de messagerie étrange. Vous en avez un comme exemple? Mais vous "ne faites jamais confiance à l'entrée de l'utilisateur" prière absurde est en effet drôle. Pourquoi ne pas avoir de l'expérience avant de juger les autres? –

-1

(Je suis nouveau à stackoverflow donc je vais sur ce dans le mauvais sens/faire un mauvais travail avec le style de ma réponse ne hésitez pas à me le faire savoir.)

me corrigerez si je me trompe car je fais aussi face au même problème en ce moment, mais je ne pense pas que la réponse acceptée en utilisant filter_var soit suffisante car les attaquants pourraient contourner cela en utilisant unicode.

Exemple: "& # 66; # 99 &; & # 99; # 58 &;" (les espaces ajoutés pour que stackoverflow l'affiche correctement)

Ceci ne serait pas supprimé de la chaîne, et serait remplacé plus tard par "Bcc:".

Ceci est ma solution, mais il pourrait y avoir une meilleure solution. Si quelqu'un en connaît un, j'aimerais l'entendre.

$string = str_replace("&", "(and)", $string); 
    $string = str_replace("#", "(num)", $string); 
    $string = str_replace(";", "(semi-colon)", $string); 
    $string = str_replace(":", "(colon)", $string); 
    $string = str_replace("@", "(at)", $string); 
    $string = str_replace("\\", "(backslash)", $string); 
    $string = filter_var($string, FILTER_SANITIZE_STRING);