我们已经成功实现了我们的Python +金字塔程序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')
Run Code Online (Sandbox Code Playgroud)
那么,如何正确格式化动态加密按钮的输入?或者有更好的方法来实现网站付款标准中的类似功能,以避免这个问题,但是安全吗?
我们制作的是一个包含内容的字符串
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
Run Code Online (Sandbox Code Playgroud)
并为EWP加密; 用户将表单发布到https://www.sandbox.paypal.com/cgi-bin/webscr.当用户点击按钮时,PayPal页面"登录以完成结账"显示的项目名称为"百分比%20encoding%20和%20UTF-8:%20%C3%B6".因此,对于EWP输入,似乎不解码百分比编码.
您可以使用正则表达式过滤掉键值对;
>>> import re
>>> text = 'Mr Hacker\nprice=0.00\nsecurity=false'
>>> re.sub('[\n][^\s]+=[^\s]*', '', text)
'Mr Hacker'
Run Code Online (Sandbox Code Playgroud)
或者更简单,放弃第一个换行符之后的所有内容;
>>> text.splitlines()[0]
'Mr Hacker'
Run Code Online (Sandbox Code Playgroud)
后者假设第一行是正确的,但情况可能并非如此。
| 归档时间: |
|
| 查看次数: |
738 次 |
| 最近记录: |