Я пишу простой скрипт CGI на Python 3, ниже:
#!/usr/bin/python3
print("Content-Type: text/html")
print()
print()
import cgi
import cgitb; cgitb.enable()
storage = cgi.FieldStorage()
print(storage)
print()
print(storage.getvalue("command", "Command key not present."))
При запуске в браузере без указания key
все хорошо: я получаю ожидаемый результат:
Content-Type: text/html
FieldStorage(None, None, [])
Command key not present.
Обеспечение ?command=abcdefghijklmnoprstuvwxyz
также хорошо работает:
Content-Type: text/html
FieldStorage(None, None, [MiniFieldStorage('command', 'abcdefghijklmnoprstuvwxyz')])
abcdefghijklmnoprstuvwxyz
Однако, когда я пытаюсь удалить символы, все становится сложнее.Меняется на ?command=abcdefghijklmnoprstuvwxy
(обратите внимание на отсутствующие z
):
Content-Type: text/html
FieldStorage(None, None, [MiniFieldStorage('command', 'abcdefghijklmnoprstuvwxy(')])
abcdefghijklmnoprstuvwxy(
Теперь вместо пропущенного z
!
добавлена дополнительная левая скобка *1019* Смена на ?command=abcdefghijklmnoprstuvwx
производит ... то же самое!
Это сохраняется до ?command=abcdefghijklmnoprst
, и в этот момент мы получаем:
Content-Type: text/html
FieldStorage(None, None, [MiniFieldStorage('command', 'abcdefghijklmnoprstee')])
abcdefghijklmnoprstee
Это, опять же, сохраняется до ?command=abcdefghijk
,в этот момент мы получаем ожидаемое поведение!
Content-Type: text/html
FieldStorage(None, None, [MiniFieldStorage('command', 'abcdefghijk')])
abcdefghijk
Однако мы остаемся с abcdefghijk
до ?command=abc
, после чего оно меняется на:
Content-Type: text/html
FieldStorage(None, None, [MiniFieldStorage('command', 'abcd)')])
abcd)
Попытка ab
и, наконец, a
, оба производят ожидаемое поведение.
Что это за хитрость?