【问题标题】:Best Practice Using JSON to pass data from Java to PHP and PHP to Java Securely最佳实践使用 JSON 将数据从 Java 安全地传递到 PHP 和 PHP 到 Java
【发布时间】:2014-02-21 14:22:32
【问题描述】:

我一直在开发一个 android 应用程序项目,该项目使用 HTTP Get 通过使用 Java 中的 JSON 的 PHP 文件从 MySQL 发送和接收数据。

我最近在使用 HTTP 传输和通过 URL 传递参数的最佳实践背后遇到了一些理论上的问题。

第一个问题:

我应该如何将我的数据传递给我的 PHP Web 服务?

目前我只是使用键值对通过单个参数传递数据,如下所示:

myurl.com/retrieveinfo.php?user_id=453&password=sha1-hash-value

我应该移动这种类型的请求以将 JSON 对象附加到 URL 上吗?像这样:

myurl.com/retrieveinfo.php?{\"users\":{\"username\":\"User1Name\" ,\"user_id\":453 , \"password\":\"sha1-hash-value\"}}

第二个问题:

*我应该如何处理来自服务器的 JSON 响应?我是否需要将这项工作推给处理程序并确保 UI 线程不是做这项工作的人? *

目前我只是为每个对象类型使用单独的方法解析 JSON,例如

用户类

 private void parseUserInfo(JSONObject response){
    // Do all my Parsing for a User Object

    try{
       JSONArray users = response.getJSONArray("users");
       JSONObject user = users.getJSONObject(0);

       // Get the User info etc...

    }catch(JSONException ex){
      ex.printStackTrace();
    }

 }

Notes.Class

 private void parseNotes(JSONObject response){
    // Do all my Parsing for a Note Object

    try{
       JSONArray notes = response.getJSONArray("notes");

      for (int index = 0; index < notes.length() ; index++)
       {
       JSONObject note = notes.getJSONObject(index);

       // Get all the note info etc...

      }

    }catch(JSONException ex){
      ex.printStackTrace();
    }

 }

第三个问题:

我希望我的 PHP 服务器文件仅适用于我的应用程序。那么,在我的服务器上保护我的 PHP 文件的最佳方法是什么,以便对我的文件的请求在浏览器中运行时不会通过?

我应该发送一些只有我的应用程序知道的临时密钥吗?

谢谢

【问题讨论】:

    标签: java php android json


    【解决方案1】:

    第一个问题:

    您并不想将 JSON 对象作为查询参数放在 url 上。我看到的真正的两个争论是,您要么 1) 使用您正在使用的键值对,要么 2) 将其设为 POST 并将 JSON 作为有效负载发送。 由于您不打算将 API 公开给任何人,因此我认为遵循标准命名法对您来说并不重要。做任何你想做的事。但是,从 REST 的角度来看,检索信息的任何内容都应该是 GET 调用,并且数据应该是查询字符串上的键值对。但是,看起来您正在传递用户名和密码(好的,通行证的 sha)。始终将用户信息作为有效负载传递被认为是最佳实践。所以几乎所有的登录类型协议都使用 POST 来存储用户数据。用户 ID 或会话 ID 在查询字符串中很常见,但用户名和密码应该几乎总是在有效负载中。 注意:有时在 TLS (SSL) 中,可以将这些内容包含在查询字符串中。

    第二个问题:

    老实说,我只会使用杰克逊。 https://github.com/FasterXML/jackson 但除此之外,有一个单独的层进行解析是正常的。换句话说,一个类处理所有的解析。如果可以避免,您不希望将此代码放入模型中。新层将处理解析并将 Java 模型对象向下传递到下一层。

    第三个问题:

    最简单的方法是检查请求中的用户代理标头。确保用户代理是您的应用程序,而不是浏览器。 但是,人们仍然有可能“欺骗”这一点。使用临时密钥也无济于事,因为一旦人们嗅到流量,他们就可以找出临时密钥。 这里的标准是做某种类型的基于会话的密钥,应用程序发送某种类型的 MAC 以证明它是一个有效的客户端。 您也可以考虑使用 OAUTH2 来保护您的 api。

    【讨论】:

    • 感谢您的回复。我将不得不调查这些。您能否提供一些有关 HTTP 传输和使用有效负载的文档的链接?我一直在搜索,但恐怕我没有找到正确的信息。
    • 另外,如果我对数据库进行更新并返回更新的对象怎么办?我应该使用什么方法?
    • @inner_class7 就您对更新对象的最后评论而言,REST 声明这应该是一个 PUT。至于文档,请告诉我更多您在寻找什么。您是否正在寻找如何从 Java 代码中执行此操作?或者您是否正在寻找“规范”以及它应该如何工作?
    猜你喜欢
    • 2015-03-22
    • 1970-01-01
    • 2016-12-27
    • 1970-01-01
    • 2010-11-14
    • 2010-09-28
    • 2015-07-01
    • 2017-06-09
    • 1970-01-01
    相关资源
    最近更新 更多