Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
sqlmapproject
GitHub Repository: sqlmapproject/sqlmap
Path: blob/master/lib/utils/safe2bin.py
2989 views
1
#!/usr/bin/env python
2
3
"""
4
Copyright (c) 2006-2025 sqlmap developers (https://sqlmap.org)
5
See the file 'LICENSE' for copying permission
6
"""
7
8
import binascii
9
import re
10
import string
11
import sys
12
13
PY3 = sys.version_info >= (3, 0)
14
15
if PY3:
16
xrange = range
17
text_type = str
18
string_types = (str,)
19
unichr = chr
20
else:
21
text_type = unicode
22
string_types = (basestring,)
23
24
# Regex used for recognition of hex encoded characters
25
HEX_ENCODED_CHAR_REGEX = r"(?P<result>\\x[0-9A-Fa-f]{2})"
26
27
# Raw chars that will be safe encoded to their slash (\) representations (e.g. newline to \n)
28
SAFE_ENCODE_SLASH_REPLACEMENTS = "\t\n\r\x0b\x0c"
29
30
# Characters that don't need to be safe encoded
31
SAFE_CHARS = "".join([_ for _ in string.printable.replace('\\', '') if _ not in SAFE_ENCODE_SLASH_REPLACEMENTS])
32
33
# Prefix used for hex encoded values
34
HEX_ENCODED_PREFIX = r"\x"
35
36
# Strings used for temporary marking of hex encoded prefixes (to prevent double encoding)
37
HEX_ENCODED_PREFIX_MARKER = "__HEX_ENCODED_PREFIX__"
38
39
# String used for temporary marking of slash characters
40
SLASH_MARKER = "__SLASH__"
41
42
def safecharencode(value):
43
"""
44
Returns safe representation of a given basestring value
45
46
>>> safecharencode(u'test123') == u'test123'
47
True
48
>>> safecharencode(u'test\x01\x02\xaf') == u'test\\\\x01\\\\x02\\xaf'
49
True
50
"""
51
52
retVal = value
53
54
if isinstance(value, string_types):
55
if any(_ not in SAFE_CHARS for _ in value):
56
retVal = retVal.replace(HEX_ENCODED_PREFIX, HEX_ENCODED_PREFIX_MARKER)
57
retVal = retVal.replace('\\', SLASH_MARKER)
58
59
for char in SAFE_ENCODE_SLASH_REPLACEMENTS:
60
retVal = retVal.replace(char, repr(char).strip('\''))
61
62
for char in set(retVal):
63
if not (char in string.printable or isinstance(value, text_type) and ord(char) >= 160):
64
retVal = retVal.replace(char, '\\x%02x' % ord(char))
65
66
retVal = retVal.replace(SLASH_MARKER, "\\\\")
67
retVal = retVal.replace(HEX_ENCODED_PREFIX_MARKER, HEX_ENCODED_PREFIX)
68
elif isinstance(value, list):
69
for i in xrange(len(value)):
70
retVal[i] = safecharencode(value[i])
71
72
return retVal
73
74
def safechardecode(value, binary=False):
75
"""
76
Reverse function to safecharencode
77
"""
78
79
retVal = value
80
if isinstance(value, string_types):
81
retVal = retVal.replace('\\\\', SLASH_MARKER)
82
83
while True:
84
match = re.search(HEX_ENCODED_CHAR_REGEX, retVal)
85
if match:
86
retVal = retVal.replace(match.group("result"), unichr(ord(binascii.unhexlify(match.group("result").lstrip("\\x")))))
87
else:
88
break
89
90
for char in SAFE_ENCODE_SLASH_REPLACEMENTS[::-1]:
91
retVal = retVal.replace(repr(char).strip('\''), char)
92
93
retVal = retVal.replace(SLASH_MARKER, '\\')
94
95
if binary:
96
if isinstance(retVal, text_type):
97
retVal = retVal.encode("utf8", errors="surrogatepass" if PY3 else "strict")
98
99
elif isinstance(value, (list, tuple)):
100
for i in xrange(len(value)):
101
retVal[i] = safechardecode(value[i])
102
103
return retVal
104
105