2011-03-01 9 views
2

Mon patron a mis en place un script pour traiter les formulaires via PHP et envoyer les résultats par e-mail. Nous sommes requis pour utiliser ce processeur. Le problème avec le processeur est cette ligne de code:Traitement des cases à cocher avec PHP

foreach ($_POST as $k => $v){$$k = strip_tags($v);} 

Ce serait bien si toutes les valeurs étaient envoyées seulement des chaînes, mais je suis en train de traiter quelques cases à cocher qui sont passés sous forme de tableaux. D'après ce que je comprends, la fonction strip_tags ne fonctionne qu'avec des chaînes. Il traite tout et envoie les résultats par e-mail comme il se doit, mais il envoie un avis chaque fois qu'il essaie de traiter une série de cases à cocher. Note: conversion de tableau en chaîne ... Le processus fonctionne toujours, je reçois juste des avis laids partout. Afin de résoudre temporairement le problème, je l'ai enlevé la fonction strip_tags, ce qui suit:

foreach ($_POST as $k => $v){$$k = $v;} 

Tout fonctionne maintenant correctement et je reçois pas les avertissements, les erreurs ou des avis. Cependant, après avoir signalé cela à mon patron, il veut que je revienne au code original et que je donne à chaque case un nom unique, au lieu de leur donner le même nom avec des valeurs différentes. Je pourrais le faire, mais je sais que ce n'est pas la bonne façon de traiter une série de cases à cocher. De plus, cela crée toutes sortes de maux de tête. Mon patron ne comprend tout simplement pas comment travailler avec des tableaux, alors il trouve des bêtises comme ça à chaque fois qu'il en rencontre un. Il prétend également qu'il s'agit d'une sorte de protection anti-spam pour empêcher les gens d'ajouter des destinataires à nos formulaires. Je ne suis peut-être pas un expert en PHP, mais je suis à peu près sûr que cette affirmation est fausse.

Alors, que puis-je faire pour résoudre ce problème? Je sais que je devrais d'abord convertir les tableaux de cases à cocher en chaînes, puis utiliser la fonction strip_tags sur les chaînes résultantes, mais je suis encore relativement nouveau pour PHP et je ne comprends pas tout à fait ce que fait cette ligne de code. Quelqu'un peut-il m'aider au moins à me diriger dans la bonne direction?

+2

je trouve les variables variables encore pire ... –

+4

Il est temps de quitter votre emploi actuel;) Cette ligne de code dit tout sur votre entreprise. – NikiC

+0

Tour de citations magiques; alors vous n'aurez plus besoin de retirer toutes les étiquettes. –

Répondre

2

Soulignez à votre patron que:

<input type="checkbox" name="valid_recipient[]" value="1" /> [email protected] 
<input type="checkbox" name="valid_recipient[]" value="x" /> [email protected] 

et

<input type="checkbox" name="valid_recipient1" value="1" /> [email protected] 
<input type="checkbox" name="valid_recipient2" value="x" /> [email protected] 

sont la même chose, qu'ils sont transmis comme un tableau de valeurs de cases à cocher, ou paires case/valeur individuelle. Quoi qu'il en soit, M. Nasty vient d'injecter quelque chose dans votre liste de cases à cocher.

De plus, ce qui est un utilisateur malveillant dans la forme de la mise en

<input type="hidden" name="_POST" value="haha I wiped your post array!" /> 

. Votre PHB de dandy à portée de main « nous fait complètement sécurisée » processeur a juste nuked joyeusement le tableau $ _POST, tout en étant « complètement sécurisée »

+1

+1 pour la dernière partie;) – NikiC

0

Passant cases comme un tableau est Kush:

<input type="checkbox" name="myarray[key1]" value="hello world" /> 
<input type="checkbox" name="myarray[key2]" value="well hello again" /> 

créerons une résultante $ _POST comme:

Array 
(
    [myarray] => Array 
     (
      [key1] => hello world 
      [key2] => well hello again 
     ) 

) 

Bien que ce soit impressionnant, cela signifie aussi que votre code de patrons est doublement précaire:

Tout d'abord, ne pas avoir le strip_tags vous rend vulnérable aux attaques XSS.Deuxièmement, faire confiance naïvement $_POST noms de variables et les exporter dans l'espace de noms global est une recette pour le désastre. (Il y a une raison pour laquelle register_globals est une chose du passé). Par exemple, supposons que vous suiviez le nom d'utilisateur de qui est connecté à l'aide d'une variable simple $_SESSION. Quelque chose comme ceci:

if ($_SESSION['logged_in_user'] == 'admin') { 
    // do administrator things 
} 

Eh bien, en acceptant et l'exportation $_POST variables et attaquant pourrait modifier un élément de formulaire HTML comme ceci:

<input type="checkbox" name="myarray[key1]" value="hello world" /> 

Et tripoter dans quelque chose comme ça (en utilisant Firebug ou Chrome) :

<input type="checkbox" name="_SESSION[logged_in_user]" value="admin" /> 

Tad-ah! Tout utilisateur anonyme peut obtenir un accès administrateur au site Web.

Voici un script simple pour votre considération:

<pre> 
<?php 
session_start(); 
$_SESSION['logged_in_user'] = 'pygorex1'; 
print_r($_SESSION); 
foreach ($_POST as $k => $v) { 
    $$k = $v; 
} 
?> 
</pre> 
<form method="post"> 
<input type="checkbox" name="myarray[key1]" value="hello world" /> 
<input type="checkbox" name="_SESSION[logged_in_user]" value="admin" /> 
<input type="submit" value="go go gadget" /> 
</form> 
<pre> 
<?php 
print_r($_SESSION); 
print_r($myarray); 
session_write_close(); 

if ($_SESSION['logged_in_user'] == 'admin') { 
    echo("OWNED\n"); 
} 

?> 
</pre>