0

我正在使用 json 请求登录并显示与用户有关的消息。但是如果我从浏览器发出相同的请求,它仍然可以工作。我正在为我的 App 使用 PHP-MYSQL。我没有任何网站,所以我需要应用程序本身的答案。

我正在使用带有 android 应用程序的 facebook sdk,所以我没有任何密码。我想在调用时保护用户和用户数据配置文件之间的聊天消息。就是这样。

我的问题是:

  1. 如何确保仅在应用程序内拨打电话?

  2. 当一些人试图在浏览器中复制和粘贴代码时,我如何确保通话安全?

3.10秒后创建的消息有超时时间。所以不能重复使用相同的url和msg。

我有像 http://example.com/login=emailId 这样的 http 调用;

获取消息:http://example.com/getMsgs/user=uiniqueNo;

我在应用程序中使用时提供了上述链接,它工作正常但不安全。请建议我一些文件和流程。我已经检查了这个链接保护 HTTP 请求不被其他人调用, 但不清楚。请建议我任何具有上述要求的教程。在此先感谢。我非常感谢您的帮助。

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(); 

            }
        });     
    }   
}

在上面的代码中,任何人都可以猜到 usersno,但我如何确保应用程序和 php 服务器中没有 123应该深入到用户无法破解的操作系统中,因此我可以解密服务器 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!!!');
}

?>
4

2 回答 2

1

好吧,除非你使用 https 在你的 api 和你的 js 客户端之间传输数据,否则没有办法真正完美地保护这个系统。

这是你做的:

  1. 首先在你的数据库端创建一个用户登录系统,用户名/密码表
  2. 接下来创建一个表单供用户登录
  3. 每当用户尝试访问 api 时,您的服务器将检查它是否为该用户设置了会话,他们要么必须登录,要么传递现有的会话 ID,这将授予他们访问权限
  4. 接下来是购买 https 证书,以确保您的数据安全传输
  5. 现在对 api 的每个请求,服务器总是检查他们的用户是否发送了有效的 SESSION ID,如果没有,它会简单地将他们重定向到登录页面

这几乎是您可以为系统添加安全性的唯一方法。最重要的部分是 https 证书。没有这个,无论用户/密码有多好,它仍然可能受到损害。

编辑

这是一些示例代码,可帮助您入门。此代码未经测试,只是为了给您一个想法。您可以在此处阅读有关会话的所有信息。

 <?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");
    }

?>
于 2013-04-13T19:55:30.260 回答
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,因此您应该返回错误消息。

在我看来,实现这一点的第二种方法更好,因为在我看来 usingGET并不安全。它比 using 更容易POST。在这种情况下,您必须my_secure_param作为 post 参数发送,您可以通过在浏览器中输入来使用它(仍然有一种方法可以通过浏览器安装 post 请求插件来实现此目的)。所以我认为这里最好的解决方案是POST在连接到后端时使用请求,使用MD5or发送一些散列字符串SHA1(至少这是我们保护与服务器的连接的方式+一些额外的东西)。

编辑:关于评论,你可以通过在你的服务器上为特定用户创建某种标识来实现这一点,而不是信任 facebook。这只是一个建议...例如,您可以从 facebook 获取 id 用户并创建一个唯一的哈希 id,您将其存储在您的服务器中,并且每次您从应用程序发送请求时,您都必须发送该唯一 id,这将在应用程序中创建的方式与在服务器上创建它的方式相同。如果匹配,则每次有人发送消息时,您都必须检查该哈希,如果不只是返回错误..而且不要忘记,使用POSTrequests 而不是GET!如果不更改服务器后端中的一些代码,就无法实现这样的目标。

于 2013-04-13T19:32:25.977 回答