良好的表格安全 - 没有CAPTCHA

时间:2010-04-08 20:49:33

标签: php security forms

是否有一种良好的表单安全方法not涉及CAPTCHA? CAPTCHA太烦人了,但我需要安全性,因为我收到了垃圾邮件。我的表格是PHP。

9 个答案:

答案 0 :(得分:40)

这是我发现的非常有效(而且简单易行):

  1. 在表单上放置一个隐藏字段。给它起一个名字,比如“手机”或类似/普通的东西,并加入默认的垃圾值。

  2. 在表单上放置另一个常规文本输入字段,但使用CSS隐藏它。把它弄空。再次,给它一个“真正的”发声名称(first_name,phone_number,等等)。

  3. 发布表单时,请确认隐藏字段仍具有默认值,并且您使用CSS隐藏的字段仍为空。

  4. 您基本上利用了这样一个事实,即大多数垃圾邮件机器人只会填写表单中的每个字段,以避免任何必要的字段验证检查失败。有些人可能足够聪明,可以忽略隐藏的字段,但我从来没有见过一个足够聪明的东西来忽略用CSS隐藏的字段。

    <强> ETA: 为了解决一些意见 - 这是一个真正的“安全”系统吗?不,肯定不是。任何想要专门针对您网站的人都会轻易打破它。也就是说,对于大多数“低价值”网站都会看到的自动形式垃圾邮件机器人来说,它仍然非常有效。

    如果你想阻止一个坚定的攻击者,你需要更具侵略性的东西。另一张海报提到了Akismet,这是一个不错的选择。 Re-Captcha将是另一个。阻止坚定的,有针对性的垃圾邮件发送者很难。即使YahooGoogle也很难。

答案 1 :(得分:16)

试试akismet。它很擅长标记垃圾邮件。该API易于使用,对用户完全透明。

答案 2 :(得分:12)

这种验证器很可爱又快捷!

CAT BOX http://i39.tinypic.com/157ln4.gif

显然,您需要显示许多可能的动物图像中的一个,并且列表也应该随机化。

我知道它只能在X%的时间内工作,但在列表中添加更多选项将有助于减少垃圾邮件。

答案 3 :(得分:2)

我已经做过类似的事了。

  1. 打开表单时,生成一个md5()字符串并将其放入会话中(例如$ _SESSION ['captha'])
  2. 您的表单应该有一个隐藏字段,当您打开此表单时,请将此数据从$ _SESSION ['captha']写入此隐藏字段
  3. 当您收到此帖子请求时会比较会话值和此隐藏字段附带的值。如果它是相同的,那么就可以了,反之亦然。当然,在您处理此请求后,只需删除变量$ _SESSION ['captha']。
  4. 这项工作适合我。

答案 4 :(得分:1)

如果您所做的只是避免垃圾邮件机器人(搜索<form>标签的自动程序,请填写所有<input>字段,然后提交表单),那么一个简单的解决方案就是像Paolo所说的那样做:使用JavaScript添加隐藏字段。缺点是禁用JavaScript的人。

随意使用:

<form method="post" action="contact.php" id="commentForm">
  <label for="name">Name</label>
  <input type="text" name="name" id="name" maxlength="64" /><br />

  <label for="email">Email</label>
  <input type="text" name="email" id="email" maxlength="320" /><br />

  <label for="message">Message</label>
  <textarea name="message" rows="10" cols="40" id="Message"></textarea><br />

  <label for="human">40 + 2 =</label>
  <input type="text" name="human" id="human" size="10" maxlength="3" /><br />

  <p align="center">
  <input type="submit" name="submit" value="Send" class="submit-button" />
  </p>
</form>

然后将以下内容作为“contact.php”放在同一目录中:

<?php
require_once 'lib/swift_required.php';

// Reason for not contacting.
//
$reason = 'default';

error_reporting( 0 );
ini_set( 'display_errors', 0 );

function not_contacted() {
  global $reason;

  header( 'Location: error.html' );
}

function wms_error_handler($errno, $errstr, $errfile, $errline) {
  not_contacted();
  return true;
}

function wms_shutdown() {
  if( is_null( $e = error_get_last() ) === false ) {
    not_contacted();
  }
}

set_error_handler( "wms_error_handler" );
register_shutdown_function( 'wms_shutdown' );

$name = trim( $_POST["name"] );
$email = trim( $_POST["email"] );
$message = trim( $_POST["message"] );
$human = trim( $_POST["human"] );
$subject = 'FormSpam';
$contacted = false;

if( is_null( $name ) || empty( $name ) ) {
  $reason = 'name';
  $human = false;
}
else if( is_null( $email ) || empty( $email ) ) {
  $reason = 'email';
  $human = false;
}
else if( is_null( $message ) || empty( $message ) ) {
  $reason = 'message';
  $human = false;
}
else if( is_null( $human ) || empty( $human ) || $human !== '42' ) {
  $reason = 'computer';
  $human = false;
}

if( $human === '42' ) {
  $subject = 'YourCustomSubject - '.$name;

  $transport = Swift_SmtpTransport::newInstance( 'localhost', 25 );
  $mailer = Swift_Mailer::newInstance( $transport );

  $message = stripslashes( $message );

  $message = Swift_Message::newInstance()
    ->setSubject( $subject )
    ->setFrom( array( $email => $name ) )
    ->setTo( array( 'YourEmailAddress' => 'Your Name' ) )
    ->setPriority( 1 )
    ->setBody( $message )
  ;

  if( $mailer->send( $message ) ) {
    header( 'Location: contacted.html' );
    $contacted = true;
  }
}

if( $contacted === false ) {
  not_contacted();
}
?>

应该阻止99%的垃圾邮件。

我没有添加常量,但我相信你可以找出更改脚本的位置。我已经删除了重定向到不同页面的部分,具体取决于用户输入的内容(例如,缺少全名,电子邮件地址,消息等)。如果你想要一个完整版的脚本,请告诉我,我会修改代码,使其更加适合开发人员。

请注意Swift Mailer依赖项。

答案 5 :(得分:1)

是的,我多年前发明并开发了一种名为nocaptcha的方法。

我测试过在我的网站上使用它一年,然后注意到Google也使用它。

我为Joomla发布了它(见 http://shop.ekerner.com/index.php/shop/joomla-nocaptcha-detail) 因为它已被许多平台复制(见https://www.google.com.au/search?q=nocaptcha)。

我相信通过上述链接的git托管版本可以部署到任何网站,如果您无法找到适合您网站的版本,那么可以请求我的开发团队提供自定义解决方案(请参阅:http://www.ekerner.com/)。

答案 6 :(得分:0)

数学问题是有趣的选择。您甚至可以使用随机数编写自己的简单数学检查器。

以下是几个插件:

http://www.codegravity.com/projects/mathguard

http://sw-guide.de/wordpress/plugins/math-comment-spam-protection/

答案 7 :(得分:0)

取决于表单垃圾邮件的类型,为发现垃圾邮件而制作的一般机器人很容易被很少阻碍措施(例如“这个网站的名称是什么?”)挫败,但如果有人制作了专门针对您的网站的机器人,您将需要验证码或同样令人讨厌的东西。

答案 8 :(得分:0)

如果迫切需要减少垃圾邮件,将表单放在iframe中对我来说是有效的。

<iframe src="contactform.php" scrolling="no" height="*"  width="*"></iframe>

将框架的高度和宽度设置为比表单的宽度和高度略大。使用CSS使框架边框为0,这样用户就不会注意到他们正在框架内查看表单。