scrapy 浅分析(四)

0x00.前言

前面一

前面二

前面三

这次接着上回要提到下载的地方

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
def _next_request_from_scheduler(self, spider):
slot = self.slot
request = slot.scheduler.next_request()
if not request:
return
#去下载
d = self._download(request, spider)
#处理下载返回结果
d.addBoth(self._handle_downloader_output, request, spider)
d.addErrback(lambda f: logger.info('Error while handling downloader output',
exc_info=failure_to_exc_info(f),
extra={'spider': spider}))
d.addBoth(lambda _: slot.remove_request(request))
d.addErrback(lambda f: logger.info('Error while removing request from slot',
exc_info=failure_to_exc_info(f),
extra={'spider': spider}))
d.addBoth(lambda _: slot.nextcall.schedule())
d.addErrback(lambda f: logger.info('Error while scheduling new request',
exc_info=failure_to_exc_info(f),
extra={'spider': spider}))
return d

scrapy 浅分析(三)

0x00.前言

前面一

前面二

这次看看引擎里面的东西。在此之前看看文档中的流程

1
2
3
4
5
6
7
8
9
10
11
12
Scrapy中的数据流由执行引擎控制,其过程如下:

1.引擎打开一个网站(open a domain),找到处理该网站的Spider并向该spider请求第一个要爬取的URL(s)。
2.引擎从Spider中获取到第一个要爬取的URL并在调度器(Scheduler)以Request调度。
3引擎向调度器请求下一个要爬取的URL。
4.调度器返回下一个要爬取的URL给引擎,引擎将URL通过下载中间件(请求(request)方向)转发给下载器(Downloader)。
------------------------------------------------------------------(下面下一篇提到)
5.一旦页面下载完毕,下载器生成一个该页面的Response,并将其通过下载中间件(返回(response)方向)发送给引擎。
6.引擎从下载器中接收到Response并通过Spider中间件(输入方向)发送给Spider处理。
7.Spider处理Response并返回爬取到的Item及(跟进的)新的Request给引擎。
8.引擎将(Spider返回的)爬取到的Item给Item Pipeline,将(Spider返回的)Request给调度器。
9.(从第二步)重复直到调度器中没有更多地request,引擎关闭该网站。

0x01.引擎

59

scrapy 浅分析(一)

0x00.前言

相信大家都用过python的scrapy框架写给爬虫。然后就想看看这个框架的简单执行流程。

0x01.大体架构

官方架构图如下

architecture

图大体架构很清晰,实际以例子来看看,一般我们的爬虫以如下代码开始运行(命令行是一样的)

1
2
3
from scrapy import cmdline

cmdline.execute("scrapy crawl xxx".split())

flask v0.1源码简单分析

0x00.前言

想学习python的flask,看了《FlaskWeb开发:基于Python的Web应用开发实战》这本书,觉得很OK👌。之前彭师兄分析过flask v0.1的源码,听说代码不长,加之网上解释甚多,所以自己也想看看,就其本身,本文无意义,有错误更是可能,只是记录而已。

0x01.获取

第一步获取git clone https://github.com/pallets/flask.git,这是最新版本的

第二步 git tag看版本

第三步git reset --hard xx回退到对应版本

最后是这样

54

主要内容在flask.py文件里面

无题(一)

这次没有主题,只是记录一下最近看到的,所以文章会很短。2018,先从胡说八道开始…

0x00 一次惊叹 linux中的通配符

关于linux的通配符有好几种

1
2
3
4
5
6
7
8
通配符
它是由shell解析,并且一般用于匹配文件名,实际上就是shell解释器去解析的特殊符号,linux系统通配符有几下几种:
*:匹配任意多个字符
?:匹配任意一个字符
[...]:匹配中括号内出现的任意一个字符
[!...]:不匹配中括号内出现的任意一个字符

一般出现在要shell命令或脚本中,匹配特定的文件名

上次有提到过*,这里是?,linux中的通配符可以用于匹配相应的任意字符,所以可以用此在命令执行中绕过被pass的字符。

0x01 一次实验 UNLINK与file_Put_Contents

几个星期前新测的,来源于某圈主提的一个问题,一开始有人回答了Linux下的,所以就没测,实际上windows下还有几种。比如截断,并加上通配符等…

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
//windows环境
$filename=__DIR__.'///4.php';
$filename1=__DIR__.'/5.php/.';
echo $filename."</br>".$filename1;
$data='<?php phpinfo(); ?>';
file_put_contents($filename,$data);
//可以加入$data到文件中
file_put_contents($filename1,$data);
//可以加入$data到文件中
if(file_exists($filename)){
//file_exists判断为是
unlink($filname);//不执行删除操作,参数无效
}
if(file_exists($filename1)){
//file_exists判断为否
unlink($filname1);//不执行
}
?>

0x02一段 jsfuck

