马丁博客


2012年总结

2013-04-17 11:45, 没有评论, 奋斗, 页游, by , 153 views.

忙碌的一年过去了,blog的主机也过期了。资料丢失了,只能用以前的备份,又重新整理了一下这些文章。换个主题,换个心情。

这一年都在忙啥呢?

给你答案:忙着做页游(夜游)所有的时间都投入进去了。要不对不住投资人的money了。

也许你会问那里呢?http://www.qmxgmae.com 全明星篮球 不过由于各种纠纷最终关闭了。

下图

全明星篮球

年轻哪有失败,接着来新的一款 http://foot.qmxgame.com 全明星足球即将上线 ^^

下图

全明星足球

当然过程中也学到了各种和专业技术无关的东西。

linux ssh 安全问题

2012-02-17 10:58, 没有评论, lamp, 页游, by , 135 views.

年尾太忙很久都没有分享了。在家过年的时候发现web服务器被别人恶意攻击了,一进去发现sshd进程占用完一个cpu。
果断杀掉。
为了安心在家过年决定解决下这个问题。免得在家过年还老是来报警短信。
方案有如下,一下操作针对centos,redhat,其他操作系统请自行查找配置文件所在:
设置跳板机(一般是选择对外不开放的机器),使用内网进行登录。在受攻击的机器设置只允许指定ip访问。
<1>.可以在使用linux防火墙进行处理。具体方法是 :

echo "-A RH-Firewall-1-INPUT -m state --state NEW -s 10.xx.xx.xx -m tcp -p tcp -m multiport --dports xx -j ACCEPT" 
>> /etc/sysconfig/iptables;

上处的第一处表示 跳板机内网ip,第二处一般是22,运行完重启下防火墙,不过博主建议修改sshd登录端口,修改方法如下:
vim /etc/ssh/ssh_config 修改成自己想要的端口(最好是大于一千),因为扫描linux的端口实在是太容易了。
<2>.第二种方法 在hosts.allow 和hosts.deny添加如下。
在/etc/hosts.allow文件末尾中 添加:

sshd,sshd:xx.xx.xx.xxsshd,sshd:ALL在/etc/hosts.deny文件末尾中 添加:
ALL:ALL@ALL,PARANOID

完了收工,欢迎指正。
如果还想要更加安全可以像想tencent开放平台一样设置随机码加固定密码下次补上。

linux locate 快速查找命令介绍

2011-11-01 10:20, 没有评论, lamp, by , 159 views.

时间过得好快,一转眼一年又快到过年了,很久没有和大家分享了,工作实在太忙了。
使用linux的人都会知道find查找命令。
下面有关于find的使用说明 :linux 查找命令大全。
下面给大家介绍一个快速查找工具locate,支持正则。
一般linux系统都会默认安装。没有默认安装也不要着急。

ubuntu:sudo apt-get install locate;
centos:yum -y install mlocate;

工作原理:通过定时任务定时生成文件名相关的数据文件(一般会存放在【/var/lib/mlocate/mlocate.db】),当然定时任务不会很实时,这个会导致刚刚安装的软件找不到,这时候大家需要使用(updatedb)来更新locate数据文件。
使用方法:locate xx(要查找的文件名) -l num(要显示的行数)。当然这个文件名在系统中出现太多,就需要用到-l这个参数。不然等着刷屏吧。
正则使用参数:-r, –regexp REGEXP
Search for a basic regexp REGEXP. No PATTERNs are allowed ifthis option is used, but this option can be specified multipletimes.
更多使用方法:man locate;
http://linux.about.com/od/commands/l/blcmdl1_locate.htm

zabbix mysql全面监控

2011-09-17 10:53, 没有评论, lamp, 页游, by , 150 views.

背景:多台服务器管理,出现问题时只能跑到指定机器上查看日志信息。
而cpu,mem使用情况在日志里面只能凭个人经验来判断是cpu,还是mem或者io出现问题,导致机器出现故障。而zabbix可以保存这些时间段,机器各项的信息从而能快速定位问题。
zabbix:包含了系统常用的监控,同时还可以自定义选项来监控(exp:访问量、在线)。扩展起来非常方便,所以就选择了zabbix。
对linux来说基本很大一部分机器都装有mysql。同时官网也提供了php的监控方法(采用的时候zabbix_sender进行推送),但是这样每个机器就得装php才能监控,可是想想不用php也完全能完成(shell)。于是就自己写了监控脚本和大家大奖分享下。
具体思路:
采集mysql自身的运行信息SQLshow global status;讲打印出来的mysql运行信息保存至临时文件(exp:/tmp/zabbix_mysql_%M.log).
这里很多人会问为什么要保存至文件呢,而不是直接返回呢?
.为了保证mysql取值时,不会频繁的进行数据库连接查询,而zabbix获取数据有事周期性的(本人使用的是60s/次)。所以本人使用分钟来生成文件,分钟内都取同一个文件。
.为了保证各项数据取到没有时间差。保证生成的线条一致性。
好了废话不多说,下面是she脚本。

