【问题标题】:Why use a JSON object to pass data with POST versus a Query String in Perl?为什么使用JSON对象通过POST和Perl中的查询字符串传递数据?
【发布时间】:2014-02-22 05:30:15
【问题描述】:

我希望使用 Stripe.pm 运行一个脚本,主要是希望进行信用卡处理。信用卡号根本没有通过。我看到的所有示例都使用在 POST 调用中传递的 JSON 对象,但我有很多使用查询字符串的经验,即

 http://www.example.com/cgi-bin/processingscript.pl?param1=XXXX&param2=YYYYY&param3=ZZZZZ

这是安全风险吗?与我习惯使用的查询字符串相比,使用 JSON 发布的优点或缺点是什么?

【问题讨论】:

  • 查询字符串的问题是1)它通常会记录在日志中,如果有任何敏感信息会很糟糕,2)浏览器和服务器通常对查询字符串的长度有限制。跨度>
  • 我不明白;运行脚本与接受 HTTP 请求有什么关系?您能否更好地描述您正在尝试编写的内容以及您正在谈论的内容是谁提供的?
  • 我会先使用SSL,然后再考虑 GET 与 POST。

标签: json perl post cgi-bin


【解决方案1】:

从纯粹的技术角度来看,如果您传递一个合理短的参数,POST 和 GET 之间没有区别。你也可以只传递 JSON 作为 GET 参数没问题:

GET foo.pl?json={'foo':'bar'}

在这种情况下,对数据进行 url 编码是有意义的。您也可以使用 POST 发送相同的请求。

如果您根本不想使用查询参数,则需要 POST 并将您的 JSON 放入请求正文中。根据您选择的选项,在 Perl 中如何处理它会有所不同。假设您正在使用 CGI 模块... Perl 在 POST 和 GET 参数之间没有区别。

对于查询字符串GET或POST,需要做:

use CGI;
my $cgi = CGI->new;
my $json = $cgi->param('json');

如果您将有效负载直接放入请求正文中,您将需要这样做:

use CGI;
my $cgi = CGI->new;
$cgi->param('POSTDATA');

这在 CGI 中的 "handling non url-encoded ..." 下记录。

对于 JSON,当然也有解析它所需要的时间,但这应该可以忽略不计。

JSON 相对于其中没有 JSON 的查询字符串的优势在于,您可以在 JSON 中编码任意复杂的数据结构,而纯文本查询字符串只有一层深度。


从安全的角度来看,几乎所有内容都已说明。我将回顾一下我自己的想法:

  • 使用 SSL
  • 请勿将敏感内容放入日志文件中
  • 如果您正在处理 CC 数据(即使它不是数字本身),请格外小心;阅读 PCI DSS 并在传输过程中加密内容
  • 切勿存储 cvc!
  • 如果您想了解有关该主题的更多信息,请访问名为 Information Security 的 Stack Exchange 站点。

【讨论】:

    【解决方案2】:

    安全 - 确保除了用户/服务器之外没有人知道数据 GET/POST 没有影响。使用 SSL 来确保这一点。 - 阻止用户向您的脚本传递“有趣”的参数。 POST 具有一定的安全性,因为大多数用户不会看到参数,但这并不是真正的安全性。您应该检查应用程序中的参数以涵盖这一点。

    通常带有漂亮数据包(例如 JSON)的 POST 可以提供更加灵活和可维护的应用程序接口,并且您无需像使用时一样担心参数的编码和长度获取。

    【讨论】:

      【解决方案3】:

      发布:

      • 通常对重要数据更安全
      • url 中未显示的参数
      • 与使用对您发送的参数有长度限制的 GET 相比,您可以传递更长的字符串结构(例如 JSON)

      【讨论】:

        猜你喜欢
        • 2021-02-04
        • 1970-01-01
        • 2020-12-27
        • 2014-04-11
        • 1970-01-01
        • 2018-11-05
        • 1970-01-01
        • 2016-09-20
        • 2011-03-19
        相关资源
        最近更新 更多