我正在为一个站点开发一个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());
这是我的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代码:
<?php
include 'config.php';
$field=$_POST['field'];
mysql_query("insert into `wp_comments` (`comment_content`)
values('$field')");
?>
这是一个例子,我的真实代码向服务器发送了更多的数据,上面的代码可能不起作用,我只是让我的问题更加准确和具体,因为stackoverflow想要我。 我的问题是如何使这些交易安全可靠,黑客可能会调试我的代码并找到我的网址,在上面的代码中(params [0])并将数据量发送到我的网站并将其删除。或者我如何使用向服务器发送数据的服务更安全地避免这些危险?
答案 0 :(得分:11)
您无法以任何方式隐藏端点(您可以尝试,但您将失败)。如果应用程序可以请求每个人都可以使用某个URL。您可以查看cloudflare等服务,但您应该查看应用程序的实际安全性。
您的问题“将数据量发送到我的网站并将其删除”对您的问题没有多大意义。为什么向服务器发送数据会导致数据下降?
除非您询问如何减轻(D)DOS攻击,这是一个完整的其他预防级别(使用昂贵的服务取得了一定的成功)。
您应该更担心的是应用程序的实际安全性,例如:
$field=$_POST['field'];
mysql_query("insert into `wp_comments` (`comment_content`)
values('$field')");
易受SQL injection攻击。
此处也未共享,但您可以使用以下方法查看应用程序端点的身份验证: oAuth这样您就不必在应用程序本身中存储用户名+密码,而只需“存储”您可以轻松撤销的访问令牌。
答案 1 :(得分:5)
通常,您问题的其他答案都是正确的:很难确保只有您的应用程序才能使用您服务器的API。问题的症结在于:没有什么能阻止恶意用户假装成您的应用程序。大多数反措施都被称为“通过默默无闻的安全”。例子包括:
然而,有一种方法理论上可以与较新的Android设备一起使用:使用内置的Keystore system,旨在防止恶意用户提取应用程序使用的加密密钥。简要概述您需要做什么:
KeyPairGenerator
生成新的公开/私钥对。无论恶意用户做了什么,一旦步骤#1完成并且私钥安全地存储在Android设备的密钥库中,就无法提取该密钥并使用它来模拟您的应用程序。不幸的是,即使这种方法也有一个重要的缺点:如何验证步骤#1中的请求(您的应用程序在服务器上注册其安全公钥)是由您的应用程序进行的?
因此,出于所有实际目的,您只需承担在服务器上公开API的后果,并采取您需要的任何步骤,以保护该API免遭滥用。
答案 2 :(得分:2)
RESTAPI中Android应用的安全性
我们设计了一个&#34; .so&#34;有关RESTAPI&#34; .so&#34;的安全性文件文件是android NDK的本机编译文件。 我们设计了一个由&#34; .so&#34;生成的auth_key。根据用户提交的文件&#34;电子邮件&#34;和#34;密码&#34;。它生成265位数的密钥用于授权。表示用户是否有效。并且同样的算法也适用于服务器端以从密钥获得原始数据。我看到99%的支付网关也使用我们自己的算法在&#34; .so&#34;中生成auth_key。意味着原生文件。因为任何黑客都无法对此文件进行逆向工程以获取原始算法代码以生成auth_key
答案 3 :(得分:1)
即使你试图通过附加字节来隐藏你的字符串,使用字符和什么不是,最终它仍然会进行网络调用。使用TCP转储或HTTP代理(例如Charles),您的呼叫将在任何时间被截获。
如果您担心自己的服务器会受到影响,则必须专注于保护对服务器的访问,并可能查看CloudFlare DDOS protection等解决方案。
答案 4 :(得分:0)
我总是像你一样担心。 Java解码器,反编译器,dex2jar ,.这样的软件总是威胁着应用程序的代码安全性。
使用webserivce被认为足够安全,因为您的项目中没有必要记下您的重要数据,如电子邮件,IP,密码,数据库名称。
但即便是他们也可能被滥用网址滥用。这种类型可以在插入和更新时找到。 黑客可以找到您要插入或更新的代码,他们可以手动在描述的网址上使用他们想要的数据进行尝试。
示例 - http://www.myweb.com/update?name= “黑客” &安培;值= “1111111111”
在黑客攻击时可能会出现这种欺骗行为。
我建议您创建自定义加密和动态数据 -
我的意思是,你应该从服务器/数据库获取整个网址,而不是用项目编码。
示例 - http://www “+幅+”/ “+ V1 +”= 1212121" 这种复杂的句子会使黑客在解码时感到沮丧。动态价值也很难找到并结合起来。
也尝试使用substring来制作幻觉。并从动态服务器获取子串编号规范。这会导致黑客无视您的应用程序以继续破解。
这种方法对我很有用,但我不是每个人都确定。
答案 5 :(得分:0)
正如大家所说,你无法隐藏你的终点。保护您的Web服务的唯一方法是编写安全的代码。
除了已经说过的所有内容之外,我建议我找到一些非常简单但功能强大的工具来编写小型Web服务:
答案 6 :(得分: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')
我希望这些提示能够提供帮助