扫描目录下的php文件,是否含有木马特征

shell_checkl

#!/usr/bin/python
#-*- encoding:UTF-8 -*-
###
## @package
## @desc 扫描目录下的php文件,是否含有木马特征,注意,不是“木马扫描”
## @useage python shell_check.py /your/web/path/ 1=是否递归
###
import os
import sys
import re
import time
def listdir(dirs,liston='0'):
	flog = open(os.getcwd()+"/check_php_shell.log","a+")
	if not os.path.isdir(dirs):
		print "directory %s is not exist"% (dirs)
		return
	lists = os.listdir(dirs)
	for list in lists:
		filepath = os.path.join(dirs,list)
		if os.path.isdir(filepath):
			if liston == '1':
				listdir(filepath,'1')
		elif os.path.isfile(filepath):
			filename = os.path.basename(filepath)
			if re.search(r"\.(?:php|inc|html?)$", filename, re.IGNORECASE):
				i = 0
				iname = 0
				f = open(filepath)
				while f:
					file_contents = f.readline()
					if not file_contents:
						break
					i += 1
					match = re.search(r'''(?P<function>\b(?:include|require)(?:_once)?\b)\s*\(?\s*["'](?P<filename>.*?(?<!\.(?:php|inc)))["']''', file_contents, re.IGNORECASE| re.MULTILINE)
					if match:
						function = match.group("function")
						filename = match.group("filename")
						if iname == 0:
							info = '\n[%s] :\n'% (filepath)
						else:
							info = ''
						info += '\t|-- [%s] - [%s]  line [%d] \n'% (function,filename,i)
						flog.write(info)
						print info
						iname += 1
					
					match = re.search(r'\b(?P<function>eval|proc_open|popen|shell_exec|exec|passthru|system)\b\s*\(', file_contents, re.IGNORECASE| re.MULTILINE)
					if match:
						function = match.group("function")
						if iname == 0:
							info = '\n[%s] :\n'% (filepath)
						else:
							info = ''
						info += '\t|-- [%s]  line [%d] \n'% (function,i)
						flog.write(info)
						print info
						iname += 1
					
					match = re.findall(r'(\$[a-z0-9_]*?\s*?\(.*?\))', file_contents, re.IGNORECASE)
					if match:
						if iname == 0:
							info = '\n[%s] :\n'% (filepath)
						else:
							info = ''
						info += '\t|-- [%s]  line [%d] \n'% (match[0],i)
						flog.write(info)
						print info
						iname += 1

				f.close()
	flog.close()
if '__main__' == __name__:
	argvnum = len(sys.argv)
	liston = '0'
	if argvnum == 1:
		action = os.path.basename(sys.argv[0])
		print "Command is like:\n	%s D:\wwwroot\ \n	%s D:\wwwroot\ 1	-- recurse subfolders"% (action,action)
		quit()
	elif argvnum == 2:
		path = os.path.realpath(sys.argv[1])
		listdir(path,liston)
	else:
		liston = sys.argv[2]
		path = os.path.realpath(sys.argv[1])
		listdir(path,liston)
	flog = open(os.getcwd()+"/check_php_shell.log","a+")
	ISOTIMEFORMAT='%Y-%m-%d %X'
	now_time = time.strftime(ISOTIMEFORMAT,time.localtime())
	flog.write("\n----------------------%s checked ---------------------\n"% (now_time))
	flog.close()

完美解决CentOS下MySQLdb for Python安装

yum install gcc python-devel mysql-devel -y

由于下面的文档,都没有介绍依赖条件的安装,造成安装过程非常迷茫,耗时一个小时~
一句话,上面的任何一台服务器,把可以装的开发包,都装上,省很多事。

http://pypi.python.org/pypi/MySQL-python/
http://pypi.python.org/pypi/setuptools#downloads
http://www.redicecn.com/html/Python/20110417/250.html

Windows+Apache+Python配置简略,2011完整无错版

哥们倒腾了四五年的PHP以后,面对日益严重的桌面软件需求,终于下定决心要开始Python的学习之路了。

去年学了C#的半本书,无奈其较高的学习门槛和跨平台缺陷,最终还是转向了Python,估且算是俺的第二门语言吧。

这几天短暂入门了下,发现Python果然很简单,很多人说Python比较简洁漂亮,我觉得倒是针对C#和Java而言,引入类库十分干练。Python使用缩进进行代码块区分,着实没有其它语言的括号+缩进来得直观。
同时也发现Python对数据的处理,真是十分高效,这块PHP果然是望尘莫及呀。

其实WAP(暂且这么叫吧)配置过程非常简单,麻烦在Apache下的PY模块比较古老,现在最新的3.x版本都不支持,于是只将本地的PY卸载,重新安装了2.5版本,然后去下载了apache的2.2版本进行对应安装。

版本总结:
apache:2.2.x
python:2.5.x
modpython:3.3.x

注意:modpython在Apache官方网站和modpython的官方网站均有下载链接:http://archive.apache.org/dist/httpd/modpython/
以下内容为网上搜索修改,本人增订无错版。
继续阅读Windows+Apache+Python配置简略,2011完整无错版