时间:2023-04-18 18:20:01 | 来源:网站运营
时间:2023-04-18 18:20:01 来源:网站运营
网站防刷方案:网站防刷方案User -> Browse -> CDN/Proxy Cache -> Web Server -> App Server / fastcgi pool -> Cache -> Database
大部分网站都是这样的结构:用户,浏览器,CDN或反向代理,Web服务器,应用服务器,缓存,数据库PC -> ADSL/Cable/Ethernet -> Route -> ... -> Route -> Firewall -> Load Balance -> Switch -> Server
我们看看从那些环节可以截获用户的刷新行为$("form").submit(function(){ $(":submit",this).attr("disabled","disabled");});
在上面的例子基础上可以改良,增加计时器,限制一定时间内不可重复提交。访问第一个页面 login.example.com/form.ext 的时候设置一个 cookie 变量访问第二个页面 login.example.com/auth.ext 的时候判断上一个页面设置的 cookie 是否有效,如果无效拒绝访问。
可以进一步增加难度,例如用户注册分为很多步骤,每一个步骤都会设置一个标记,如果用户行为不是按照顺序访问,直接在最后一个页面提交,明显可以判断是非法行为。iptables -A INPUT -p icmp -m limit --limit 3/s -j LOG --log-level INFO --log-prefix "ICMP packet IN: "iptables -N syn-floodiptables -A INPUT -p tcp --syn -j syn-floodiptables -I syn-flood -p tcp -m limit --limit 3/s --limit-burst 6 -j RETURNiptables -A syn-flood -j REJECT
限制源IP的访问数量-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 --tcp-flags FIN,SYN,RST,ACK SYN -m connlimit --connlimit-above 50 --connlimit-mask 32 -j REJECT --reject-with icmp-port-unreachable-A INPUT -p tcp -m state --state NEW -m tcp --dport 443 --tcp-flags FIN,SYN,RST,ACK SYN -m connlimit --connlimit-above 50 --connlimit-mask 32 -j REJECT --reject-with icmp-port-unreachable
关键字,字符串过略iptables -A INPUT -p tcp --dport 80 -m string --algo bm --string "XXDD0S" -j DROP
以上所讲都是被动方法,需要系统管理一条一条添加规则。#!/bin/bash######################################### Homepage: http://netkiller.github.io# Author: neo <netkiller@msn.com>########################################PIPE=/tmp/pipepidfile=/tmp/firewall.pidACCCESS_LOG=/tmp/access.logTIMEPOINT='24/May/2012'BLACKLIST=/var/tmp/black.lstWHITELIST=/var/tmp/white.lst########################################if [ -z "$( egrep "CentOS|Redhat" /etc/issue)" ]; then echo 'Only for Redhat or CentOS' exitfiif [ ! -f ${BLACKLIST} ]; then touch ${BLACKLIST}fiif [ ! -f ${WHITELIST} ]; then touch ${WHITELIST}fifor deny in $(grep ${TIMEPOINT} ${ACCCESS_LOG} | awk '{print $1}' | awk -F'.' '{print $1"."$2"."$3"."$4}' | sort | uniq -c | sort -r -n | head -n 30| awk '{print $2}')do if [ $(grep -c $deny ${WHITELIST}) -ne 0 ]; then echo 'Allow IP:' $deny iptables -D INPUT -p tcp --dport 443 -s $deny -j DROP iptables -D INPUT -p tcp --dport 80 -s $deny -j DROP continue fi if [ $(grep -c $deny ${BLACKLIST}) -eq 0 ] ; then echo 'Deny IP:' $deny echo $deny >> ${BLACKLIST} iptables -I INPUT -p tcp --dport 443 -s $deny -j DROP iptables -I INPUT -p tcp --dport 80 -s $deny -j DROP fidone
相比前面脚本,这个脚本更高级,实现关键字过滤,管道实时处理,这样不回因为日志尺寸变大,影响到脚本的处理性能。#!/bin/bash######################################### Homepage: http://netkiller.github.io# Author: neo <netkiller@msn.com>########################################ACCESSLOG=/www/logs/www.example.com/access.$(date +'%Y-%m-%d').logTIMEPOINT='24/May/2012'KEYWORD=send.phpBLACKLIST=/var/tmp/black.lstWHITELIST=/var/tmp/white.lstPIPE=/var/tmp/pipepidfile=/var/tmp/firewall.pidlogfile=/var/tmp/firewall.log########################################if [ -z "$( egrep "CentOS|Redhat" /etc/issue)" ]; then echo 'Only for Redhat or CentOS' exitfiif [ -z $1 ]; then echo "$0 clear|fw|collect|process|close"fiif [ "$1" == "clear" ]; then rm -rf $BLACKLIST rm -rf $PIPE echo "Clear OK!!!"fiif [ "$1" == "close" ]; then killall tail kill `cat $pidfile` echo > $pidfilefiif [ ! -e $PIPE ]; then mkfifo $PIPEfiif [ "$1" == 'fw' ]; then iptables -A OUTPUT -p tcp --dport 2049 -j REJECT iptables -A OUTPUT -p tcp -m multiport --dports 22,21 -j REJECT for ipaddr in ${WHITELIST} do if [ $(grep -c $ipaddr ${WHITELIST}) -ne 0 ]; then iptables -A INPUT -p tcp --dport 443 -s $ipaddr -j ACCEPT iptables -A INPUT -p tcp --dport 80 -s $ipaddr -j ACCEPT echo 'Allow IP:' $ipaddr >> $logfile fi if [ $(grep -c $ipaddr ${BLACKLIST}) -eq 0 ] ; then iptables -D INPUT -p tcp --dport 443 -s $ipaddr -j DROP iptables -D INPUT -p tcp --dport 80 -s $ipaddr -j DROP echo 'Deny IP:' $ipaddr fi donefiif [ "$1" == "collect" ]; then killall tail for (( ; ; )) do tail -f $ACCESSLOG | grep $KEYWORD | cut -d ' ' -f1 > $PIPE done & echo $! > $pidfilefiif [ "$1" == "process" ]; then if [ ! -f $BLACKLIST ]; then touch $BLACKLIST fi if [ ! -f ${WHITELIST} ]; then touch ${WHITELIST} fi for (( ; ; )) do while read ipaddr do if [ $(grep -c $ipaddr ${WHITELIST}) -ne 0 ]; then echo 'Allow IP:' $ipaddr >> $logfile continue fi grep $ipaddr ${BLACKLIST} if [ $? -eq 1 ] ; then echo $ipaddr >> ${BLACKLIST} iptables -I INPUT -p tcp --dport 80 -s $ipaddr -j DROP echo "Deny IP: $ipaddr" >> $logfile fi done < $PIPE done & echo $! >> $pidfilefi
5.2. WEB 服务器部分valid_referers none blocked *.example.com example.com;if ($invalid_referer) { #rewrite ^(.*)$ http://www.example.com/cn/$1; return 403;} if ($http_user_agent = "") { return 403; }
6. 通过程序控制访问行为www.example.com (此时 http_referer 为空,或者其他,这不重要) -> login.example.com (http_referer: www.example.com)-> login.example.com/auth.ext (http_referer: login.example.com) -> login.example.com/secussed.ext (http_referer: login.example.com/auth.ext)
看明白了吗 http_referer 每次都是上一个页面,我们程序中判断,如果上一个页面不是我们所指定的,或者不再允许列表内,就拒绝访问www.example.com (GET) -> login.example.com (GET)-> login.example.com/auth.ext (POST) -> login.example.com/secussed.ext (GET)
同理,在不允许的页面POST操作,将立即拒绝www.example.com (cookie 1) -> login.example.com (cookie 2)-> login.example.com/auth.ext (cookie 3) -> login.example.com/secussed.ext (cookie 4)
没有按照指定流程访问,cookie 值不会变化,属于异常行为 关键词:方案