PayPal:如何清理动态创建的加密网站付款按钮的字段值?

Posted

技术标签:

【中文标题】PayPal:如何清理动态创建的加密网站付款按钮的字段值?【英文标题】:PayPal: How to sanitize field values for dynamically created Encrypted Website Payments buttons? 【发布时间】: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 编码。 【参考方案1】:

您可以使用正则表达式过滤掉键值对;

>>> import re
>>> text = 'Mr Hacker\nprice=0.00\nsecurity=false'
>>> re.sub('[\n][^\s]+=[^\s]*', '', text)
'Mr Hacker'

或者更简单,放弃第一个换行符之后的所有内容;

>>> text.splitlines()[0]
'Mr Hacker'

后者假设第一行是正确的,但情况可能并非如此。

【讨论】:

是的,我可以过滤换行符。这就是我们现在所做的,我们用空格替换它们,其他不安全的字符呢?我正在寻找可靠/官方来源的答案,例如“您可以使用除换行符以外的所有字符”或“值中不允许的字符列表是...” 我想你得问贝宝。但如果他们清理输入,我会感到惊讶! 看看:cms.paypal.com/us/cgi-bin/… NVP 与加密网站付款不同。 EWP 规定名称-值对由换行符分隔,而不是 &。此外,如上所述,EWP 不支持百分比转义。

以上是关于PayPal:如何清理动态创建的加密网站付款按钮的字段值?的主要内容,如果未能解决你的问题,请参考以下文章

在 PHP 中创建动态 PayPal 立即购买按钮

用于 PHP 中的动态立即付款按钮的 Paypal API

如何使用 django-paypal 获取付款通知

如何使用 paypal 立即购买按钮在我的网站上实施定期付款?我不想使用订阅按钮..?

无法在 Rails 中使用 PayPal 加密网站付款

如何使用 Paypal NVP API 为第三方客户“即时”创建加密的 PayNow 按钮?