Archives de : Sources PHP

Input et php : ne rien oublier

Un champ input où un utilisateur est amené à le remplir avec des valeurs numériques, et un script php mal configuré, peut engendrer pour le webmaster une perte financière importante ou un autre problème selon l’importance de ce champ.

Pourquoi ? Prenons tout simplement un exemple d’un webmaster qui propose à ses membres de faire au site une donation de leurs points gagnés à des jeux. Le membre se retrouve donc confronté au champ input où il entre le montant en points qu’il désire donner… mais pas forcément donner si le script comporte une faille. Regardons par exemple ce script avec l’erreur :

$pseudo = $pseudo['membre'];
// nom de compte du membre
$points = $membre['points'];
// points du membre
$don = intval($_POST['champ_input_de_don']);
// le don du membre
mysql_query(”UPDATE table_membres SET points=points-$don WHERE membre=’$pseudo’”);
// on enleve les points au membre
echo “Merci de votre générosité, vous avez donné $don Points.”;

Vous ne voyez rien ? La variable $don est bien protégée par un intval() mais il reste un problème. Car même si ce code pourrait être opérationnel, il contient un gros problème. Prenons ainsi l’exemple du méchant membre qui utilise ce formulaire de dons pour, au contraire, gagner des points. Comment procède-t-il ? Tout simplement en offrant une valeur négative de points… Par exemple, le membre du nom de mechantvilain offre -10 Points. On a donc du côté de la requête sql :


mysql_query("UPDATE table_membres SET points=points--10 WHERE membre='mechantvilain'");
// on enleve les points au membre
echo "Merci de votre générosité, vous avez donné -10 Points.";

Et voilà, le don empoisonné, car vous savez que - par - donne +, soit une hausse de X points du compte du membre. Cela peut coûter très cher au webmaster d’un site si jamais il ne s’en rend pas compte, alors que pourtant la sécurisation est très simple, il suffit de rajouter une condition ‘if’ à notre script :


if($don>0) { // on execute la requete de don } elseif($don==0) { echo "Vous n'avez donné aucun point"; } else { echo "Vous ne pouvez pas donner une valeur négative de points !"; }

Et avec le code complet, on a :

$pseudo = $pseudo['membre'];
// nom de compte du membre
$points = $membre['points'];
// points du membre
$don = intval($_POST['champ_input_de_don']);
// le don du membre
if($don>0)
{
mysql_query(”UPDATE table_membres SET points=points-$don WHERE membre=’$pseudo’”);
// on enleve les points au membre
echo “Merci de votre générosité, vous avez donné $don Points.”;
}
elseif($don==0)
{
echo “Vous n’avez donné aucun point”;
}
else
{
echo “Vous ne pouvez pas donner une valeur négative de points !”;
}

Et voilà… :) Vous avez avec ce script largement de quoi corriger un autre bug volontaire… en effet, dans notre code il manque une condition permettant de donner des points seulement si le membre en a suffisamment, le cas échéant, par sa trop grande générosité, c’est lui qui se retrouvera cette fois-ci avec un solde de points négatifs. Bonne chance et n’hésitez pas à poster vos propositions. ;)

Dites non au spam !

Vous en avez marre de voir du spam dans votre livre d’or ou ailleurs ? Les spammeurs laissent toujours des liens vers des sites douteux. La solution est donc bien simple : interdire la possibilité de mettre un http:// dans le message. Bien sûr, cela n’éradiquera pas tous les messages de spams, mais ceux qui vous seront dorénavant laissés ne se résumeront qu’à un message du genre “nice site” : autrement dit, des messages pas méchants que vous pourrez vite supprimer.

Le code php est simple et se résume à cela :

if (eregi("http://",$_POST['nomdechamp']))
{
echo “http:// n’est pas autorisé !”;
}
else
{
// si il n’y a pas de http alors on réalise l’action à effectuer
}

Et voilà, n’hésitez pas à coupler ce système à un captcha (image générant un code à écrire) qui lui ne laissera passer aucun message de spam s’il est performant. Les robots et spammeurs humains seront éjectés de la sorte. :)

A bientôt. :D



Bankokado, un site internet du Réseau Poweb