nginx 针对一类特定referer 屏蔽,可能对某些攻击有效

一个客户服务最近受到攻击,通过查看nginx的log发现规律是 referer地址来自相同的字符串
于是乎用下面的屏蔽代码

if ($http_referer ~* "来源字串里面包含的特定字串"){return 403;}

下面是一些资料  详细英文的解释在 http://wiki.nginx.org/HttpCoreModule#location

~ 匹配,区分大小写
~* 不区分大小写的匹配
!~ 不匹配
!~* 不匹配
^~ 常用于location 语法中,后边是一个字符串。它的意思是,在这个字符串匹配后停止进行正则表达式的匹配。
如: location ^~ /images/,你希望对/images/这个目录进行一些特别的操作,如增加expires头,防盗链等,但是你又想把除了这个目录的图片外的所有图片只进行增加expires头的操作,这个操作可能会用到另外一个location,例如:location ~* \.(gif|jpg|jpeg)$,这样,如果有请求/images/1.jpg,nginx如何决定去进行哪个location中的操作呢?结果取决于标识符^~,如果你这样写:location /images/,这样nginx会将1.jpg匹配到location ~* \.(gif|jpg|jpeg)$这个location中,这并不是你需要的结果,而增加了^~这个标识符后,它在匹配了/images/这个字符串后就停止搜索其它带正则的location。
= 表示精确的查找地址,如location = /它只会匹配uri为/的请求,如果请求为/index.html,将查找另外的location,而不会匹配这个,当然可以写两个location,location = /和location /,这样/index.html将匹配到后者,如果你的站点对/的请求量较大,可以使用这个方法来加快请求的响应速度。
@ 表示为一个location进行命名,即自定义一个location,这个location不能被外界所访问,只能用于Nginx产生的子请求,主要为error_page和try_files。

参考资料来源

http://hi.baidu.com/jidongxx/item/de0f7e519980eeddd48bac38
http://ourlinux.blog.51cto.com/274624/850470

QQ截图20130418090527

 

另外 参见 /?p=198

ecshop:DEBUG_MODE在后台图片上传fckeditor的错误

因为 includes\fckeditor\editor\filemanager\connectors\php\upload.php 没有执行 init.php 所以 DEBUG_MODE变量没赋值,所以
导致 http://域名/includes/fckeditor/editor/filemanager/connectors/php/upload.php?Type=ImageImage 出错
显示为 lib_base.php 的read_static_cache 和 write_static_cache 函数为定义DEBUG_MODE 常量
所以保险的办法是在 upload.php 第一行加入

define(‘DEBUG_MODE’, 0);

这个错误的表现行为是: 上传图片可以正常上传,但是进度条图片一直滚动, 原因就是输出了错误提示,导致

windows 本地安全策略 命令行方法

XP下的ipseccmd.exe 需要下载先,请自行google ,关键词 “ipseccmd 下载” ,或者到 http://ishare.iask.sina.com.cn/f/7579277.html下载

下面文章建议看下http://microsoft.cnfan.net/winsystem/3692.html  和 http://technet.microsoft.com/en-us/library/cc739550(WS.10).aspx#BKMK_add_rule

本博客主要目的是 屏蔽 某些ip段对本机80端口的访问,比较适用于windows服务器(如果是windows 2003 ,命令行相应的应该是 ipsec.exe )
命令如下

ipseccmd.exe -w reg -p "phpsir ipsec" -o
ipseccmd.exe -w reg -p "phpsir ipsec" -r "block lijin 1.1" -f 1.1.*.*=*:80:TCP -n BLOCK
ipseccmd.exe -w reg -p "phpsir ipsec" -r "block lijin 2.2" -f 2.2.*.*=*:80:TCP -n BLOCK
ipseccmd.exe -w reg -p "phpsir ipsec" -y

win2003/win7的netsh 方法

netsh ipsec static set policy name="phpsir-deny-policy" assign=n
netsh ipsec static delete policy name="phpsir-deny-policy"

netsh ipsec static add policy name="phpsir-deny-policy"
netsh ipsec static add filteraction name="phpsir-deny" action=block

netsh ipsec static add filter filterlist="deny 1.1.1.1" srcaddr=1.1.1.1 srcport=0 dstaddr=me dstport=0 protocol=0 mirrored=yes
netsh ipsec static add filter filterlist="deny 2.2.2.2" srcaddr=2.2.2.2 srcport=0 dstaddr=me dstport=0 protocol=0 mirrored=yes 



