分享:网页文件内容查找小工具

2022年3月8日 8,379 浏览数 没有评论

因工作需要,要将包含某些“关键词”的网页文件从磁盘中查找出来。在网上找了很久都没有找到顺手的工具,所以就动手写了一个。“独乐乐不如众乐乐”,分享给大家。Python语言初级,见笑了!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
import os,re
 
#获取当前目录下所有文件名及目录名
def pri_all_file(dir):
    names = os.listdir(dir) 
    li = []
    extension = ['.shtml','.html','.htm'] #定义要查找的文件类型
    for name in names:
        full_name = os.path.join(dir,name) #拼接成完整路径
        if os.path.isdir(full_name):
            #li.append(full_name)
            li.extend(pri_all_file(full_name)) #递归遍历子目录下文件及目录,并一次性加入原列表中
        else:
            #print(full_name)
            if os.path.splitext(name)[-1] in extension: #取文件扩展名进行比较
                li.append(full_name)
    return li
 
#将列表中的内容一行行写入文件
def write_result_file(result):
    ls = os.linesep #行分隔符
    filename = "result.txt" #保存结果的文件,在.py文件所在的目录中
    try:
        fobj = open(filename,'w')
    except IOError as e:
        print("file open error:",e)
    else:
        fobj.writelines('%s%s' % (txt,ls) for txt in result)
        fobj.close()
 
#程序主体
if __name__ == "__main__":
    dir_name = '/wwwroot' #定义要查找的文件夹
    keyword = ['张三' ,'李四'] #定义要查找的关键词
    findfilelist = [] #找到的文件列表
    filelist = pri_all_file(dir_name)
    for filepath in filelist:
        f = open(filepath, encoding='utf-8')
        try:
            t = f.read()
        except:
            f = open(filepath, encoding='gbk', errors='ignore')
            t = f.read()
        f.close()
        pattern = re.compile('<body[\s\S]*?</body>', re.IGNORECASE) #定义一个取出body内容的正则表达式,忽略大小写
        result = pattern.findall(t)  #进行匹配,找到所有满足条件的
        content = "".join(result) #列表转化为字符串
        if len(content) != 0:
            for k in keyword: #循环关键词
                if content.find(k) != -1:
                    print('\r[%s] %s' % (k,filepath))
                    findfilelist.append('['+k + '] ' + filepath) #找到则输出文件地址
                    # if os.path.isfile(filepath): #判断是否是为文件(文件是否存在)
                    #     os.rename(filepath, filepath + '_bak') #修改文件名
 
        print('\r%s' % (filepath), end = '')
 
    write_result_file(findfilelist) #将查找结果写入result.txt文件中
分类: 伪编程 标签: ,

防范XSS攻击,让黑客拿到cookie也无法登陆!

2019年4月4日 6,771 浏览数 没有评论

  近年来XSS攻击成为了主流,这种攻击原理很简单,黑客将精心构造的JS代码,通过留言或评论的方式提交到系统中,如果系统过滤不严,管理员在后台查阅时,代码就会被执行,登陆的Cookie就被窃取,黑客用此Cookie轻松登陆系统,然后上传木马、提权破坏等等。 

  防范XSS攻击,主要在于严格过滤用户提交来的数据,对于PHP语言常用strip_tags、htmlspecialchars等函数来处理。但黑客的手段也千奇百怪,利用各种编码、BUG来逃脱过滤,防不胜防!专业的事要交给专业的人来处理,笔者一般喜欢使用htmlpurifier这款富文本HTML过滤器,它采用白名单机制,能有效过滤掉用户提交表单中的非法HTML标签,防范XSS效果明显!

  当然,随着技术的进步,也有可能出现htmlpurifier过滤不了的情况,我们该想个应对的办法,如何让黑客拿到cookie也无法登陆呢?

  分析系统登陆后发现,大多数的登陆过程都是验证过帐户名和密码之后,在Session中保存登陆成功的标志,然后生成Cookie,每次用户来访问,只要根据Cookie找到对应的Session,验证其中的标志即可。Session好比超市门口的储物柜,Cookie就是条码纸,如果条码纸被别人偷去了,小偷也可打开储物柜。如何防范单一的条码纸开箱?按近来年流行双重验证的做法,让储物柜在生成条码纸的时候,同时记下用户的特征码(如密码、手机号等),这样即使条码纸被小偷偷去,小偷也开不了箱。

  按照这个思路,我们只要对系统稍稍改造即可!用户初次登陆,系统保存登陆成功标志到Session中的时候,同时记下用户的IP地址,然后用户每次请求验证的时候,拿现在的IP地址与Session中的IP进行比较,不符则验证失败,清除Session重新登陆!如此,黑客即使拿到Cookie,由于IP不符,也无法登陆成功!

  参考代码如下:

1
2
3
4
5
<?php
//登陆验证成功后
$_SESSION['LoginAccess'] = 'TRUE';
$_SESSION['IP'] = $_SERVER['REMOTE_ADDR'];
?>
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
//每次请求时验证
If ($_SESSION['LoginAccess'] == 'TRUE'){
	$ip = $_SERVER['REMOTE_ADDR']; 
	If ($_SESSION['IP'] == $ip){
		return true;
	}else{
		return false;
	}
}else{
	return false;
}
?>

  附:在php中为Session的Cookie开启HttpOnly,让黑客获取不到Cookie也是个好办法。开启方法如下:
  PHP5.2以上版本,打开php.ini 设置session.cookie_httponly = TRUE
  或者在代码中开启:ini_set(“session.cookie_httponly”, 1);

