我们已经成功实施了我们的Python +金字塔程序PayPal的加密网站付款,除了一个小细节:输入清理。也就是说,我们希望通过从用户数据库向PayPal提供尽可能多的数据来帮助用户。现在,我突然想到恶意用户可以将他的名字改为' 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%20和%20UTF-8:%20%C3%B6"。因此,对于EWP输入,似乎没有解码百分比编码。
答案 0 :(得分:0)
您可以使用正则表达式过滤出键值对;
>>> import re
>>> text = 'Mr Hacker\nprice=0.00\nsecurity=false'
>>> re.sub('[\n][^\s]+=[^\s]*', '', text)
'Mr Hacker'
或者甚至更简单,在第一个换行符后丢弃所有内容;
>>> text.splitlines()[0]
'Mr Hacker'
后者假定第一行是正确的,可能不是这种情况。