2013-04-16 104 views
0

我每次从我的应用程序中触发时如何保护http调用,并且它需要超时,以便任何其他用户不能从任何浏览器使用相同的链接。安全的http呼叫android

我正在寻找特别的android解决方案,而不是html表单。

请帮我一把。 无法解决此问题,也不知道要继续进行哪个方向。

在此先感谢。

我附上代码PHP和Android的哪些职位的请求和回来的响应,但没有安全连接以及任何用户都可以通过调用浏览器随时随地同HTTP响应得到同样的回应...

的Android代码:

public class CustomizedListView extends Activity { 
    // All static variables 
    static final String URL = "http://example.com/getmsgs/strno=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代码:

<?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":{ 
       "image":"'.$row['image'].'", 
"artist":"'.$row['artist'].'", 
"name":"'.$row['name'].'" 
       }}'; 
     } 

    } 

    echo trim($jsonoutput); 
    mysql_close($connect) or die ('Unable to close connection-error!!!'); 
    } 

    ?> 

回答

1

尝试添加像一些时间参数,您请求

http://example.com/getmsgs/strno=123&time=20130416130256&key=.... 

key = md5('20130416130256' + 'secret_string'); 

“secret_string”是保密您的应用程序和服务器第一个字符串的格式化GMT时间在服务器端就可以(年月日时分秒)

试验时间(它必须像服务器时间)和测试密钥(它必须是coorrect MD5)

onserever侧也可以是这样的:

$strno = $_GET['strno']; 
$stime = $_GET['time']; 
$secret = 'secret_string'; 
$skey = $_GET['key']; 

if(md5($stime . $secret) != $skey) { 
    die('Bad key'); 
} 

$nCurTime = (int) gmdate('YmdHis'); 
if(($stime > $nCurTime) || ($stime < ($nCurTime - 20))) { 
    die('Bad time'); 
} 

// your code here ... 

但我不知道如何使用功能MD5和歌厅时间


地址:

一些谷歌搜索(android md5)给出的md5():

public static final String md5(final String s) { 
try { 
    // Create MD5 Hash 
    MessageDigest digest = java.security.MessageDigest 
      .getInstance("MD5"); 
    digest.update(s.getBytes()); 
    byte messageDigest[] = digest.digest(); 

    // Create Hex String 
    StringBuffer hexString = new StringBuffer(); 
    for (int i = 0; i < messageDigest.length; i++) { 
     String h = Integer.toHexString(0xFF & messageDigest[i]); 
     while (h.length() < 2) 
      h = "0" + h; 
     hexString.append(h); 
    } 
    return hexString.toString(); 

} catch (NoSuchAlgorithmException e) { 
    e.printStackTrace(); 
} 
return ""; 
} 

和获得gmt时间Getting GMT time with Android

+0

谢谢您的回复。请给我编辑t他在android和php的代码都很高。我对这个解决方案仍然很朦胧,这会有很大的帮助。 –

+0

再次感谢。可以分享上述解释的任何链接/示例。如果我有其他疑问,我可以查看它并回复您。 –

+0

密钥是如何生成的?它是如何验证的? –