#!/usr/bin/env python

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

import string  # 导入字符串常量库，用于处理字符和十六进制数字

from lib.core.enums import PRIORITY  # 从核心库导入优先级枚举

__priority__ = PRIORITY.LOWEST# 设置优先级为最低

def dependencies():
    pass

def tamper(payload, **kwargs):
    """
    这个函数用于篡改（tamper）输入的payload，通过URL编码所有字符（不处理已经编码的字符）。

    功能：
        * 将输入的SQL语句中的所有字符进行URL编码。
        * 例如，将'SELECT'转换为'%53%45%4C%45%43%54'。

    测试情况：
        * Microsoft SQL Server 2005
        * MySQL 4, 5.0 和 5.5
        * Oracle 10g
        * PostgreSQL 8.3, 8.4, 9.0

    注意：
        * 这个方法对于绕过一些非常弱的Web应用防火墙很有用，这些防火墙在处理请求时不进行URL解码。
        * Web服务器会传递解码后的版本，因此应该适用于任何数据库管理系统（DBMS）。

    示例：
        >>> tamper('SELECT FIELD FROM%20TABLE')
        '%53%45%4C%45%43%54%20%46%49%45%4C%44%20%46%52%4F%4D%20%54%41%42%4C%45'
    """


    retVal = payload  # 初始化返回值为输入的payload

    if payload:  # 如果payload不为空
        retVal = ""  # 初始化返回值字符串
        i = 0  # 初始化索引
        # 遍历payload中的每个字符
        while i < len(payload):
            # 检查当前字符是否为%且后面两个字符是十六进制数字（已编码的字符）
            if payload[i] == '%' and (i < len(payload) - 2) and payload[i + 1:i + 2] in string.hexdigits and payload[i + 2:i + 3] in string.hexdigits:
                retVal += payload[i:i + 3]  # 如果是已编码的字符，直接添加到返回值
                i += 3  # 移动索引，跳过已处理的三个字符
            else:
                  # 对未编码的字符进行URL编码，并添加到返回值
                retVal += '%%%.2X' % ord(payload[i])# 将字符转换为其ASCII值的十六进制表示
                i += 1  # 移动索引，处理下一个字符


    return retVal  # 返回篡改后的payload