分类: 伪编程, 经验技巧 标签:

为KindEditor在线编辑器增加图片水印和缩略图功能

2018年3月9日 48,838 浏览数 没有评论

  轻量级开源KindEditor在线编辑器非常好用,虽然作者已多年不更新了,但阻挡不了我对它的喜爱。在使用之中,总是想为它加点功能,这样便可使工作更高效!

  我们在图片上传时总想自动添加水印和生成缩略图,但这些实用小功能却没见有人制作,遂Google一下资料自己捣鼓了一个,分享给大家!

  直接放出源码,对应版本为最新的“4.1.11”:

  第一步:修改\editor\kindeditor-all.js中的第7000行,用下面代码替换

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
hiddenElements.join(''),
'<label style="width:60px;">' + lang.localUrl + '</label>',
'<input type="text" name="localUrl" class="ke-input-text" tabindex="-1" style="width:200px;" readonly="true" /> &nbsp;',
'<input type="button" class="ke-upload-button" value="' + lang.upload + '" />',
'<div class="ke-dialog-row">',
'<label style="width:60px;">是否水印</label>',
'<label><input name="iswater" type="radio" value="1" />加水印</label>',
'<label><input name="iswater" type="radio" value="0" checked="checked" />不加水印</label>',
'</div>',
'<div class="ke-dialog-row">',
'<label style="width:60px;">缩略图</label>',
'宽:<input name="thumb_width" type="text" class="ke-input-text" style="width:40px;" /> ',
'高:<input name="thumb_height" type="text" class="ke-input-text" style="width:40px;" />',
'</div>',
'',
'',
''

  目的是:在图片上传对话框中设置水印和缩略图选项,以便可控。
阅读全文…

php模拟登陆系统,并执行脚本

2016年9月25日 11,405 浏览数 没有评论

  php中的curl非常好用,可它来模拟登陆系统,并执行脚本,非常简便。下面列出自己常用的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<?php
/**
 *该需要编辑cron并让其每隔5分钟自动运行一次
 * 5 * * * * /usr/bin/curl http://localhost/plugin/updata.php?id=1
 *其中id=?动态项目的ID号
 */
$id = (isset($_GET['id']))?(int)$_GET['id']:'';
if (empty($id))exit();
//登陆认证
$url = "http://localhost/login.php?work=checklogin";
$post_data = array('name'=>'username','pwd'=>'password');
$cookie_jar = tempnam('./','cookie');//存放COOKIE的文件
 
// 登录并获取cookie信息
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_REFERER, '');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//设为1则不直接显示获取到的内容
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post_data));  
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_jar);//保存cookie
$output = curl_exec($ch); 
curl_close($ch);
 
//执行脚本运行
$url = "http://localhost/update_d.php?work=create&parent={$id}";
$ch=curl_init();  
curl_setopt($ch, CURLOPT_URL, $url);  
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0); //设0是为了方便调试
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_jar);//代入获取到的cookie
$data=curl_exec($ch);
curl_close($ch);
@unlink($cookie_jar);//删除cookie文件
?>

  将上述代码保存为update.php文件,放在自己的网站空间里。
  再将“5 * * * * /usr/bin/curl http://localhost/plugin/updata.php?id=1”代码保存为root文件,并存放在服务器/var/spool/cron/中,让cron每隔5分钟自动执行一次即可!

分类: 伪编程 标签: ,

突破图片防盗链的解决方法

2016年9月17日 4,127 浏览数 没有评论

  很多网站怕别人链接自己的图片,而使用了防盗链。例如微信公众号的文章,网易博客等,图片链过来后无法显示。

  图片防盗链的原理想必很多人也都清楚,也就是在服务端检测客户浏览器发来的HTTP请求表头里,referer这项是不是包含自己的网站域名,如果是盗链,referer里应该是盗链者网站的域名。

  如果我们把图片地址直接在浏览器里打开,发现图片是可以打开的,而盗链却不行,因为referer这项的内容为空。而我们可以模拟浏览器请求,来得到图片内容。

  知道了原理,解决办法也就很简单了,直接上PHP代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
$url = (isset($_GET['url']))?$_GET['url']:'';
$type = getimagesize($url);
$type = $type['mime'];//获取图片头类型,以便后续创建
header("Content-type: ".$type);  
$httpheader = array();
$ch = curl_init($url);
	curl_setopt($ch, CURLOPT_REFERER, '');//referer设置为空
	curl_setopt($ch, CURLOPT_HEADER, 0);
	curl_setopt($ch, CURLOPT_HTTPHEADER, $httpheader);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, false);
	curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
curl_exec($ch);
curl_close($ch);
?>

  将代码保存为lpic.php文件,调用时候直接“http://你的网站域名/lpic.php?url=http://要链的网站图片地址”即可!

分类: 伪编程 标签: ,