Web 服务和 phonegap:最佳实践

Posted

技术标签:

【中文标题】Web 服务和 phonegap:最佳实践【英文标题】:web services and phonegap : best practices 【发布时间】:2014-07-07 05:35:47 【问题描述】:

您好,我正在使用 phonegap 进行跨平台开发(我使用 angularJS 作为 JS 框架)。 我想使用网络服务从我的网站上的数据库(mysql)访问职位列表。

问题是我找到的解决方案根本不安全:

javascript

var xhr;
if (window.XMLHttpRequest)
    xhr =  new XMLHttpRequest();
else
    xhr =  ActiveXObject("Microsoft.XMLHTTP");

xhr.open("GET", "http://localhost:8888/MAMP_Site/0/test.php", true);
xhr.send(null);
xhr.onreadystatechange = function() 
    if (xhr.readyState == 4 && (xhr.status == 200 || xhr.status == 0)) 
    console.log("Ready State4: Json Textual Data retrieved");
          handleData(xhr.responseText); // Json Textual Data
    
;

function handleData(data)

var jsonData;
console.log("ReceivedData from WebService:"+data);
jsonData = eval('(' + data + ')');

$scope.lastUpdate = jsonData[0];
$scope.jsonData = jsonData[1];
$scope.$apply();

PHP(用作“网络服务”)

<?php
    header('Access-Control-Allow-Origin: *');
    header("Content-Type: text/plain");

    class UserInfo 
        public $id = "";
        public $name  = "";
        public $username = "";
        public $timestamp = "";

        public function __construct($_id, $_name, $_username, $_timestamp) 
        $this->id = $_id;
        $this->name = $_name;
        $this->username = $_username;
        $this->timestamp = $_timestamp;
      
    


    $db = mysql_connect('localhost:8889', 'root', 'root'); 
    mysql_select_db('myDbName',$db);
    $sql = 'SELECT id,name,username,timestamp FROM positions_test'; 
    $req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error()); 
    $dataArray = array();

    while($data = mysql_fetch_assoc($req))  
        $dataArray[]= new UserInfo($data['id'],$data['name'],$data['username'],$data['timestamp']);
     

    //Last Modified Time
    $sql = "SELECT UPDATE_TIME FROM information_schema.tables WHERE  TABLE_SCHEMA = 'myDbName'AND TABLE_NAME = 'positions_test'"; 
    $req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error()); 
    $data = mysql_fetch_assoc($req)["UPDATE_TIME"]; 

    $jsonDataArray = array($data, $dataArray);
    echo json_encode($jsonDataArray);
    mysql_close(); 
?>

基本上PHP返回一个JSON(作为文本),我在我的JS中得到它(作为文本)。然后我将其评估为 JSON。

问题

安全问题

由于该应用程序是用cordova制作的,因此可以查看所有JS和html源代码以及我的php“web服务”的URL。这意味着任何拥有该地址的人都可以访问 Json 文件。即使这些数据是公开的(就我而言),我希望它只能从我的应用程序中访问(例如,这样我可以避免机器人存储所有这些数据和垃圾邮件)。

令牌或用户代理

由于没有对用户进行身份验证,我的网络服务有什么方法可以知道请求来自哪里? 我认为使用令牌来确保请求来自我的应用程序,但再次因为可以查看源代码,任何人都可以看到令牌或生成它的代码。 也许使用user-agent 来了解它是否是从移动设备访问的?

80 以外的其他端口

也许选择 80 以外的其他端口来连接我的 Web 服务是明智的,但我该如何选择我的连接端口?

最佳实践

重点实际上是,phonegap (cordova) 上的 Web 服务的最佳实践是什么? 我应该使用 SSL、Https 吗? 我应该使用真正的 Web 服务而不是简单的 php 页面和 XMLHTTPRequest 吗?如果有,是哪一个? 当然还有如何正确和安全地构建我的网络服务?

我知道这是一篇很长的帖子,但我在网上搜索了一段时间,发现了很多有趣的东西,但没有真正具体说明为 phonegap 应用程序构建 Web 服务的最佳实践(无需用户身份验证)

【问题讨论】:

【参考方案1】:

您可以尝试对其进行混淆,或进行很多其他操作,但最终您必须在客户端接收它,因此您无法完全阻止他读取您的数据,看到您的客户附加代码或向您的服务发送垃圾邮件。

确保服务安全的最佳方法是:确保与数据库的连接不允许写入,所有涉及的软件都定期更新,并且发送到服务的查询具有语法和内容你所期待的。

【讨论】:

以上是关于Web 服务和 phonegap:最佳实践的主要内容,如果未能解决你的问题,请参考以下文章

在 Phonegap / Sencha 中观看 YouTube 的最佳实践

PhoneGap 上页眉和页脚的最佳实践

Phonegap 是不是支持根相对路径?最佳实践是啥?

Phonegap 保存数据超过 5mb 限制的最佳实践

在 Web 服务中处理 id 的最佳实践是啥?

保护REST API/Web服务的最佳实践