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

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

使软件系统免受这些危险的任何提示可以帮助我很多,谢谢(抱歉英语不好)

编辑:例如现在我使用AsyncTask在我的edittext中发送url和数据,如下所示。 我在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() 

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

  

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

Solutions Collecting From Web of "Android应用程序与webservice通信的安全性"

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

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

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

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

 $field=$_POST['field']; mysql_query("insert into `wp_comments` (`comment_content`) values('$field')"); 

易受SQL注入攻击。

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

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

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

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

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

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

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

RESTAPI中Android应用程序的安全性

我们设计了一个“.so”文件,用于RESTAPI中的安全性。“。”文件是android NDK的本机编译文件。 我们设计了一个auth_key,它根据用户“email”和“password”由“.so”文件生成。 它生成265位数的密钥用于授权。 表示用户是否有效。 并且同样的算法也适用于服务器端以从密钥获得原始数据。 我看到99%的支付网关也使用我们自己的算法来生成“.so”中的auth_key意味着本机文件。 因为任何黑客都无法对此文件进行逆向工程以获取原始算法代码来生成auth_key

即使你试图通过附加字节来隐藏你的字符串,使用字符和什么不是,最终它仍然会进行网络调用。 使用TCP转储或HTTP代理(如Charles) ,您的呼叫将立即被截获。

您宁愿专注于保护对服务器的访问,如果您担心服务器会被驱动,可能会查看CloudFlare DDOS保护等解决方案。

如果您使用Web Service第一个呼叫端口是SSL证书,则移动应用程序与服务器通信。

然后使用具有单个端点的API系统(这意味着它是所有请求的一个端点)SOAP或JSON-RPC V2我更喜欢后者,原因有两个,第一个是SOAP,尽管它不应该在ASP.NET和PHP以包络的方式工作。 和JSON-RPC的负载量要小得多。

这些与受SSL保护的单个端点相结合意味着没有人可以获得更多的服务器地址,因此您可以实现基本的登录以获得基本保护,但是如果有人可以解构您的应用程序EG,则可以使用Apache Cordova或其他东西我建议你使用用户登录系统。

我的第一点是最重要的用于WEB服务的SSL。 这可以是WebSockets,SOAP,JSON-RPC,REST通过Web服务器的任何东西。

我总是像你一样担心。 Java解码器,反编译器,dex2jar ,. 这样的软件总是威胁应用程序的代码安全性。

使用webserivce被认为足够安全,因为您的重要数据,如电子邮件,IP,密码,数据库名称,无需在您的项目中写下来。

但即便是他们也可能被黑客攻击。 这种types可以在插入和更新时find。 黑客可以find您要插入或更新的代码,他们可以在描述的url上手动尝试使用他们想要的数据。

示例 – http://www.myweb.com/update?name=“hacker”&value =“1111111111”

这种欺骗行为可能会在黑客攻击您的应用程序时出现。

我建议你创建自定义加密和动态数据 –

我的意思是,你应该从服务器/数据库获取整个URL,而不是用项目编码。

示例 – http:// www 。“+ web +”/“+ v1 +”= 1212121“这种复杂的句子会使黑客在解码时感到沮丧。动态价值也很难find和结合。

也尝试使用子串来制造幻觉。 并从动态服务器获取子串编号规范。 这会导致黑客无视您的应用程序以继续破解。

这种方法对我很有用,但我不是每个人都清楚。

正如大家所说,你无法隐藏你的终点。 保护Web服务的唯一方法是编写安全的代码。

除了已经说过的所有内容之外,我建议我find一些非常简单但function强大的工具来编写小型Web服务:

  • OAuth2 Server PHP是关于Oauth2的PHP的最佳资源
  • Slim Framework ,快速,简单,IRC通道支持,良好的文档

首先,您可以更改为https,这更安全。

秒,您可以为客户端的params制定一些规则。

我写了一个简单的框架并像这样处理它

`/ ** *检查参数* /

 private static function checkParams($params){ $data = $params['data']; $str = MD5_PREFIX; foreach($data as $k=>$v){ $str.=$k.$v; } if(md5($str) != $params['sign']){ throw new Exception("err sign",SIGN_NOT_CORRECT); } } 

`

在这段时间过后,我带着一些自己的问题得到答案。 这些提示是针对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') 

我希望这些提示有所帮助