netsh ipsec static add rule name="11111" policy="phpsir-deny-policy" filterlist="deny 1.1.1.1" filteraction="phpsir-deny"
netsh ipsec static add rule name="22222" policy="phpsir-deny-policy" filterlist="deny 2.2.2.2" filteraction="phpsir-deny"   

netsh ipsec static set policy name="phpsir-deny-policy" assign=y

ecshop的ucenter同步登陆uc.php 一点错误勘误

在ecshop的会员整合ucenter的set_cookie函数有问题
文件在 /api/uc.php 搜索 set_cookie

function set_cookie($user_id=”, $user_name = ”, $email = ”)
{
if (empty($user_id))
{
/* 摧毁cookie */
$time = time() – 3600;
setcookie(‘ECS[user_id]’, ”, $time);//这里有问题
setcookie(‘ECS[username]’, ”, $time);//这里有问题
setcookie(‘ECS[email]’, ”, $time);//这里有问题
}
else
{
/* 设置cookie */
$time = time() + 3600 * 24 * 30;
setcookie(“ECS[user_id]”, $user_id, $time, $GLOBALS[‘cookie_path’], $GLOBALS[‘cookie_domain’]);
setcookie(“ECS[username]”, $user_name, $time, $GLOBALS[‘cookie_path’], $GLOBALS[‘cookie_domain’]);
setcookie(“ECS[email]”, $email, $time, $GLOBALS[‘cookie_path’], $GLOBALS[‘cookie_domain’]);
}
}

因为假设这样的架构
http://域名/ 是 ecshop ,http://域名/bbs/ 为论坛dzX2, 那么,在ec登陆后,dzX2 点退出,
会发送一个javascript申请到 /api/uc.php的 logout请求 ( 如果setcookie 只是在 /api/ 下 设置cookie 为空,那么就清空不了cookie
严格的应该是
setcookie(‘ECS[user_id]’, ”, $time,$GLOBALS[‘cookie_path’], $GLOBALS[‘cookie_domain’]);

那么代码可以修改为

还有要修改ecshop的 ucenter插件,includes/modules/integrates/ucenter.php
如图两部分


另外还要看 这一篇
/ucenter-sync.html

curl 检查服务器是否支持 gzip

http://www.ninjasys.co.uk/linux/using-curl-to-check-if-a-page-is-gzippedcompressed/

方法如下

curl -I -H 'Accept-Encoding: gzip,deflate' -H "Host:域名"  http://ip/url
如果结果是
HTTP/1.1 200 OK
Server: nginx/0.8.52
Date: Tue, 05 Jul 2011 01:28:30 GMT
Content-Type: application/x-javascript
Last-Modified: Tue, 10 Aug 2010 00:33:24 GMT
Connection: keep-alive
Vary: Accept-Encoding
Expires: Thu, 04 Aug 2011 01:28:30 GMT
Cache-Control: max-age=2592000
Content-Encoding: gzip  很好支持

如果没有 Content-Encoding: gzip 就不支持gzip

64位linux安装vsftpd虚拟用户的几点注意

  1. auth required /lib64/security/pam_userdb.so db=/etc/vsftpd_login  注意红色部分!!!
  2. 如果出现登陆503错误,请看 tail -f /var/log/secure 以确定具体是否是因为pam登陆验证的问题
  3. 注意权限方面问题,
  4. google 最好搜索英文 vsftpd virtual user
  5. http://linuxforfun.net/2008/04/05/vsftpd-virtual-users/  可以参考下

phpwind 的一个小错误导致cookie失效的解决,表象是无法注册登录

一个phpwind 8.0 utf8 系统错误表现为无法注册登录,费老劲调试,发现 data/sql_config.php 文件由于在windows 记事本编辑后导致被自动增加了bom ,前端cookie 输出因为bom 的 原因,导致浏览器无法生成cookie,从而无法登录和注册

在editplus 另存成utf-8 无bom ,上传问题解决

参看 /ecshop-utf8-bom.html

总结: 要多用 linux curl 去查看文件输出

 

ecshop系列:后台导出程序错误,ecshop应该认错

今天一个客户给我发来ecshop后台导出出现

ERROR 1052 (23000): Column ‘brand_id’ in where clause is ambiguous

经查发现是不同表存在相同字段而在where 语句中未区分造成

测试运行语句

SELECT g.*, b.brand_name as brandname FROM `usason`.`ecs_goods` AS g LEFT JOIN `usason`.`ecs_brand` AS b ON g.brand_id = b.brand_id WHERE is_delete = 0 AND brand_id = ’17’;

修改为

SELECT g.*, b.brand_name as brandname FROM `usason`.`ecs_goods` AS g LEFT JOIN `usason`.`ecs_brand` AS b ON g.brand_id = b.brand_id WHERE is_delete = 0 AND g.brand_id = ’17’;

红色部分注意

那么就只有去查后台程序代码了

发现在admin/includes/lib_main.php 的get_where_sql($filter)的函数中出现了

$where .= isset($filter->brand_id) && $filter->brand_id > 0 ? ” AND brand_id = ‘” . $filter->brand_id . “‘” : ”;

修改为

$where .= isset($filter->brand_id) && $filter->brand_id > 0 ? ” AND g.brand_id = ‘” . $filter->brand_id . “‘” : ”;

问题解决

目前还不知道有其他副作用

好在ecshop命名还算规范

 

phpwind 批量上传解决一例,上传后文件列表消失,mbstring 问题

朋友网站phpwind 7.5 sp3出现批量上传文件后上传文件的列表消失,但是文件已经上传上去了,调试后发现没有写入数据库

跟踪代码在 lib/upload/mutiupload.class.php 文件的update函数中加入调试语句,确认没有写入数据库 ,

原因是 $value[‘name’] = pwConvert($value[‘name’], $db_charset, ‘utf-8’); 行有错

经调试 pwConvert 是因为 php没有启用 mbstring 造成,启用后,问题解决

 

ecshop系列:二次开发,扩展分类商品后置

ecshop 的商品是可以属于多个分类,在内部称谓是扩展分类,被记录到ecs_goods_cat 表
现在需求是将某个分类category.php?id=某某的商品列表中含有扩展分类的商品后置
思路: 首先找到存在扩展属性的商品id,形成数组,然后在 $arr 变量里面查找后unset数组的部分key,
并附加array_merge到原来的$arr后

修改category.php 的 category_get_goods 函数
代码如图:

ecshop系列:购买商品增加留言备注功能

在购买商品时候增加对此商品购买的留言备注功能
如图:

开发方法如下:
1) 在goods.dwt 里面加留言字段

