Странное поведение при печати значений CGI FieldStorage (Python) - PullRequest
0 голосов
/ 04 января 2019

Я пишу простой скрипт 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, оба производят ожидаемое поведение.

Что это за хитрость?

...