【发布时间】:2012-03-19 08:41:37
【问题描述】:
我们已经在我们的 Python+pyramid 程序中成功实现了 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 页面“登录以完成结帐”显示的项目名称为“Percent%20encoding%20and%20UTF-8:%20%C3%B6”。因此,对于 EWP 输入,百分比编码似乎没有被解码。
【问题讨论】:
-
啊,我应该提一下,我们仅将 PayPal 用于订阅/定期付款,因此任何不提供它们的解决方案都是不可接受的,而且该公司位于芬兰,这意味着一些更高级的服务是我们无法使用。
-
你能说明你的意思吗?PayPal 似乎没有解码文件中的百分比转义? PayPal 建议对 NVP 中的所有值进行 url 编码。