#!/bin/sh
dateM=`date "+%M"`;
fileName='/tmp/zabbix_mysql_status_'$dateM".log";
if [ ! -f $fileName ]; then
rm -f /tmp/zabbix_mysql_status*;
mysql -uroot -p$1 -e 'show global status;' > $fileName;
fi;
if [  -f $fileName ]; then
cat $fileName | grep -w "$2" | awk 'BEGIN {FS=" "} {print $2}'
fi;

usage:
复制以上内容保存到/usr/bin/zabbix_mysql.sh(或者直接下载).
赋予执行去权限(chmod +x /usr/bin/zabbix_mysql.sh)里面有两个参数 $1:表示root密码,$2:监控项。
exp:zabbix_mysql.sh rootpass Com_select(启动mysql的总查询次数)
mysql status 介绍:
http://dev.mysql.com/doc/refman/5.0/en/server-status-variables.html
效果图:

zabbix mysql

google +1加载慢解决办法

2011-07-14 10:49, 没有评论, web, by , 47 views.

使用google+1一段时间了,发现不是很稳定,一段时间能用一段时间不能用,在国内加载速度有时间奇慢,和gmail一样。
期待改善。

google +1介绍:

Google +1 is yet another attempt to make Google more social. It’s Google’s version of the Facebook “likes”, a simple feature that’s very powerful because it’s part of a social network.

既然想使用它,就得想办法改善它,不让他影响网页的加载。

本人的做法是 – 采用异步加载:

将要加载的内容放在网页</body>结束符之前位置,来保证网页顺利加载。

采用js加载js的办法进行js加载,就不会影响网页的加载了。

JS

document.write('<script type="text/javascript" src="https://apis.google.com/js/plusone.js"><\/script>');

在需要的地方加上g:plusone标签:

HTML

<g:plusone count="false" href="http://www.blags.org"></g:plusone>

获取地址:

http://www.google.com/intl/zh-CN/+1/button/index.html
http://www.google.com/intl/zh-CN/webmasters/+1/button/index.html

php filter 安全过滤函数

2011-07-03 10:32, 没有评论, lamp, by , 172 views.

php 利用filter 扩展编写的参数处理静态类,欢迎使用。
希望大家看得开心,用得放心。

<?php
/**
 * @参数验证函数
 * @method:
 * @license http://www.blags.org/
 * @created:2011年07月02日 11时00分
 * @copyright 1997-2011 The Martin Group
 * @author Martin <martin@blags.org>
 * */
abstract class CFilter
{
	/**
	* 类型
	* @var array
	*/
	public static $varType = array(
		'GET'=> INPUT_GET,
		'POST'=> INPUT_POST,
		'COOKIE'=> INPUT_COOKIE,
		'SERVER'=> INPUT_SERVER,
		'ENV'=> INPUT_ENV
	);
	public static $filterType = array(
		'STRING'=>FILTER_SANITIZE_STRING,
		'INT'=>FILTER_VALIDATE_INT,
		'BOOLEAN'=>FILTER_VALIDATE_BOOLEAN,
		'FLOAT'=>FILTER_VALIDATE_FLOAT,
		'REGEXP'=>FILTER_VALIDATE_REGEXP,
		'URL'=>FILTER_VALIDATE_URL,
		'EMAIL'=>FILTER_VALIDATE_EMAIL,
		'IP'=>FILTER_VALIDATE_IP,
	);

	/**
	* 支持过滤列表
	*/
	private static function lists()
	{
		return filter_list();
	}

	/**
	* 验证类型
	* @param string $type
	*/
	public static function filterType($type)
	{
		$filter_list = self::lists();
		return array_search($type,$filter_list) !== false ? true : false;
	}

