是否有一种良好的表单安全方法not
涉及CAPTCHA? CAPTCHA太烦人了,但我需要安全性,因为我收到了垃圾邮件。我的表格是PHP。
答案 0 :(得分:40)
这是我发现的非常有效(而且简单易行):
在表单上放置一个隐藏字段。给它起一个名字,比如“手机”或类似/普通的东西,并加入默认的垃圾值。
在表单上放置另一个常规文本输入字段,但使用CSS隐藏它。把它弄空。再次,给它一个“真正的”发声名称(first_name,phone_number,等等)。
发布表单时,请确认隐藏字段仍具有默认值,并且您使用CSS隐藏的字段仍为空。
您基本上利用了这样一个事实,即大多数垃圾邮件机器人只会填写表单中的每个字段,以避免任何必要的字段验证检查失败。有些人可能足够聪明,可以忽略隐藏的字段,但我从来没有见过一个足够聪明的东西来忽略用CSS隐藏的字段。
<强> ETA:强> 为了解决一些意见 - 这是一个真正的“安全”系统吗?不,肯定不是。任何想要专门针对您网站的人都会轻易打破它。也就是说,对于大多数“低价值”网站都会看到的自动形式垃圾邮件机器人来说,它仍然非常有效。
如果你想阻止一个坚定的攻击者,你需要更具侵略性的东西。另一张海报提到了Akismet,这是一个不错的选择。 Re-Captcha将是另一个。阻止坚定的,有针对性的垃圾邮件发送者很难。即使Yahoo和Google也很难。
答案 1 :(得分:16)
试试akismet。它很擅长标记垃圾邮件。该API易于使用,对用户完全透明。
答案 2 :(得分:12)
CAT BOX http://i39.tinypic.com/157ln4.gif
显然,您需要显示许多可能的动物图像中的一个,并且列表也应该随机化。
我知道它只能在X%的时间内工作,但在列表中添加更多选项将有助于减少垃圾邮件。
答案 3 :(得分:2)
我已经做过类似的事了。
这项工作适合我。
答案 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,这样用户就不会注意到他们正在框架内查看表单。