我正在使用json请求登录并显示与用户有关的消息。但是如果我从浏览器发出相同的请求,它仍然有效。我在我的应用程序中使用PHP-MYSQL。 我没有任何网站,所以我需要应用程序本身的答案。
我正在使用facebook sdk和Android应用程序,所以我没有任何密码。我希望在调用用户和用户数据配置文件时保护聊天消息。发现它。
我的问题是:
如何确保仅在应用内进行通话?
当有人试图在浏览器中复制并粘贴代码时,如何保护呼叫?
3. 10秒后创建的消息有超时。因此无法重复使用相同的url和msg。
我有http调用,例如http:/example.com/login=emailId;
获取消息:http:/example.com/getMsgs/user=uiniqueNo;
我提供了上面的链接,因为我在应用程序中使用它的工作正常但不安全。 请向我推荐一些文档和流程。我已经查看了这个链接Protect HTTP request from being called by others,但目前尚不清楚。请向我推荐任何具有上述要求的教程。在此先感谢。我非常感谢您的帮助。
public class CustomizedListView extends Activity {
// All static variables
static final String URL = "http://example.com/getmsgs/userno=123";
// XML node keys
static final String KEY_SONG = "song"; // parent node
static final String KEY_ID = "id";
static final String KEY_TITLE = "title";
static final String KEY_ARTIST = "artist";
static final String KEY_DURATION = "duration";
static final String KEY_THUMB_URL = "thumb_url";
ListView list;
LazyAdapter adapter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ArrayList<HashMap<String, String>> songsList = new ArrayList<HashMap<String, String>>();
JSONObject json = JSONfunctions.getJSONfromURL(URL);
try {
JSONObject arr2 = json.getJSONObject("feed");
JSONArray arr = arr2.getJSONArray("entry");
for (int i = 0; i < arr.length(); i++) {
JSONObject e1 = arr.getJSONObject(i);
JSONArray arr3 = e1.getJSONArray("im:image");
JSONObject arr8 = e1.getJSONObject("im:name");
JSONObject arr10 = e1.getJSONObject("im:artist");
JSONObject e12 = arr3.getJSONObject(0);
// creating new HashMap
HashMap<String, String> map = new HashMap<String, String>();
map.put(KEY_THUMB_URL, e12.getString("label"));
map.put(KEY_ARTIST, arr8.getString("label"));
map.put(KEY_TITLE, arr10.getString("label"));
// adding HashList to ArrayList
songsList.add(map);
}
} catch (JSONException e) {
// Log.e("log_tag", "Error parsing data "+e.toString());
Toast.makeText(getBaseContext(),
"Network communication error!", 5).show();
}
list=(ListView)findViewById(R.id.list);
// Getting adapter by passing xml data ArrayList
adapter=new LazyAdapter(this, songsList);
list.setAdapter(adapter);
// Click event for single list row
list.setOnItemClickListener(new OnItemClickListener() {
@SuppressWarnings("unchecked")
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
HashMap<String, String> o = (HashMap<String, String>) list.getItemAtPosition(position);
Toast.makeText(CustomizedListView.this, "ID '" + o.get("KEY_TITLE") + "' was clicked.", Toast.LENGTH_SHORT).show();
}
});
}
}
在上面的代码中,任何人都可以猜到用户没有但是如何确保应用程序和php服务器中没有123.所以即使使用嗅探器程序并进行逆向工程以从apk文件获取代码数据仍然是保护和加密应该深入OS,用户无法破解,因此我可以解密服务器php中的代码,用户将无法随机输入任何内容为123.
<?php
$strno=$_GET['strno'];
if (isset($strno))
{
$connect=mysql_connect("localhost","test","test") or die ('Connection error!!!');
mysql_select_db("test") or die ('Database error!!!');
$query=mysql_query("select sno FROM users where strno='$strno';");
while($row = mysql_fetch_assoc($query))
{
$jsonoutput='{"json":{
"msg_sub":"'.$row['msg_sub'].'",
}}';
}
}
echo trim($jsonoutput);
mysql_close($connect) or die ('Unable to close connection-error!!!');
}
?>
答案 0 :(得分:1)
确定没有 方式 来实际完全保护此系统,除非您使用https在api和js客户端之间传输数据。
这就是你要做的:
这几乎是您可以为系统添加安全性的唯一方法。最重要的部分是https证书。如果没有这个,用户/密码的好坏并不重要,它仍然可能会受到损害。
修改强>
以下是一些示例代码,可帮助您入门。此代码未经过测试,只是为了给您一个想法。您可以阅读有关会话here的所有内容。
<?php
/*
like I said earlier, you need to have a "login" screen on your app
- when the user clicks login it POSTS the request back here
*/
if(isset($_SESSION['username'])){
//the username is in the session so it means
//theyre already logged in
//not sure what strno is doing but you can do that here
$strno=$_GET['strno'];
if (isset($strno))
{
$connect=mysql_connect("localhost","test","test") or die ('Connection error!!!');
mysql_select_db("test") or die ('Database error!!!');
$query=mysql_query("select sno FROM users where strno='$strno';");
while($row = mysql_fetch_assoc($query))
{
$jsonoutput='{"json":{
"msg_sub":"'.$row['msg_sub'].'",
}}';
}
}
echo trim($jsonoutput);
mysql_close($connect) or die ('Unable to close connection-error!!!');
}else if(isset($_POST) && isset($_POST['username']) && isset($_POST['password'])){
//log them in
//query ur database to see if the user exists
//if you get a row back then store that row in the session like
//note: this is just example code
if(/*user is in database, get the row....*/){
session_start();
$_SESSION['username'] = $row['username'];
}
}else{
die("Access Denied");
}
?>
答案 1 :(得分:0)
实现这一目标有两种选择。首先使用GET
方法,您可以在服务器端创建一个特定的参数,您正在寻找它。例如,从您的Android应用程序发送http://www.my-backend.com/api/test_api?my_secure_code=thisIsTestString
并且服务器返回正确的响应,但是如果您发送http://www.my-backend.com/api/test_api?my_secure_code=thatsAnotherString
,则您在请求中搜索的参数值不是thisIsTestString
,所以你应该返回错误信息。
在我看来,实现这一目标的第二种方法更好,因为在我看来使用GET
并不是那样。它比使用POST
更容易。在这种情况下,您将不得不发送my_secure_param
作为post param,您可以通过在浏览器中输入来使用(通过安装插件请求的插件,仍有一种方法可以通过浏览器实现此目的)。所以我认为这里最好的解决方案是使用POST
请求连接后端使用MD5
或SHA1
发送一些散列字符串(至少这是我们确保与我们连接的方式)服务器+一些额外的东西)。
编辑:关于评论,您可以通过为服务器上的特定用户创建某种标识,而不是信任Facebook来实现此目的。这只是一个提案......例如,你可以从facebook获取id用户并创建一个唯一的哈希id,你将存储在你的服务器中,每当你从你的应用程序发送请求时,你必须发送唯一的id,这将是在应用程序中创建的方式与在服务器上创建它的方式相同。每当有人发送消息时,你必须检查该哈希,如果不匹配,如果不是只返回错误......只是不要忘记,使用POST
请求而不是GET
!如果不改变服务器后端的某些代码,就无法实现这样的目标。