使用json保护http请求(android)

时间:2013-04-13 19:14:17

标签: android mysql http phpmyadmin

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

我正在使用facebook sdk和Android应用程序,所以我没有任何密码。我希望在调用用户和用户数据配置文件时保护聊天消息。发现它。

我的问题是:

  1. 如何确保仅在应用内进行通话?

  2. 当有人试图在浏览器中复制并粘贴代码时,如何保护呼叫?

  3. 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!!!');
    }
    
    ?>
    

2 个答案:

答案 0 :(得分:1)

确定没有 方式 来实际完全保护此系统,除非您使用https在api和js客户端之间传输数据。

这就是你要做的:

  1. 首先在数据库端创建用户登录系统,用户名/密码表
  2. 接下来创建一个供用户登录的表单
  3. 每当用户尝试访问api时,您的服务器将检查它是否具有为该用户设置的会话,他们将要么必须登录或传递现有的会话ID,这将授予他们访问权
  4. 接下来是购买https证书,以确保您的数据安全传输
  5. 现在每次向api发出请求时,服务器总会检查用户是否发送了有效的SESSION ID,如果没有,则只会将其重定向到登录页面
  6. 这几乎是您可以为系统添加安全性的唯一方法。最重要的部分是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请求连接后端使用MD5SHA1发送一些散列字符串(至少这是我们确保与我们连接的方式)服务器+一些额外的东西)。

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