安卓应用在与网络服务通信中的安全性

2022-08-30 20:05:26

我正在为一个网站开发一个Android应用程序,我在其中做了一个功能,用户可以将数据发送到应用程序中的网站数据库。我在Android代码中使用PHP网络服务和URL来连接到网络服务。我如何通过调试我的apk来使我的应用程序(和我的php Web服务)安全,没有人找不到Web服务网址,并将大量数据发送到网站并使网站关闭。

任何使软件系统免受这些危险的提示都可以帮助我很多,谢谢。

编辑 :例如,现在我使用AsyncTask将编辑文本中的数据发送到Web服务,如下所示。我在我的oncreate中使用此代码以AskServer()的名义将数据发送到AsyncTask类:

link = "http://mywebservice-adrress/name.php";
new AskServer().execute(link, edttext.getText().toString());

这是我的asyncTask类的doInBackground:

@Override
    protected Object doInBackground(String... params) {
        BufferedReader buf = null;

        try {
            URL link = new URL(params[0]);
            URLConnection connect = link.openConnection();

            connect.setDoOutput(true);
            OutputStreamWriter osw = new OutputStreamWriter(connect.getOutputStream());
            String data = URLEncoder.encode("field","UTF8") +"="+ URLEncoder.encode(params[1], "UTF8");
            sw.write(data);
            osw.flush();
        } catch (Exception e) {e.printStackTrace();}

        return null;
    }// end doInbackground()

这是我的Web服务中的php代码:

<?php

include 'config.php';
$field=$_POST['field'];


mysql_query("insert into `wp_comments` (`comment_content`)
                    values('$field')");
?>

这是一个例子,我的真实代码向服务器发送了更多的数据,也许上面的代码不起作用,我只是让我的问题更准确和具体,因为stackoverflow需要我。我的问题是如何使这些交易安全可靠地免受黑客的攻击,黑客可能会调试我的代码并在上面的代码中找到我的网址(params[0]),并将大量数据发送到我的网站并使其关闭。或者我如何使用将数据发送到服务器的服务更安全地免受这些危险?


答案 1

您无法以任何方式隐藏终端节点(可以尝试,但会失败)。如果应用程序可以请求一些URL,每个人都可以。您可以查看像cloudflare这样的服务,但您应该研究应用程序的实际安全性。

您的问题“向我的网站发送大量数据并使其关闭”与您的问题相比没有多大意义。为什么将数据发送到服务器会让它停机?

除非您询问如何缓解(D)DOS攻击,这是一个完全不同的预防级别(使用昂贵的服务取得了适度的成功)。

相反,您应该更担心的是应用程序的实际安全性,例如:

$field=$_POST['field'];


mysql_query("insert into `wp_comments` (`comment_content`)
                    values('$field')");

容易受到 SQL 注入的影响

这里也不共享,但您可以使用例如oAuth来查看应用程序端点的身份验证,这样您就不必在应用程序本身中存储用户名+密码,而“只是”一个可以轻松撤销的访问令牌。


答案 2

通常,您的问题的其他答案是正确的:很难确保只有您的应用程序才能使用服务器的API。问题的症结在于:没有什么能阻止恶意用户冒充您的应用程序。大多数对策都是所谓的“通过模糊性实现安全”。示例包括:

  1. 使用未记录的“二进制”请求格式:在足够的时间内,恶意用户可以简单地对您的二进制格式进行反向工程。
  2. 隐藏 API 终结点的地址:恶意用户只需嗅探请求,因为它通过他控制的网络从您的应用程序传递到您的服务器。
  3. 要求在每个API请求上提供加密“签名”:恶意用户只需对应用程序进行反向工程并找到正在使用的加密密钥即可。(一种称为“白盒加密”的技术试图使从应用程序中提取密钥变得困难,但它只是减慢了坚定的对手的速度。

但是,理论上有一种方法可以与较新的Android设备配合使用:使用内置的Keystore系统,该系统旨在防止恶意用户提取应用程序使用的加密密钥。简要概述您需要执行的操作:

  1. 首次安装应用时,使用示例“用于使用 ECDSA 进行签名/验证的 NIST P-256 EC 密钥对”中概述的密钥对生成新的公钥/私钥对。KeyPairGenerator
  2. 生成密钥对后,将公钥发送到服务器,服务器会将此密钥存储在用户数据库中。
  3. 当您的应用程序想要对服务器进行API调用时,它需要使用私钥对请求进行签名;并且服务器需要使用用户的公钥验证此签名。如果请求没有有效的签名或无法验证签名,则服务器必须拒绝该请求。

无论恶意用户做什么,一旦步骤#1完成并且私钥安全地存储在Android设备的密钥库中,就无法提取该密钥并使用它来模拟您的应用程序。不幸的是,即使这种方法也有一个关键的弱点:如何验证步骤#1(您的应用程序向服务器注册其安全公钥)中的请求是由您的应用程序发出的?

因此,出于所有实际目的,您只需要忍受在服务器上公开API的后果,并采取任何您需要的步骤来保护该API免受滥用。


推荐