Skip to content

Latest commit

 

History

History
executable file
·
62 lines (62 loc) · 2.82 KB

project.md

File metadata and controls

executable file
·
62 lines (62 loc) · 2.82 KB

#injectMan项目小节 ####BaseHTTPRequestHandler 这是一个可以用来解析HTTP格式的库,sqlmap中也是使用了这个库来实现-r功能,因此我在项目中也是使用这个库来实现-f <file>功能,简单介绍一下用法

from BaseHTTPServer import BaseHTTPRequestHandler
from StringIO import StringIO
request = HTTPRequst(text)
command = request.command
headers = request.headers
path = request.path
body = request.rfile.read()
class HTTPRequst(BaseHTTPRequestHandler):
    """
    HTTPRequest Prase class
    """
    def __init__(self,request_text):
        self.rfile = StringIO(request_text)
        self.raw_requestline = self.rfile.readline()
        self.error_code = self.error_message = None
        self.parse_request()
    def send_error(self,code,message):
        self.error_code = code
        self.error_message = message

command - HTTP请求方法 headers - HTTP请求头(包括cookies,HOST...) path - HTTP请求路径 body - POST的请求参数 ####requests 这个模块在发送post请求时遇到了一个问题,一般post代码如下

import requests
req = requests.post(url,data=body,headers=headers)

假设在headers中设置了www-form-encodeed,那么在data中的数据按道理来说应该时被urlencode的,但是在项目未被urlencode,究其原因是我当时在在data中传入的是字符串,所以requests未对其进行urlencode,所以传入的应该是字典形式,才会安装headers里的声明进行加密 ####代码重构之美 在这个项目中我深深体会到了代码重构的重要性,或者说是软件工程的重要性,像sqlmap这类的项目之所以难看懂,是因为自己的代码造诣还未达到那个程度 1、首先是class的问题,按照功能共性划分的class暴露给外部的不应该只是一个main或者run函数,应该是每一个class里的函数我都可以独立的拿出来使用,这样就要求在class__init__函数中尽量少传入影响整个class的参数 2、自己实现了一个match多个值的findPos函数,效果还是不错的,如下:

def findPos(self,str,sub):
    """
    FindPos function which find all sub's Position in str
    """
    pos = 0
    pos_list = []
    while True:
        pos = str.find(sub,pos)
        if pos<0:
            break
        pos_list.append(pos)
        pos += 1
    return pos_list

3、有的时候巧用格式化输出的变量,可以省去一些不必要的麻烦 4、先加再减的智慧 ####python 爆出的错 1、not -1不等于 0 2、.format() raise keyError错误,应该在字典外再加上一层括号,像下面这样

"{{'xxx':'{0}'}}".format()