	/**
	*
	* @param $setVarType
	*/
	private static function getVarType($setVarType)
	{
		$setVarType = strtoupper($setVarType);
		return isset(self::$varType[$setVarType]) ? self::$varType[$setVarType] : null;
	}

	/**
	*
	* @param string $setFilterType
	*/
	private static function getFilterType($setFilterType)
	{
		$setFilterType = strtoupper($setFilterType);
		return isset(self::$filterType[$setFilterType]) ? self::$filterType[$setFilterType] : null;
	}

	/**
	* 检测参数是否存在
	* @param string $setVarType
	* @param string $varName
	*/
	public static function VarExists($setVarType,$varName)
	{
		$FilterVarType = self::getVarType($setVarType);
		if (is_null($FilterVarType))
		return false;
		return filter_has_var(self::$varType[$FilterVarType], $varName);
	}

	/**
	*
	* @param string $setVarType
	* @param string $varName
	* @param string $filterType
	*/
	public static function FilterInput($setVarType, $varName, $filterType = 'INT')
	{
		$FilterVarType = self::getVarType($setVarType);
		$filterType = self::getFilterType($filterType);
		if (is_null($FilterVarType) || is_null($filterType))
		return false;
		return filter_input($FilterVarType, $varName, $filterType);
	}

	/**
	* 验证变量
	* @param string $var
	* @param string $filterType
	*/
	public static function FilterVar($var,$filterType)
	{
		$filterType = self::getFilterType($filterType);
		return filter_var($var, $filterType);
	}

	/**
	* 字符串
	* @param string $var
	*/
	public static function String($var)
	{
		return self::FilterVar($var,'STRING');
	}

	public static function Int($var)
	{
		return self::FilterVar($var,'INT');
	}

	public static function Boolean($var)
	{
		return self::FilterVar($var,'INT');
	}

	public static function Float($var)
	{
		return self::FilterVar($var,'FLOAT');
	}

	/**
	*
	* @param string $var
	* @param array $option array("options"=>array("regexp"=>"/^M(.*)/"))
	*/
	public static function Regexp($var,$option)
	{
		$filterType = self::getFilterType($filterType);
		return filter_var($var, $filterType, $option);
	}

	public static function Url($var)
	{
		return self::FilterVar($var,'URL');
	}

	public static function Email($var)
	{
		return self::FilterVar($var,'EMAIL');
	}

	public static function Ip($var)
	{
		return self::FilterVar($var,'IP');
	}
}

参考地址:http://www.php.net/manual/en/book.filter.php

php 安全问题

2011-07-02 10:27, 没有评论, lamp, by , 114 views.

做web开发,相信搭建都知道一些安全基本知识,”千万不能相信客户端数据“。而php又是一种弱类型语言。很多人在开发过程中忽略了类型转换,参数过滤直接量成不可估量的后果。

不使用过滤函数可能出现以下情况:

数据库被(sql)注入。直接可以导致你的系统崩溃,系统数据丢失,用户信息丢失。网站被挂马,遇到文件处理则可以将你的网站文件删除。

另外值得一提的是很多人认为开启php安全模式就万事大吉了。其实不然,很多注入者往往绕过正面,进行侧面进攻。

使用 0×7e,0×27等(ASCII码)字符串来充当引号,而php又无法过滤。注入的一般方式都是在参数里面加入很多mysql sql语法,去获取敏感数据信息。

exp:

and(select 1 from(select count(*),concat((select(select(select concat(0x7e,0x27,phpcms_member.username,0x27,0x7e)from phpcms_member limit0,1))from information_schema.tableslimit0,1),floor(rand(0)*2))x from information_schema.tablesgroupby x)a)and1=1

mysql information_schema.tables 所有用户都可见可查,能查出所有表结构信息,数据库信息。

php开源系统很多,很多开源系统大家知道数据结构,已级敏感信息表。(这里当然也包括不法分子)

这里指的敏感信息:往往是一些用户信息,管理端信息。现在md5的穷举一直在进行着。很多的md5加密之后的密码仍然能被解密成明文。

很多系统都做了相应的安全提升。

下面介绍以下常见手段:

使用过滤函数,php filter 安全过滤函数.md5(  md5(‘用户密码’) . ‘私钥’ ) 得出加密结果。常用的php开源系统后台一定要修改目录名。很多系统后台直接使用admin作为后台入口。不要将phpmyadmin等数据库操作软件安置在网站可见目录。

等等。。之所以这样是由于现在大量存在扫描工具去扫描这样的管理端。

下面是惊心的一张图

