2010-09-25 4 views
1

J'ai un formulaire de contact simple avec nom, email, liste de sélection et zone de texte. Dans mon script php mailer j'essaye d'ajouter un filtre simple pour empêcher l'injection de SQL ou d'autres formes de piratage.entrées de formulaire de filtrage

Par exemple, j'utilise

$name = filter_input(INPUT_POST, 'name', FILTER_SANITIZE_SPECIAL_CHARS); 

Est-ce bon?

Répondre

1

Tout d'abord, laissez-moi vous dire qu'environ 85% des méthodes de protection sont effectuées avec 2 fonctions.

Tout d'abord, si quelqu'un envoie des données sur votre site telles que $_POST['name'], et que vous souhaitez utiliser cette valeur de retour sur le côté html, comme <p>The following string: {$_POST['name']} is invalid</p> alors vous devriez toujours vous assurer que cette valeur a été à travers htmlspecialchars, cela protégera plus de tentatives XSS

Suivant est injection, si la valeur de $_POST['name'] va dans votre base de données, assurez-vous que vous utilisez mysql_real_escape_string sur cette valeur.

qui vous donnera 100% de protection contre l'injection sql, mais tout cela signifie que votre db ne peut pas exécuter les commandes de l'utilisateur, cela ne signifie pas que le texte est ce qu'il devrait être.

Les fonctions que vous devez toujours utiliser avant d'insérer des données dans votre base de données sont

Ceci est appelé validation et est seulement nécessaire pour yout pour vous assurer que les données que l'utilisateur soumet est ce que vous voulez, comme filter_var serait utilisé pour valider que l'e-mail qu'ils ont entré est un e-mail et pas seulement quelques-uns bla bla

Ce que je généralement tente ne faire est d'exécuter une fonction propre pour vous assurer que toutes les données d'imputation est propre avec htmlspecialchars

exemple:

function clean($array) 
{ 
    foreach($array as $key => $val) 
    { 
     if(is_array($val)) 
     { 
      $array[$key] = clean($val); //Recursive 
     }else 
     { 
      $array[$key] = htmlspecialchars($val, ENT_QUOTES); 
     } 
    } 
    return $array; 
} 

faire la commande suivante pour vous assurer que votre coffre-fort de XSS:

$_GET = clean($_GET); 
$_POST = clean($_POST); 

donc, si quelqu'un a essayé de présenter <a href='test'>Test</a> la valeur serait convertie en &lt;a href=&#039;test&#039;&gt;Test&lt;/a&gt

+0

Excellente explication! Merci pour la fonction aussi :) Pensez-vous que 'FILTER_SANITIZE_SPECIAL_CHARS' est une meilleure alternative à la fonction ou aura le même résultat? – Noob

+0

Non, Bien que ** FSSC ** soit très bon, je peux garantir que les deux autres fonctions sont les plus efficaces au sein de PHP. – RobertPitt

0

Pour tester l'efficacité, essayez d'attaquer votre propre site avec des attaques par injection SQL. Fondamentalement, essayez de passer des chaînes comme ' || 1=1 et voir si vous obtenez une erreur. Si vous obtenez une erreur ou si vous obtenez un résultat inattendu, votre site est vulnérable aux attaques. Sinon, cela fonctionne probablement; mais pour être sûr, assurez-vous de faire beaucoup de tests.

+0

Merci pour la suggestion, j'ai essayé '' 'et je' get ' 'dans mon email. Donc je suppose que c'est efficace :) – Noob

+0

C'est correct alors. Les caractères que vous devriez essayer sont '\' ',' '', '" ',' & ',' = ', et'? '. –

+0

Ils sont tous filtrés :) FILTER_SANITIZE_SPECIAL_CHARS semble être bon :) – Noob

0

La meilleure option consiste à utiliser les extensions mysqli et les instructions préparées. Cependant, il existe la fonction mysql_real_escape_string() qui "échappe spécifiquement les caractères spéciaux dans une chaîne pour une instruction SQL".

+0

I voir mais je n'envoie pas de données à la base de données mais des emails – Noob

0

FILTER_SANITIZE_SPECIAL_CHARS ne HTML-escape « » <> & et caractères dont la valeur ASCII inférieur à 32. Pour avoir un équivalent complet pour htmlspecialchars(), utilisez FILTER_SANITIZE_FULL_SPECIAL_CHARS ce qui équivaut à appeler htmlspecialchars() avec ENT_QUOTES fixés. Utiliser cette fonction devrait rendre l'utilisation de mysql_real_escape_string() obsolète, mais la sécurité d'abord :)

voir aussi: http://php.net/manual/en/filter.filters.sanitize.php pour plus d'informations.

Questions connexes