2009-09-15 3 views
0

Le code ci-dessous contient du code PHP qui permet aux utilisateurs d'envoyer des invitations par e-mail à d'autres utilisateurs. Ça fonctionne bien. Cependant, j'essaie d'ajouter une fonction appelée "check_porn_terms" afin qu'aucun utilisateur ne puisse entrer son nom en tant que "porn" ou d'autres termes vulgaires et ensuite envoyer un email sous ce nom recommandant mon site. La variable "$ _POST ['sendername']" est le nom de l'utilisateur.Blocage des termes vulgaires à partir d'une invitation électronique

La fonction ci-dessous ne fonctionne pas. Une idée de comment je peux le faire fonctionner?

Merci à l'avance,

John

function check_porn_terms($input) { 
    $porn_terms = array("porn", "sex", "etc."); 

    return !preg_match('#\b(' . join('|', array_map('preg_quote', $porn_terms)) . ')\b#i', $input); 
} 


$sendername = $_POST['sendername']; 
$sendername = strtolower($sendername); 

if(!check_porn_terms($sendername)) 
{ 

    session_write_close(); 
    header("Location:http://www.site.com/friends.htm"); 
    exit; 

} 

$msg = "<html><body>Hello, your friend ".htmlspecialchars($_POST['sendername'])." recommends that you use <a href='http://www.site.com/'>Site.com</a><br><br><img src='http://site.com/images/blacklogo.PNG'></body></html>"; 
$subject = "Try out Site.com"; 
$headers = 'MIME-Version: 1.0' . "\r\n"; 
$headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n"; 
$headers .= 'From: ' . $_POST['sendername'] . "\r\n"; 
foreach($_POST['email'] as $email){ 
mail($email, $subject,$msg,$headers); 
} 
+5

Une référence clbuttique de cette façon vient ... – JohnFx

+0

Je devais google "clbuttic" ... drôle. – John

+0

Je remets en question les implications de placer ce script sur votre site du tout. Fondamentalement, la façon dont vous l'avez ici, je pourrais faire une demande de poste, et vous enverriez cet email à des milliers de personnes, si je le voulais. – notJim

Répondre

0

I figured it out: je devais ajouter

ob_start(); 

en haut du code, dans l'en-tête. Je pense que cela est parce que j'utilisais ceci:

header("Location:http://www.site.com/friends.htm"); 
5

Vous allez sur une pente glissante en essayant d'arrêter cela comme indiqué ci-dessus par la référence clbuttic. Même quand vous obtenez le code ci-dessus pour fonctionner, il peut être très facilement contourné et vous devrez combattre cette bataille constamment ET vous causerez par inadvertance des effets secondaires tels que bloquer de bons mots. Vous voudrez peut-être reconsidérer votre tactique à ce sujet.

Lisez ces quelques réflexions à ce sujet:

http://thedailywtf.com/Articles/The-Clbuttic-Mistake-.aspx

http://www.codinghorror.com/blog/archives/001176.html

Rappelez-vous, je pense qu'il est admirable pour essayer d'arrêter la vulgarité et j'aimerais savoir d'une meilleure technique dans le monde de logiciel pour résoudre ceci ... (je suis sûr que quelqu'un a trouvé une meilleure manière).

+0

Comment la fonction peut-elle être contournée? – John

+0

Dans votre cas, je sais que vous le limitez aux limites de mots et au champ de nom, de sorte qu'il est beaucoup plus limité. Cependant, ne sachant pas les possibilités sur le champ nom d'utilisateur, je crois que vous pourriez avoir des problèmes. Et si quelqu'un utilisait JoePornoStar ....?Si c'est quelqu'un qui envoie des invitations par courrier électronique, pourquoi autoriser le nom de l'expéditeur? Faites-le définir le nom complet des noms d'utilisateur dans leurs paramètres si vous avez cela par exemple .... Juste quelques réflexions à ce sujet .... – klabranche

+0

Voici quelques-uns pour vous: "hot s3x" "hot six" "hot s * x "" hot sx "" hot sxe "" hotsex ", etc etc. Il suffit de dire, si j'étais un spammeur essayant d'envoyer du spam porno en utilisant votre formulaire, je pourrais trivialement trouver une centaine de variantes non filtrées de n'importe quel mot que vous filtrez. –

0
function check_porn_terms($input) { 
    $porn_terms = array("porn", "sex"); 
    $r = '`(' . implode('|', array_map('preg_quote',$porn_terms)) . ')`is'; 
    $ok = preg_match($r, $input,$m); 
    return !$ok; 
} 

Habituellement, je n'utilise pas \b (limite de mot) pour faire correspondre les mots. et oui, est probablement your Location: header

Questions connexes