东东东 陈煜东的博客

标签存档: web

分享一个不用验证码的阻止垃圾机器人提交留言表单算法

spam-evil

每个博客主或者网站都会受到各式各样的垃圾留言骚扰。如果网站不及时清理这些垃圾留言,那么整个网站的可读性将会变得越来越糟糕,最后完全被垃圾浏览给占领了。

现在博客使用的是 WordPress,使用的是一个官方的插件 Akismet,这个程序还不错,通过后台大数据分析来识别垃圾评论。

不过除了 Akismet,我还有安装另外一个插件,这个插件很小巧,并且我觉得思路很不错。通过这两个插件来可以过滤很多的垃圾评论。

作者的思路是这样的:

为什么人类应该通过填充验证码(CAPTCHA)证明他们是人类?应该是让机器人通过 JavaScript 来证明他们不是机器人!

下面说说这个插件 anti-spam 使用的算法。

这个算法是基于 2 个方法:不可见的 JS 验证码(invisible js-captcha)不可见的输入框陷阱(invisible input trap)

不可见的 JS 验证码 invisible js-captcha

不可见的 JS 验证码(invisible js-captcha)方法基于一个事实:机器人在他们的在程序中不会执行 JavaScript 代码。

所以默认在输出 HTML 评论框的时候,加入了一个隐藏的问题和输入框,问题是今年是公元 xxxx 年。

如果用户访问网站,这个输入框答案会被 JavaScript 自动回答,并且会被 JavaScript 和css 的手段隐藏起来,不让用户看到。

如果机器人去填写答案没有填写正确,那么就会被判定是垃圾信息。

作者实现很鸡贼,其实这里有两个输入框,一个输入框是正确的答案,一个输入框是错误的答案。

<p class="antispam-group antispam-group-q" style="clear: both;">
    <label>Current ye@r <span class="required">*</span></label>
    <input type="hidden" name="antspm-a" class="antispam-control antispam-control-a" value="'.date('Y').'" />
    <input type="text" name="antspm-q" class="antispam-control antispam-control-q" value="'.ANTISPAM_PLUGIN_VERSION.'" autocomplete="off" />
</p>

如果用户没有开启 JavaScirpt ,那么需要在这里情况内容,输入正确的答案。否者在后台就被判断是无效留言。

JS 自动回答答案

// 对表单答案添加答案,答案已经在 antispam-control-a 提供出来了。
elements = document.querySelectorAll('.antispam-control-q');
len = elements.length;
for (i = 0; i < len; i++) { // set answer into other input instead of user
    elements[i].value = answer;
}

...

// 这里利用 JavaScript 添加一个动态的表单
// 如果没有开启
dynamic_control = document.createElement('input');
dynamic_control.setAttribute('type', 'hidden');
dynamic_control.setAttribute('name', 'antspm-d');
dynamic_control.setAttribute('class', 'antispam-control antispam-control-d');
dynamic_control.setAttribute('value', current_year);
...
elements[i].appendChild(dynamic_control);

后台判断逻辑片段

if ( $antspm_q != date('Y') ) { // year-answer is wrong - it is spam
    if ( $antspm_d != date('Y') ) { // extra js-only check: there is no js added input - it is spam
        $spam_flag = true;
        if (empty($antspm_q)) { // empty answer - it is spam
            $antispam_error_message .= 'Error: empty answer. ['.esc_attr( $antspm_q ).']<br> '.$rn;
        } else {
            $antispam_error_message .= 'Error: answer is wrong. ['.esc_attr( $antspm_q ).']<br> '.$rn;
        }
    }
}

如果用户没有启用 JavaScript 会怎么样呢?

用户会在提交表单中看到今天是公元多少年的问题,然后需要将错误的答案修改成正确的答案。这样在上面的后台检测脚本中就会发现,这里填写是正确的。就不用再关心 JavaScript 动态的答案了。

不可见的输入框陷阱 invisible input trap

不可见的输入框陷阱(invisible input trap)是基于一个事实:大多数机器人遇到 email 或者 url 关键字表单会自动填充一些信息。

因此在评论框中增加一个隐藏字段,正常用户是看不到这个字段,所以也不会去填写它。

// 默认不展示给用户看。
<p class="antispam-group antispam-group-e" style="display: none;">
    <label>Leave this field empty</label>
    <input type="text" name="antspm-e-email-url-website" class="antispam-control antispam-control-e" value="" autocomplete="off" />
</p>

但是机器人是可以看到这个字段的,如果在这里填写了任何东西,那么就会被判定为机器人。

后台的判断逻辑片段

// 如果填写了这个表单,那么就被判定是垃圾信息了
if ( ! empty($antspm_e)) { // trap field is not empty - it is spam
    $spam_flag = true;
    $antispam_error_message .= 'Error: field should be empty. ['.esc_attr( $antspm_e ).']<br> '.$rn;
}