2)修改 js/common.js 里面的addToCart 函数

3)修改flow.php 里面关于 if ($_REQUEST[‘step’] == ‘add_to_cart’) 的处理部分

4)修改includes/lib_order.php 里面的 addto_cart 函数

 

首先修改函数定义

其次修改内容

至此增加memo部分完成,下面是在flow.php 购物车里面显示此留言
5)修改 flow.dwt

ecshop系列:一行代码解决财付通3006错

问题描述:
修改价格后再次点击使用财付通支付时出现“[3006]您的请求无效,请重新再试。”
解决方案
\includes\modules\payment\tenpay.php 行 104
原来的为
$bill_no = str_pad($order[‘log_id’], 10, 0, STR_PAD_LEFT);
现在修改为
$bill_no = str_pad(rand(1,99),2,0,STR_PAD_LEFT).str_pad($order[‘log_id’], 8, 0, STR_PAD_LEFT);
问题解决
点击下图看大图

ecshop系列:search的静态化

一般说来搜索的结果静态化可以持久的保持搜索结果,给客户良好的印象

ecshop 的搜索结果是 search.php?encode=base64编码字符串

我们希望用 /search_搜索关键字_p页码.html 来做静态优化

那么方法是什么呢:

首先写 .htaccess 文件

RewriteRule ^search_(.+?)_p([0-9]+).html$  search2\.php\?keywords=$1&page=$2 [QSA,L]

我们复制 search.php 成 search2.php 注释掉行18-行66

然后加入

 $string["keywords"]=addslashes($_GET["keywords"]); 

 $string["page"]=addslashes($_GET["page"]); 

 $string["search_encode_time"] = $_SERVER["REQUEST_TIME"];

测试 http://域名/search_关键字_p1.html
如果和 http://域名/search2.php?keywords=关键字&page=1
的结果一致
然后我们去修改页码处的连接
行 501

$pager = get_pager2('search_', $pager['search'], $count, $page, $size);

在include/lib_main.php 里面 复制get_pager 函数成 get_pager2
然后修改成如下

 $url_format = $url . $param_url . 'page=';
        $url_format2 = $url . $param['keywords'] . '_p';
        $pager['page_first'] = ($page - $_offset > 1 && $_pagenum < $page_count) ? $url_format2 . "1.html" : '';
        $pager['page_prev']  = ($page > 1) ? $url_format2 . $page_prev.".html" : '';
        $pager['page_next']  = ($page < $page_count) ? $url_format2 . $page_next.".html" : '';
        $pager['page_last']  = ($_to < $page_count) ? $url_format2 . $page_count.".html" : '';
        $pager['page_kbd']  = ($_pagenum < $page_count) ? true : false;
        $pager['page_number'] = array();
        for ($i=$_from;$i<=$_to;++$i)
        {
            $pager['page_number'][$i] = $url_format2 . $i.".html";
        }