mysql 数据导入导出方法

2011-06-30 12:55, 没有评论, lamp, 页游, by , 375 views.

Hvert enkelt spil pa Danske Spil online casino danmark bliver testet, for det lanceres.

wordpress 热门文章插件

2011-06-27 12:48, 2 条评论, lamp, by , 54 views.

??blog??????,??????????????????????????????????????????????????????????????memcache,???????wp_cache_get,wp_cache_set??????????????,????????

????????

  1. ?????????,?????????
  2. ?????????????pop-article????

wordpress ??????

???????

??:??? ????    ?????

???:

casino online er..blags.org/wp-content/Upload/a6.gif” alt=”wordpress ??????” width=”300″ height=”178″ />

wordpress ??????

linux httpd 启动错误

2011-05-09 07:31, 3 条评论, lamp, by , 742 views.

搭建了无数lamp环境今天碰到了新问题,apache说文件不存在,可是文件明明存在,又可以涨知识了。
错误信息:

[root@xxx ~]# service httpd restart
Stopping httpd:                                            [FAILED]
Starting httpd: Warning: DocumentRoot [/home/martin] does not exist[  OK  ]

原来以为是权限问题,可以修改了权限之后发现还是找不到文件,真是郁闷。
后来经过打开apache错误日志后才知道。

[root@xxx httpd]# tail -f logs/error_log
[Mon May 09 10:46:40 2011] [notice] suEXEC mechanism enabled (wrapper: /usr/sbin/suexec)
[Mon May 09 10:46:40 2011] [notice] Digest: generating secret for digest authentication ...
[Mon May 09 10:46:40 2011] [notice] Digest: done
[Mon May 09 10:46:40 2011] [notice] Apache/2.2.3 (CentOS) configured -- resuming normal operations
[Mon May 09 10:48:15 2011] [notice] caught SIGTERM, shutting down
<span style="color: red;">[Mon May 09 10:49:29 2011] [notice] SELinux policy enabled; httpd running as context root:system_r:httpd_t:s0</span>
[Mon May 09 10:49:29 2011] [notice] suEXEC mechanism enabled (wrapper: /usr/sbin/suexec)
[Mon May 09 10:49:29 2011] [notice] Digest: generating secret for digest authentication ...
[Mon May 09 10:49:29 2011] [notice] Digest: done
[Mon May 09 10:49:30 2011] [notice] Apache/2.2.3 (CentOS) configured -- resuming normal operations
[Mon May 09 10:53:53 2011] [notice] caught SIGTERM, shutting down
[Mon May 09 10:53:53 2011] [notice] SELinux policy enabled; httpd running as context root:system_r:httpd_t:s0
[Mon May 09 10:53:53 2011] [notice] suEXEC mechanism enabled (wrapper: /usr/sbin/suexec)
[Mon May 09 10:53:53 2011] [notice] Digest: generating secret for digest authentication ...
[Mon May 09 10:53:53 2011] [notice] Digest: done
[Mon May 09 10:53:53 2011] [notice] Apache/2.2.3 (CentOS) configured -- resuming normal operations

其实这是因为这些系统里激活了SELinux,而用户的apache配置与SELinux的配置策略有抵触产生的,需要设置SELinux文件属性。
可以通过 ls -Z /dir来查看SELinux策略属性
exp:

[root@xxx ~]# ls -Z /root/
-rw-------  root root system_u:object_r:user_home_t    anaconda-ks.cfg
-rw-r--r--  root root root:object_r:user_home_t        install.log
-rw-r--r--  root root root:object_r:user_home_t        install.log.syslog

其中的“user_home_t”就是SELinux策略属性,而需要httpd能访问必须要是“httpd_user_content_t”属性。
执行一下命令修改你的目录属性

chcon -R -t httpd_user_content_t /dir/ #将/dir目录下所有文件属性设置成 “httpd_user_content_t”

接下来重启httpd

[root@xxx httpd]# service httpd restart
Stopping httpd:                                            [  OK  ]
Starting httpd:                                            [  OK  ]

大功告成。
得到一个结论,一般碰到莫名其妙的问题一定要先看错误日志,linux下大部分软件都有自己的日志,这样定位起来问题才会不花冤枉时间。

当然也可以去禁止掉SELinux。
1.立即关闭SELinux。setenforce 0;#重启失效
2.修改配置文件 vim /etc/selinux/config;把SELINUX修改成”enforcing”—>”disable”;