总结一下

目前从后台效果来看,这个插件的效果很好,很少遇到垃圾留言。

目前的一些垃圾机器人无法执行 JavaScript,所以很多利用这个特性就可以做一些排除了。很多的第三方评论都是利用 JS 展示出来了。

不过很优秀的 Disqus 在国内经常抽风,甚至不可用

声明:未经允许禁止转载 东东东 陈煜东的博客 文章,谢谢。如经授权,转载请注明: 转载自东东东 陈煜东的博客

本文链接地址: 分享一个不用验证码的阻止垃圾机器人提交留言表单算法 – https://www.chenyudong.com/archives/anti-spam-comments-algorithm.html

分类: wordpress

laravel安装使用、目录权限设置

前置条件

增加mcrypt

如果想偷懒ubuntu用户直接 apt-get install php5-mcrypt,发现还是不能用,修改/usr/local/php/lib/php.ini(每个人有差异,同时cli模式下也需要增加)增加下面内容

extension=mcrypt.so

如果你想自己编译安装,可以参考下文的openssl安装方法。

增加openssl的配置

我是从之前的PHP源码编译安装的。因为我之前的PHP源码还在的。

cd ~/php-5.5.16/ext/openssl

/usr/local/php/bin/phpize
Cannot find config.m4. 
Make sure that you run '/usr/local/php/bin/phpize' in the top level source directory of the module

mv config0.m4 config.m4
 
./configure --with-openssl --with-php-config=/usr/local/php/bin/php-config

make && make install

进入到/usr/local/php/lib/php.ini增加

extension=openssl.so

重启php-fpm。

安装

自己动手,丰衣足食版

  1. 先安装composer,参考官方文档
  2. 然后下载laravel的最新版,解压缩。
  3. 进入到目录下方compuser install
  4. 这个会让你的文件目录下多vendor。

懒人版

下载一个完整的laravel,然后解压缩就能用,不用为laravel安装组件。

这个的缺点就是你要更新你的laravel,会依赖于其他人更新。

我的方法

我是在自己的本地安装了一个composer,然后自己去下载最新的laravel组件,最后把整个包压缩上传到服务器去。不过这样更新生产环境的laravel会比较麻烦。不管了,一本开发了也不会对框架做太多的更新。

如果你迫不及待的访问url,会出现一些错误error in exception handler.。这个是因为写缓存、日志目录的没有写权限

为目录设置正确的写权限

/app/storage这个目录是laravel的一些写文件的目录,会写log、session、页面缓存等数据,所以要对这个目录设置正确的权限。

如果你为了方便设置chmod +777 app/storage也是可以的。但是我还是不推荐。

我推荐将目录的权限设置为会写文件的用户名和用户组。

chmod -R 777 app/storage
#访问一下网页,看看是否有输出。
#进入到/app/storage/session的文件组是谁?我的是nobody
#这个是php的用户组,我的nginx也是这个组
chmod -R 775 app/storage
chown -R :nobody app/storage

然后配置nginx就能访问了。

更改成debug模式,查看错误信息

有时候会出现问题,有不知道具体的信息,所以需要打开laravel的debug模式,可能查看更多的输出。

进入到laravel项目的/app/config/app.php

//把配置中的debug的false改成true
'debug' => true

声明:未经允许禁止转载 东东东 陈煜东的博客 文章,谢谢。如经授权,转载请注明: 转载自东东东 陈煜东的博客

本文链接地址: laravel安装使用、目录权限设置 – https://www.chenyudong.com/archives/laravel-install.html

分类: 网站建设

wordpress使用markdown extra插件

hello markdown!

用了一些markdown语法,发现很不错。以前博客使用的是html语言,感觉还ok,毕竟html标签用的比较少,常用的就codealitalbe这几个标签。但是在看文章的源代码的时候,那几个html标签看起来还是比较不爽的,一开一闭合,感觉很冗余。而且看文章的格式看上去不太清晰。

但是markdown就不会那样,看源码感觉就感觉整篇文章的结构依旧清晰。所以就将wordpress的结构进行修改,让其改成markdown语法。当然要支持markdown extra了。

选择、下载插件

这里的插件使用的是michelf markdown classic版本,这个版本是支持WordPress的,不要下载到PHP Markdown Lib,这个不支持WordPress的。

我上网找了一些markdown插件,发现种类繁多,不知道怎么确定,那么就是用michelf版本的好了,因为这个是我最先接触到的一个版本,有中先入为主的观点。

安装

这个插件安装就更简单了。

  • 下载来就一个文件markdown.php,将其放到(site home)/wp-content/plugins/目录。
  • 进入到WordPress后台,启用该插件。
  • 禁用可视化编辑器。进入到WordPress管理后台,用户->{选择一个用户}->可视化编辑器,勾选撰写文章时不使用可视化编辑器

然后就去尝试一些使用markdown撰写你的文章吧~