1
JSFuck is an esoteric and educational programming style based on the atomic parts of JavaScript. It uses only six different characters to write and execute code.

有时候在浏览器的控制台执行jsfcuk 得不到想要的结果,不妨将最后的()改为toString().

0x03 一个开源项目

http://itchat.readthedocs.io/zh/latest/

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
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Wed Jan 10 16:08:13 2018

@author: myndtt
"""
import itchat
import requests
def get_response(msg):
apiurl='http://www.tuling123.com/openapi/api'
data={
'key':'db4c3be6c40f43cb9e4f33120f302547',
'info':msg,
'useid':'myndtt',
}
try:
r=requests.post(apiurl,data=data).json()
return r.get('text')
except:
return
@itchat.msg_register(itchat.content.TEXT)
def print_content(msg):
return get_response(msg['Text'])
#@itchat.msg_register([itchat.content.TEXT],isGroupChat=True)
#def print_content(msg):
# return get_response(msg['Text'])
itchat.auto_login(True)
itchat.run()

测试的时候很尴尬 要小心 机器人可没节操 东西很简单 权当娱乐

0X04 一本书

https://yeasy.gitbooks.io/docker_practice/content/

前段时间的比赛用到了docker 以往知道docker 但是只知道大概 没好好用过 这次将彭 李等师兄的完美架构好好学习了一番 深入颇多。这本书写的很全,入门到实践docker 可以一看

php的session反序列化

0x00.打字机

简单扯一下,大家都知道,几乎所有的编程语言都有(反)序列化这种机制,可以将一些对象,数组等通过某种方式变成可以便捷传输和存储(后面将提到)的形式,如字符串。当然php也不例外。

43

同时在php有一个这样有意思的设置–>php默认的SESSION会话机制 存储在文件系统的会话数据的内容是已经序列化后的内容,程序执行session_start()后PHP会自动读取文件并unserialize反序列化成数组赋值给超全局变量$_SESSION (这句话是没错的)。

44

(session_register这个函数功能即是可以在全部变量中session定义一个新的变量)

parse_url

0x00.前言

又是一道关于parse_url的题目,上次也说了一道http://myndtt.com/2017/10/22/url%E4%B8%AD%E7%9A%84%E4%B8%8B%E5%88%92%E7%BA%BF/

0x01.开门见山

题目都没什么稀奇的,题目链接:http://solveme.safflower.kr/prob/url_filtering/

代码:

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
<?php
error_reporting(0);
require __DIR__."/lib.php";

$url = urldecode($_SERVER['REQUEST_URI']);
$url_query = parse_url($url, PHP_URL_QUERY);

$params = explode("&", $url_query);
foreach($params as $param){

$idx_equal = strpos($param, "=");
if($idx_equal === false){
$key = $param;
$value = "";
}else{
$key = substr($param, 0, $idx_equal);
$value = substr($param, $idx_equal + 1);
}

if(strpos($key, "do_you_want_flag") !== false || strpos($value, "yes") !== false){
die("no hack");
}
}

if(isset($_GET['do_you_want_flag']) && $_GET['do_you_want_flag'] == "yes"){
die($flag);
}

highlight_file(__FILE__);

problem&solution

0x00.前言

这完全是一篇水文,只是记录了一下平时遇到的一些问题及查找到的解决方法。

0x01.琴声悠悠

一.echo “{${phpinfo()}}”可以输出php环境

这个问题很早以前就有人提出来了,但是一直都没什么人解答,我其实也不知道真实的情况具体是什么,只是根据测试去推测可能是什么。

1.phpinfo()

首先phpinfo()函数是php的内置函数,函数原型是

36

solveme.kr-iamsowly

0x00.一波

题目链接 http://iamslowly.thinkout.rf.gd

这是solveme.kr中最后一道题目,是一道web方面的题(本文没有图片,全是文字!)

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
<?php
// It's 'I am slowly' problem of 'Solve Me'.
error_reporting(0);
require __DIR__.'/lib.php';

$table = 'iamslowly_'.ip2long($_SERVER['REMOTE_ADDR']);
$answer = $_GET['answer'];

if(isset($answer)){
$con = mysqli_connect($sql_host, $sql_username, $sql_password, $sql_dbname)
or die('SQL server down');

$result = mysqli_fetch_array(
mysqli_query($con, "SELECT `count` FROM `{$table}`;")
);
if(!isset($result)){
mysqli_query($con, "CREATE TABLE IF NOT EXISTS `{$table}` (`answer` char(32) NOT NULL, `count` int(4) NOT NULL);");
$new_answer = md5(sha1('iamslowly_'.mt_rand().'_'.mt_rand().'_'.mt_rand()));
mysqli_query($con, "INSERT INTO `{$table}` (`answer`,`count`) VALUES ('{$new_answer}',1);");

}elseif($result['count'] === '12'){
mysqli_query($con, "DROP TABLE `{$table}`;");
echo 'Game over';
goto quit;
}