PhoneGap允许(Ajax请求)服务器端PHP文件只访问此应用程序(安全目的)

时间:2017-09-28 06:19:12

标签: javascript php jquery ajax cordova

我使用PhoneGap创建了一个Android应用程序(PhoneGap是一个支持您使用HTML,CSS和JavaScript等语言创建应用程序的工具。)

请注意,Android应用程序是一个开源应用程序。因此,Android应用程序代码可供服务器公开使用。所以我无法将密码,验证变量传递给服务器。

这是我的代码:

<script type="text/javascript">
    $(document).ready(function() {
        $("#insert").click(function() {
            var title = $("#title").val();
            var duration = $("#duration").val();
            var price = $("#price").val();
            var dataString = "title=" + title + "&duration=" + duration + "&price=" + price + "&insert=";
            if ($.trim(title).length > 0 & $.trim(duration).length > 0 & $.trim(price).length > 0) {
                $.ajax({
                    type: "POST",
                    url: "http://www.example.com/test/insert.php",
                    data: dataString,
                    crossDomain: true,
                    cache: false,
                    beforeSend: function() {
                        $("#insert").val('Connecting...');
                    },
                    success: function(data) {
                        if (data == "success") {
                            alert("inserted");
                            $("#insert").val('submit');
                        } else if (data == "error") {
                            alert("error");
                        }
                    }
                });
            }
            return false;
        });
    });
    </script>

此函数应使用http://www.example.com/test/insert.php更新服务器上的表。当应用程序安装在Android手机上时,它可以正常工作。

但其他用户可以使用上述功能轻松更新我的表格。我的意思是,如果他们知道URL(http://www.example.com/test/insert.php),他们也可以通过必要的帖子请求更新我的表。

如何防止这种情况发生?我怎样才能访问仅限我的应用的页面http://www.example.com/test/insert.php。我的意思是,如果请求从我的应用程序发送到http://www.example.com/test/insert.php它应该有效。

5 个答案:

答案 0 :(得分:0)

单击“插入”按钮时,尝试在隐藏的输入变量中发送值。在服务器端编程时,请检查该变量,如

if($_POST['insert'] && $_POST['<hidden varaible name>'])
{
 //your code goes here ...
}

答案 1 :(得分:0)

你只有两个我能想到的选择:

1-使用app键,就像在romal tandel的答案中一样 请注意,不要必须发布您的密钥,因为它是 NOT 代码的一部分,您可以简单地用虚拟密钥替换密钥=“XXXXX”发布的代码和开源副本不是推出此解决方案的借口。

-2您应首先确定您的用户域,并询问您应该访问服务器的用户,而不是谁应该访问服务器。只有在回答这个问题之后,您才能找到一种方法来限制只能访问您的目标用户域,例如与组织或国家/地区相关的一系列IP地址,或者预先注册唯一设备的MAC地址或唯一ID,或者很可能是毕竟会引导你使用第一个解决方案。

答案 2 :(得分:0)

就像其他人已经说过您应该使用令牌或密钥在您的应用中构建身份验证

根据我对您的问题的理解,您的最终目标是仅允许使用您的应用的用户(Android手机上的用户)访问insert.php,如果有其他设备尝试访问,则不应该更新表格。

我们想到的一个解决方案是将user agent(浏览器)和HTTP headers后面的HTTP request变量放到您的网址中。

$user_agent= $_SERVER['HTTP_USER_AGENT'];

然后根据这些变量更新或不更新表格。如果有人真的想弄乱您的应用,则可能会欺骗用户代理。有像this one这样的库可以帮助您进一步确定发送请求的设备类型。

答案 3 :(得分:-1)

你不能

请参阅以下答案,这对您有帮助。link

您需要如何设置安全API密钥才能实现此目的。 link

答案 4 :(得分:-1)

我认为你需要像this

这样的东西

Android方面:

SECRET_KEY = "abc123"

def call_api_with_secret(url, params)
  # create the hash to sign the request
  hash = MD5.hash(SECRET_KEY, url, params)

  # call the api with the added hash
  call_api(url+"&hash=#{hash}", params)
end

服务器端:

    SECRET_KEY = "abc123"

    def receive_from_api(url, params)
      # retrieve the hash
      url_without_hash, received_hash = retrieve_and_remove_hash(url)

      # check the hash
      expected_hash = MD5.hash(SECRET_KEY, url_without_hash, params)

      if (expected_hash != received_hash)
        raise our exception!
      end

      # now do the usual stuff

end