Android应用程序与webservice通信的安全性

Moh*_*adi 21 php database security android

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

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

编辑:例如,现在我使用AsyncTask将我的edittext中的数据发送到webservice,如下所示.我在oncreate中使用此代码以AskServer()的名义将数据发送到AsyncTask类:

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

这是我的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()
Run Code Online (Sandbox Code Playgroud)

这是我的网络服务中的PHP代码:

<?php

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


mysql_query("insert into `wp_comments` (`comment_content`)
                    values('$field')");
?>
Run Code Online (Sandbox Code Playgroud)

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

Pee*_*Haa 11

您无法以任何方式隐藏端点(您可以尝试,但您将失败).如果应用程序可以请求每个人都可以使用某个URL.您可以查看cloudflare服务,但您应该查看应用程序的实际安全性.

您的问题"将数据量发送到我的网站并将其删除"对您的问题没有多大意义.为什么向服务器发送数据会导致数据下降?

除非您询问如何减轻(D)DOS攻击,这是一个完整的其他预防级别(使用昂贵的服务取得了一定的成功).

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

$field=$_POST['field'];


mysql_query("insert into `wp_comments` (`comment_content`)
                    values('$field')");
Run Code Online (Sandbox Code Playgroud)

易受SQL注入攻击.

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


kiw*_*rew 5

一般来说,您问题的其他答案都是正确的:很难确保只有您的应用程序可以使用您的服务器的API.问题的症结在于:没有什么能阻止恶意用户冒充您的应用程序.大多数反措施都被称为"通过默默无闻的安全".例子包括:

  1. 使用未记录的"二进制"请求格式: 有足够的时间,恶意用户可以简单地对二进制格式进行逆向工程.
  2. 隐藏API端点的地址: 恶意用户可以通过他在应用程序中通过他控制的网络传递到您的服务器时嗅探请求.
  3. 要求在每个API请求上提供加密"签名": 恶意用户只需对您的应用程序进行逆向工程并找到正在使用的加密密钥.(一种称为"白盒密码术"的技术试图使你很难从你的应用程序中提取密钥,但它只会减慢一个坚定的对手.)

然而,有一种方法理论上可以与较新的Android设备一起使用:使用内置的Keystore系统,该系统旨在防止恶意用户提取应用程序使用的加密密钥.您需要做的简要概述:

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

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

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


Moh*_*adi 0

经过这段时间后,我对自己的问题给出了一些答案。这些技巧适用于 Android 应用程序客户端的 php 服务器端,但逻辑可以在服务器端的其他语言中使用。

Security :
    1- Validate input data
    2- Filter input data
    3- Bind parameters to refuse query injection
    4- Give least access to user
    5- Refuse Leakage info by disableing log and httpd.conf


    6- Output Escaping : 
        escape html in output for sites and useless for webservices
        Functions like : htmlspecialchars()


    Filter      : diagnose XSS characters and filter them
    Validate    : check if input data is like the data type we expect

    Filter functions    :
        strip_tags()
        str_replace()
        preg_replace()
        Force Change DataType by placeing datatype before them : $input = (int) $input;


    Validat functions   :
        stripos()
        preg_match()
        "ctype" functions like : ctype_alnum(text), ctype_alpha(text), ctype_digit(text) : if input is ctype validate type return true else return false

        isset()
        filter_var()


    Access to user :
        initialize all variables before use
        use if and else statements to check everything is ok to prevent showing errors
        try catch for PDO SQL errors
        HASH the password and important data in database
        set hard names for database tables and columns
        make index.php in the folder and use this code :
            <?php
                header('location',HOME_URL);
                exit;
            ?>
        in .htdocs paste this code : Options -Indexes



    Database security :
        $mysqli->real_escape_string($input); // for scape chars like ' " 
        use stored procedures for refuse query injection.
        filter inputs for : stripos($input, 'UNION')
Run Code Online (Sandbox Code Playgroud)

我希望这些提示有帮助