mirror of
https://github.com/sqlmapproject/sqlmap.git
synced 2026-06-20 14:40:36 +00:00
60 lines
1.9 KiB
Python
60 lines
1.9 KiB
Python
#!/usr/bin/env python
|
|
|
|
"""
|
|
Copyright (c) 2006-2026 sqlmap developers (https://sqlmap.org)
|
|
See the file 'LICENSE' for copying permission
|
|
|
|
safecharencode / safechardecode (lib/utils/safe2bin.py).
|
|
|
|
These make extracted DB values safe to print/store by escaping control and
|
|
non-printable characters (tab -> \\t, NUL -> \\x00, ...) and back. They are
|
|
applied to dumped data and to values written through the replication writer,
|
|
so the escape<->unescape round-trip must be exact.
|
|
"""
|
|
|
|
import os
|
|
import random
|
|
import sys
|
|
import unittest
|
|
|
|
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
|
|
from _testutils import bootstrap
|
|
bootstrap()
|
|
|
|
from lib.utils.safe2bin import safecharencode, safechardecode
|
|
|
|
RND = random.Random(99)
|
|
|
|
|
|
class TestKnownEscapes(unittest.TestCase):
|
|
CASES = [
|
|
(u"normal", u"normal"),
|
|
(u"tab\there", u"tab\\there"),
|
|
(u"new\nline", u"new\\nline"),
|
|
(u"nul\x00byte", u"nul\\x00byte"),
|
|
]
|
|
|
|
def test_encode(self):
|
|
for raw, encoded in self.CASES:
|
|
self.assertEqual(safecharencode(raw), encoded, msg="safecharencode(%r)" % raw)
|
|
|
|
def test_plain_text_unchanged(self):
|
|
for s in (u"plain", u"abc 123", u"semi;colon", u"a,b,c"):
|
|
self.assertEqual(safecharencode(s), s, msg="plain text altered: %r" % s)
|
|
|
|
|
|
class TestRoundTrip(unittest.TestCase):
|
|
def test_known_roundtrip(self):
|
|
for raw, _ in TestKnownEscapes.CASES:
|
|
self.assertEqual(safechardecode(safecharencode(raw)), raw, msg="round-trip %r" % raw)
|
|
|
|
def test_property_roundtrip(self):
|
|
# mix printable + control/non-printable code points
|
|
pool = u"abc 123" + u"".join(chr(c) for c in (0, 1, 7, 9, 10, 13, 27, 127))
|
|
for _ in range(2000):
|
|
s = u"".join(RND.choice(pool) for _ in range(RND.randint(0, 24)))
|
|
self.assertEqual(safechardecode(safecharencode(s)), s, msg="round-trip failed for %r" % s)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main(verbosity=2)
|