嗨,我正在使用phonegap进行跨平台开发(我使用angularJS作为JS框架)。我想使用一个web服务访问从我的数据库(mysql)在我的网站上的位置列表。
问题是我找到的解决方案根本不安全:
Javascriptvar 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(用作"web service")
<?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文件。即使这些数据是公开的(在我的情况下),我希望它只能从我的应用程序访问(这样我就可以避免机器人存储所有这些数据和垃圾邮件)。
令牌或用户代理
由于没有对用户进行身份验证,我的web服务是否有办法知道请求来自哪里?
我想使用令牌来确保请求来自我的应用程序,但再次作为源代码可以查看,任何人都可以看到令牌或生成它的代码。
也许可以使用user-agent来知道是否从移动设备访问它?
非80端口
也许选择另一个端口而不是80来连接到我的web服务是明智的,但是我如何选择连接端口呢?
最佳实践主要的问题实际上是,在phonegap (cordova)上的web服务的最佳实践是什么?我应该使用SSL还是Https?
我应该使用一个真正的web服务而不是一个简单的php页面和XMLHTTPRequest吗?如果有,是哪一个?
当然,如何正确和安全地构建我的web服务
我知道这是一个很长的帖子,但我在网上搜索了一段时间,我发现了很多有趣的东西,但没有真正具体的最佳实践来构建您的web服务为一个phonegap应用程序(没有用户身份验证)
你可以尝试混淆它,或者做很多其他事情,但最终你必须在客户端接收它,因此你无法完全阻止他读取你的数据,看到你的客户端代码或垃圾邮件你的服务。
确保服务安全的最佳方法是:确保与数据库的连接不允许写,所有涉及的软件都定期更新,并且发送到服务的查询具有您期望的语法和内容。