Мы успешно реализовали в нашей пирамиде Python + программу Encrypted Website Payments для PayPal, за исключением крошечной детали: дезинфекции ввода. А именно, мы хотели бы помочь пользователю, предоставив PayPal как можно больше данных из нашей пользовательской базы данных. Мне пришло в голову, что злоумышленник может изменить свое имя на «Mr Hacker \ nprice = 0.00» или подобное и таким образом полностью свести на нет безопасность, предлагаемую EWP. Я пробовал кодировать значения URL-адресов, но PayPal, похоже, не декодирует процентные переходы в файле.
Наш код основан на библиотеке django-paypal; библиотека полностью игнорирует эту проблему, выводя, к счастью, голые пары имя = значение без каких-либо проверок:
plaintext = 'cert_id=%s\n' % CERT_ID
for name, field in self.fields.iteritems():
value = None
if name in self.initial:
value = self.initial[name]
elif field.initial is not None:
value = field.initial
if value is not None:
# @@@ Make this less hackish and put it in the widget.
if name == "return_url":
name = "return"
plaintext += u'%s=%s\n' % (name, value)
plaintext = plaintext.encode('utf-8')
Итак, как правильно отформатировать ввод для динамически зашифрованных кнопок? Или есть лучший способ достичь аналогичной функциональности в Стандарте платежей через веб-сайт, чтобы избежать этой проблемы, но при этом такой же безопасный?
Мы создаем строку с таким содержанием, как
item_number=BASIC
p3=1
cmd=_xclick-subscriptions
business=business@business.com
src=1
item_name=Percent%20encoding%20and%20UTF-8:%20%C3%B6
charset=UTF-8
t3=M
a3=10.0
sra=1
cert_id=ABCDEFGHIJKLM
currency_code=EUR
, и шифруем ее для EWP; пользователь отправляет форму на https://www.sandbox.paypal.com/cgi-bin/webscr . Когда пользователь нажимает кнопку, на странице PayPal «Войдите, чтобы завершить оформление заказа» отображается название элемента «Процент% 20encoding% 20and% 20UTF-8:% 20% C3% B6». Таким образом, для ввода EWP кажется, что процентное кодирование не декодируется.