#!/usr/bin/env python

"""
Copyright (c) 2006-2024 sqlmap developers (https://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""

# 导入必要的模块
# kb (Knowledge Base) 是一个全局对象,用于存储程序运行时的各种状态和数据
# 比如原始页面内容、错误状态、页面模板缓存等信息都存储在这里
from lib.core.data import kb

# 从connect模块导入Request类并重命名为Request
# Request类用于发送HTTP请求,是与目标网站交互的核心类
from lib.request.connect import Connect as Request

def getPageTemplate(payload, place):
    """
    获取页面模板的函数
    
    这个函数的主要作用是:
    1. 根据给定的SQL注入payload和注入位置获取目标页面
    2. 将页面内容缓存起来避免重复请求
    3. 返回页面内容和错误状态信息
    
    参数说明:
        payload: SQL注入的载荷,即要注入的SQL代码
        place: 注入点的位置,表示在请求中的哪个位置进行注入
               (比如URL参数、POST数据、Cookie等)
    
    返回值:
        返回一个包含两个元素的元组:
        1. 页面内容 - 可能是原始页面或注入后的页面
        2. 错误状态 - 表示页面解析是否出现错误
    """
    # 初始化返回值
    # kb.originalPage 存储了未注入时的原始页面内容
    # kb.errorIsNone 表示错误检查的状态
    retVal = (kb.originalPage, kb.errorIsNone)

    # 只有当payload和place都不为空时才执行注入操作
    if payload and place:
        # 检查这个payload和place的组合是否已经在缓存中
        # kb.pageTemplates是一个字典,用于缓存不同注入组合的结果
        if (payload, place) not in kb.pageTemplates:
            # 如果没有缓存,则发送新的请求
            # Request.queryPage方法用于发送带有注入payload的请求
            # content=True 表示需要返回页面内容
            # raise404=False 表示遇到404错误时不抛出异常
            # 返回值中的page是页面内容,其他两个值用下划线忽略
            page, _, _ = Request.queryPage(payload, place, content=True, raise404=False)
            
            # 将结果存入缓存
            # page 是获取到的页面内容
            # kb.lastParserStatus is None 表示页面解析是否成功
            # (None表示解析成功,非None表示解析出错)
            kb.pageTemplates[(payload, place)] = (page, kb.lastParserStatus is None)

        # 从缓存中获取之前存储的结果
        retVal = kb.pageTemplates[(payload, place)]

    # 返回页面内容和错误状态
    return retVal