apache time_wait 过多,修改 keepalive 解决

最近一朋友的centos apache 2.2 发现大量的ip 出现 time_wait 显现

即 netstat -an | grep “:80” 的结果大量显现 time_wait

初期以为是 被Ddos 了,后发现即使是就一个ip访问,也产生大量time_wait

遂修改 apache 配置文件 httpd.conf

KeepAlive On
MaxKeepAliveRequests 120
KeepAliveTimeout 15

观察后问题解决

mysql 1067 错误解决的方法和思路

问题描述: windows 2003 平台 mysql 5 的 服务无法启动,显示 1067 错

问题解决过程:

经排查发现 1067错原因在于进程里面还有一个mysqld-nt 没有完全释放,在进程中强制终止后,可以正常启动mysql ,但是远程连接不上,而服务器已经关闭了防火墙等可能屏蔽的因素,一度以为是网络限制了3306端口的访问,可是在外部 nmap 居然可以看到3306端口是open的。在服务器上可以连接 localhost 的mysql 服务器,使用 show processlist; 发下大量的 login 慢请求,显示unauthorized, 判断为mysqld 需要反差ip 的dns name ,再进一步检查发现时服务器的dns server 失效。

问题解决方案:

1) 更换好的names server ip 地址

2) 在my.ini 里面加 [mysqld] 加入 skip-name-resolve 后重启 mysqld ,发下原来无法正常关闭的mysqld-nt.exe 进程也可以完全关闭和正常启动了,问题解决

 

问题总结:

由于是服务器参数以及程序未作调整而出现问题,所以不应盲目判断为服务器内部问题,多分析状态,思路开阔,根据显示内容去查询搜索引擎,可以快速解决问题

 

ie下innerHTML 不起作用的时候用的修复

参考来自 http://www.jonefox.com/blog/2009/05/21/internet-explorer-and-the-innerhtml-property/

代码

function replace_html(el, html) {
	if( el ) {
                var oldEl = (typeof el === "string" ? document.getElementById(el) : el);
                var newEl = document.createElement(oldEl.nodeName);

                // Preserve any properties we care about (id and class in this example)
                newEl.id = oldEl.id;
                newEl.className = oldEl.className;

                //set the new HTML and insert back into the DOM
                newEl.innerHTML = html;
                if(oldEl.parentNode)
        	        oldEl.parentNode.replaceChild(newEl, oldEl);
                else
		        oldEl.innerHTML = html;

                //return a reference to the new element in case we need it
                return newEl;
	}
};

参考用法

replace_html(“div_id”,”<div>here is html data<div>”);

ecshop 对采用指定支付方式(alipay,tenpay)增加积分的修改

进入后台 SQL查询

INSERT INTO `你的前缀_shop_config` (`parent_id`, `code`, `type`, `store_range`, `store_dir`, `value`, `sort_order` ) VALUES   ( ‘2’, ‘onlinepay_points’, ‘text’, ”, ”, ‘100’, ‘1’);

在后台 商店设置->基本设置->会出现 onlinepay_points 为100的项目

respond.php  修改如下

$payment = new $pay_code();
$pay_result = $payment->respond();
$msg     = $pay_result ? $_LANG[‘pay_success’] : $_LANG[‘pay_fail’];
if($pay_result){
if($pay_code == “alipay” || $pay_code == “tenpay” || $pay_code == “chinabank” ){
log_account_change($_SESSION[‘

user_id’], 0, 0, $GLOBALS[‘_CFG’][‘onlinepay_points’], $GLOBALS[‘_CFG’][‘onlinepay_points’],”会员在线支付送”.$GLOBALS[‘_CFG’][‘onlinepay_points’].”积分”);
}
}

ecshop的支付宝alipay免掉单接口,最新版,采用服务器间通知模式

问题描述:

ecshop 在启用支付宝 alipay 支持方式 后,通过支付宝付费返回网站发生fail 错误,而支付宝已经扣费的问题

解决方案:

通过修改支付宝支付插件,结合支付宝特有的服务器间对账功能,彻底免除掉单烦恼,减少客服工作量。

联系方式: QQ  733905

费用 300元

功能:

1) 解决ecshop 支付宝插件返回时候显示付费不成功
2) 解决支付宝异步同步,彻底解除掉单困扰,省客服工作量
3) gbk utf-8 双版本