与语法高亮插件兼容

该插件和以前的文章兼容较好,但是发现和SyntaxHighlighter Evolved语法高亮插件有些不兼容,代码部分出现一些多余的标签。

markdown.php源码中有下面这个

add_filter('the_content',     'mdwp_MarkdownPost', 6);
add_filter('the_content_rss', 'mdwp_MarkdownPost', 6);
add_filter('get_the_excerpt', 'mdwp_MarkdownPost', 6);

这个是markdown的SyntaxHighlighter的优先级有不一样,SyntaxHighlighter的是7,所以我把markdown的语法调成8了。

add_filter('the_content',     'mdwp_MarkdownPost', 8);
add_filter('the_content_rss', 'mdwp_MarkdownPost', 8);
add_filter('get_the_excerpt', 'mdwp_MarkdownPost', 8);

文章中编写代码

要想文章中插入代码,不能使用markdown的语法,还是得使用SyntaxHighlighter的语法,毕竟SyntaxHighlighter有自己的语法规则。

所以上面的语法高亮还是这么使用:

[c0de language="php"]
add_filter('the_content',     'mdwp_MarkdownPost', 10);
add_filter('the_content_rss', 'mdwp_MarkdownPost', 10);
add_filter('get_the_excerpt', 'mdwp_MarkdownPost', 10);
[/c0de]

原谅我文中使用c0de代替code,因为插件嵌套工作不好呀。

参考

声明:未经允许禁止转载 东东东 陈煜东的博客 文章,谢谢。如经授权,转载请注明: 转载自东东东 陈煜东的博客

本文链接地址: wordpress使用markdown extra插件 – https://www.chenyudong.com/archives/wordpress-install-markdown-plugin.html

分类: wordpress

让php-fpm开机启动启动

开机启动程序对于一些服务程序特别需要,因为有时候需要重启,但是每次重启后需要重新启动一些程序会比较麻烦,服务受影响的时间更长了。对于搭建Web服务,可以参考搭建Web网站服务教程

在编译安装php—fpm后,默认是不会开启自动启动的,需要进行一些配置才能开机启动。

执行vim /etc/init.d/php-fpm新建下面的内容:

#!/bin/sh
#
# php-fpm - this script starts and stops the php-fpm daemin
#
# chkconfig: - 85 15
# processname: php-fpm
# config:      /usr/local/php/etc/php-fpm.conf

set -e

#PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DESC="php-fpm daemon"
NAME=php-fpm
DAEMON=/usr/local/php/sbin/$NAME     #这里设成自己的目录
CONFIGFILE=/usr/local/php/etc/php-fpm.conf   #这里设成自己的目录
PIDFILE=/var/run/$NAME.pid   #这里设成自己的目录
SCRIPTNAME=/etc/init.d/$NAME   #这里设成自己的目录

# If the daemon file is not found, terminate the script.
test -x $DAEMON || exit 0

d_start(){
   $DAEMON -y $CONFIGFILE || echo -n " already running"
}

d_stop(){
   kill -QUIT `cat $PIDFILE` || echo -n " no running"
}

d_reload(){
   kill -USR2 `cat $PIDFILE` || echo -n " could not reload"
}

case "$1" in
   start)
       echo -n "Starting $DESC: $NAME"
       d_start
       echo "."
       ;;
   stop)
       echo -n "Stopping $DESC: $NAME"
       d_stop
       echo "."
       ;;
   reload)
       echo -n "Reloading $DESC configuration..."
       d_reload
       echo "Reloaded."
       ;;
   restart)
       echo -n "Restarting $DESC: $NAME"
       d_stop
       # Sleep for two seconds before starting again,
       # this should give the nginx daemon some time to perform a graceful stop
       sleep 2
       d_start
       echo "."
       ;;
   *)
       echo "Usage: $SCRIPTNAME {start|stop|restart|force-reload)" >&2
       exit 3
       ;;
esac
exit 0

添加可执行权限

chmod +x /etc/init.d/php-fpm

添加到开机自动启动

chkconfig --add php-fpm
chkconfig php-fpm on

这样后,php-fpm就会开机自动启动了,而且可以使用以下命令进行重启

service php-fpm start
service php-fpm stop
service php-fpm reload

另外一种平滑重启php-fpm可以使用kill -USR2 php-fpm.pid来进行,通过service命令就快很多啦。

参考文章:http://www.cnblogs.com/buffer/archive/2011/08/15/2138762.html

 

声明:未经允许禁止转载 东东东 陈煜东的博客 文章,谢谢。如经授权,转载请注明: 转载自东东东 陈煜东的博客

本文链接地址: 让php-fpm开机启动启动 – https://www.chenyudong.com/archives/add-php-fpm-to-autostart.html

分类: 网站建设

Copyright © 2017 东东东 陈煜东的博客 粤ICP备13059639号-1

SITEMAP回到顶部 ↑