良好的表单安全性 – 没有validation码

是否有一种not涉及CAPTCHA的forms安全方法? validation码很烦人,但我需要安全,因为我正在接收表单垃圾邮件。 我的表单是PHP。

尝试akismet 。 标记垃圾邮件非常棒。 该API易于使用,对用户完全透明。

以下是我发现的非常有效的(并且简单):

  1. 把一个隐藏的领域放在你的表格上。 给它一个像“电话”或类似的/普通的名字,并把一个默认的垃圾值。

  2. 将另一个常规文本input字段放在窗体上,但用CSS隐藏。 把那个弄空。 再次,给它一个“真正的”冠冕堂皇的名字(first_name,phone_number,无论)。

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

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

ETA:解决一些问题 – 这是一个真正的“安全”系统吗? 不,它当然不是。 任何人都希望专门针对您的网站,这将被微不足道的破坏。 也就是说,对于大多数“低价值”网站将会看到的自动化垃圾邮件机器人来说,它仍然是非常有效的。

如果你想停止一个坚定的攻击者,你将需要更多的入侵。 另一张海报提到Akismet,这是一个很好的select。 重新validation码将是另一个。 停止确定的,有针对性的垃圾邮件制造者虽然很难 即使雅虎和谷歌也很难。

这种validation器是可爱又快速的!

CAT BOX 160wpb4.gif

显然,你会想要显示许多可能的动物图像之一,该列表也应随机化。

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

我已经做了类似的工作。

  1. 当你打开一个表单生成一个md5()string,并把它放在会话中(例如$ _SESSION ['captha'])
  2. 你的表单应该有一个隐藏的字段,当你打开这个表单时,把这个数据从$ _SESSION ['captha']写入这个隐藏的字段
  3. 当你收到这个隐藏字段的session和value中的这个post请求比较值。 如果是相同的,则可以,反之亦然。 当然,处理这个请求之后,只需删除variables$ _SESSION ['captha']。

这为我工作。

如果你正在做的是避免垃圾邮件机器人(寻找<form>标签的自动化程序,填写所有<input>字段,然后提交表单),然后一个简单的解决scheme是做保罗说:使用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%的垃圾邮件。

我没有添加常量,但我相信你可以找出在哪里改变脚本。 根据用户input的内容(例如,缺less全名,电子邮件地址,信息等),我删除了redirect到不同页面的部分。 如果你想要一个完整版本的脚本,让我知道,我会修复代码,以更加新的开发友好。

请注意Swift Mailer依赖项。

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

我testing在我的网站中使用了一年,然后注意到谷歌也使用它。

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

我相信通过上面的链接的git托pipe版本可以部署到任何网站,如果你不能find你的网站的版本,那么也许要问我的开发团队的自定义解决scheme(见: http : //www.ekerner.com/ )。

math问题是有趣的select。 你甚至可以使用随机数编写自己的简单的math检查。

这里有几个插件:

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

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

取决于表单垃圾邮件的types,一般的机器人发现的任何forms的垃圾邮件都可以通过很less的阻碍措施(比如“这个网站的名称是什么”)轻易被挫败,但是如果有人制作了一个针对你的机器人网站特别是你将需要validation码或一样恼人的东西。

如果减less垃圾邮件是当务之急,把表单放在iframe中对我来说是有效的。

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

将框架的高度和宽度设置得比表单的宽度和高度稍大。 使用CSS来使框架边框0,所以用户不会注意到他们正在看框架内的forms。