如何在PHP联系表单中防止垃圾邮件URL

3

我已创建一个表单,用户可以添加评论。也许这很显然,但我该如何避免用户在文本区域中插入url?有没有一种方法可以检查这个问题? 我已经添加了验证码来检查是否为人类。

<form action="" method="POST" name="form">
  some other input fields

             <span id="sprytextarea1">
             <textarea name="Comments" cols="50" rows="3" ></textarea>
             <span class="textareaRequiredMsg">A value is required.</span></span></p>

  <img id="captcha" src="/securimage/securimage_show.php" alt="CAPTCHA Image" /><input type="text" name="captcha_code" size="10" maxlength="6" />

<a href="#" onclick="document.getElementById('captcha').src = '/securimage/securimage_show.php?' + Math.random(); return false">[ Different Image ]</a>

  <input name="Submit" type="submit" value="Submit your form ">
           <input type="hidden" name="MM_insert" value="form">
           </form>

欢迎提出任何建议。

1
这就是 CAPTCHA 的作用 - 最小化 机器人/垃圾邮件(尽管它很容易被工资差异攻破)。现在,可以 删除 所有 URL 或类似 URL 的文本,但这将破坏非垃圾邮件链接,并且无法防止巧妙的表现形式。或者,要求进行身份验证,并相信那些花时间注册的人不会发送垃圾邮件。 - user2864740
1
如何验证输入? - Khem
3个回答

3

在插入数据库之前加上if条件。

if(preg_match("/\b(?:(?:https?|ftp|http):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i",$_POST['comment'])){

echo 'error please remove URLs';

}else
{....

1
这并不能阻止所有的URL,例如它不能阻止aahttps://dev59.com/questions/yXnZa4cB1Zd3GeqPsqWe - Abe

0
使用PHP,你可以尝试使用preg_match()和strip_tags()两种方法或者将它们结合起来。以下代码将清理文本区域,同时为数据库转义。
表单提交后,请尝试以下操作。
$post = array();

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

// strip all HTML and escape values for database

$post[$k] = strip_tags(mysql_real_escape_string($v));
}

// check of we have URL in text area

if(preg_match('/www\.|http:|https:/'i,$post['Comments']){

// prevent form from saving code goes here
echo 'error please remove URLs';

}else{
// let form be saved
}

使用预处理语句将不安全的内容放入数据库中。PDO和MySQLi都提供了相应的方法。甚至,mysql_*函数已经被弃用。 - Fez Vrasta
不完全确定验证码如何防止用户直接将URL插入表单,这不是它们的作用。OP问是否有一种方法可以检查表单并防止用户插入URL。上面的代码应该可以做到这一点。验证码似乎只能实现一个目的,那就是防止机器人或非人类的垃圾评论。 - Leon
我没有谈论验证码。 - Fez Vrasta
这个答案中的正则表达式在大多数情况下足以检查主题中是否存在URL。然而,这个答案中的数据库内容应该像瘟疫一样避免(已弃用,不安全等)。 - Justin
谢谢Leon,你的答案是正确的。我只需要改变一些位,这就是最终结果:如果(preg_match('/www.|http:|https://[a-z0-9_]+([-.]{1}[a-z_0-9]+).[_a-z]{2,5}'.'((:[0-9]{1,5})?/.)?$/i', $_POST['Comments'])){ - Ria
研究人员不应使用mysql_real_escape_string() - mickmackusa

0

简单来说,在输入文本中检查URL没有任何自动方式。您只需对用户输入进行人工检查。

例如:假设您尝试为URL应用正则表达式检查,而我想欺骗它,我可能会编写无限字符串,显示为URL:

  • http: example .com
  • h ttp:// ecxampleDOTcom
  • ht-tp: / / ecample. Com
  • 等等

因此,任何评论系统要实现终极垃圾邮件保护,都需要应用审核员审查,由人类检查内容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接