2013-09-26 3 views
0

PHP로 만든 웹 서비스에 요청하는 Android 앱을 개발 중입니다. Android 앱에서 내 데이터를 얻는 방법은 코드 뒤에 정적으로 URL을 전달하는 것입니다. 코드에있는이 URL은 사용자에게 표시되지 않습니다. 내 URL이 사용자에게 공개되어 해당 사용자가 내 웹 서비스를 해킹 할 수있는 가능성이 있습니까?Android 웹 서비스 보안

여기에 StackOverflow에서 정적 URL을 저장하기 위해 String 리소스를 사용해야한다고 언급 한 적이 있습니다. 하지만 안드로이드에 대한 자료를 뿌리면 파일 관리자에서 열 수 있다는 질문을 여기서도 찾아 왔습니다.

사람이 나에게에 시작하는 팁을 줄 수있는 경우 :

  1. 웹 서비스를 통해 PHP 내부 함수를 호출합니다.

    공공 기능 getStudents() { // 코드 학생 JSON 얻기를위한}

  2. http://mysite.com/getStudents() 안드로이드에서 웹 서비스를 호출하는 URL을 숨기기 등의

    통화 기능을. 내가 제대로 이해하면

+4

를 URL이 공개됩니다 어떤 수준에서 그것은 정말 그래서 만약 그 거래의 큰, 당신은 귀하의 웹 서비스에 대한 보안을 넣어해야 ... –

+0

어떻게 누군가가 '해킹'귀하의 웹 서비스에 그냥 URL을 가질 수 있을까? – Supericy

+0

@Supericy Im 솔직히 확신 할 수 없지만 현재 웹 서비스의 URL과 메소드 이름을 누군가에게 보여줄 가능성이 있다고 생각합니다. 나는 RSenApps 제안으로 갈지 모른다. –

답변

0

, 당신은 사용자 (응용 프로그램을 가지고 어떤 사용자) 앱에서 일부 데이터를 볼 수 있지만, 직접 다운로드 할 수 없습니다를 원한다. 이는 동시에 사용자가 데이터에 액세스 할 수 있고 데이터에 액세스하지 못하도록하고 있음을 의미합니다. 이는 분명 불가능합니다. 콘텐츠 산업은 무수한 DRM 방식으로 시도하고 실패했습니다. 할 수있는 일 (그리고 DRM이하는 일)은 데이터를 더 괴롭히는 것입니다.

사용자는 트래픽을 스니핑 (차단)하여 URL을 얻을 수 있습니다. 이를 방지하려면 SSL을 사용해야하며 허용 할 SSL 인증서를 제한하기위한 추가 검사를 포함해야합니다. 이렇게하면 사용자가 자신의 CA를 전화에 설치 한 다음 MitM 도구를 사용하여 URL을 가져올 수 없습니다.

그러면 브라우저에서 가능한 한 악의적 인 사용자와 앱을 구별하기 위해 사용하는 URL/키/숨기기가 필요합니다. 확실히 코드에서 숨기고 ProGuard를 사용하여 읽는 것을 더 어렵게 만드십시오.

사용자 지정 사용자 에이전트, 사용자 지정 HTTP 헤더 및 기타 재미있는 정보를 사용하여 서버 측에서 일반적인 오류 메시지를 반환하는지 확인하여 공격자가 사용자가 자신의 앱을 사용하지 않는다는 것을 어떻게 알았는지 알지 못하게하고 앱 전체에 코드를 숨기십시오. (이런 일이 중 일부는 정적 호출을 사용하여 설정할 수 있습니다, 그래서 당신은 거의 어디를 숨길 수 있습니다.)

0
public class WebServis extends AppCompatActivity { 
    ProgressDialog pDialog; 
    // Web Servisimizdeki Namspace alanı 
    private final String _Namspace  = "http://tempuri.org/"; 
    // Web Servimizdeki Method ismi 
    private final String _MethodName = "methodname"; 
    // Namspace ile Method isminin birleşimi 
    private final String _Action  = "http://tempuri.org/"+_MethodName; 
    // Web Servisimizin Adresi 
    private final String _Url   = "http://"ip&or&domain"/WebService/Service.asmx"; 
    private String _ResultValue   = ""; 
    Context context; 
    EditText _birinci_sayi,_ikinci_sayi; 
    String a,b; 
    String TAG = "Response"; 
    String resultString; 
    Object object=null; 
    //priv JSONArrayAdapter getListView; 
    private ListView lv; 
    ArrayList contactList; 
    Button _btn_topla; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_web_servis); 
     // Topla butonumuzu tanımlıyoruz. 
     _btn_topla=(Button)findViewById(R.id.button); 
     // Yukarıda tanımladığımız _btn_topla butonuna tıklama olayını tanımlıyoruz. 
     lv= (ListView)findViewById(R.id.listView); 
     _btn_topla.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       //Hazırladığımız AsyncTask'ımızı çalıştırıyoruz.. 

       AsyncCallWS task = new AsyncCallWS(); 
       task.execute(); 
      } 
     }); 
    } 
    // Arkaplanda webservis işlemlerimizi yaptığımız yer. 
    // AsyncTask sınıfımızdan _WebServiceAsyncTask türetiyoruz.. 
    private class AsyncCallWS extends AsyncTask<Void, Void, Void> { 
     @Override 
     protected void onPreExecute() { 
      Log.i(TAG, "onPreExecute"); 
     } 
     @Override 
     protected Void doInBackground(Void... params) { 
      Log.i(TAG, "doInBackground"); 
      calculate(); 
      HashMap<String, String> contact = new HashMap<>(); 
      showData(resultString); 
      return null; 
     } 
     @Override 
     protected void onPostExecute(Void result) { 
      super.onPostExecute(result); 
      Log.i(TAG, "onPostExecute"+ resultString); 
      Log.i(TAG, "Step 9"); 
      try { 
       ListAdapter adapter = new SimpleAdapter(
         WebServis.this, contactList, 
         R.layout.list_order, new String[]{"name", "email", 
         "adres"}, new int[]{R.id.Name, 
         R.id.Email, R.id.Adres}); 
       Log.i(TAG, "Step 10"); 
       lv.setAdapter(adapter); 
       Log.i(TAG, "Step 11"); 
      } catch (Exception e) { 
       Toast.makeText(getApplicationContext(),"Hata" + e.toString(),Toast.LENGTH_SHORT).show(); 
       e.printStackTrace(); 
      } 
     } 
    } 

    public void calculate() { 
     String SOAP_ACTION = _Action; 
     String METHOD_NAME = _MethodName; 
     String NAMESPACE = _Namspace; 
     String URL = _Url; 
     try { 
      //PropertyInfo propertyInfo=new PropertyInfo(); 
      SoapObject Request = new SoapObject(NAMESPACE, METHOD_NAME); 
      Request.addProperty("TABLENAME","USER_TBL"); 
      Request.addProperty("COLUMNS","USERID,NAME,PASS,EPOSTA,ADRESS"); 
      Request.addProperty("WHERECRTR",""); 
      Request.addProperty("TOP",""); 
      Request.addProperty("COLUMN",""); 
      SoapSerializationEnvelope soapEnvelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); 
      soapEnvelope.dotNet = true; 
      //soapEnvelope.headerOut = security; // this is an Element[] created before 
      soapEnvelope.setOutputSoapObject(Request); 
      HttpTransportSE transport = new HttpTransportSE(URL); 
      transport.debug=true; 
      transport.call(SOAP_ACTION, soapEnvelope); 
      SoapPrimitive response = (SoapPrimitive) soapEnvelope.getResponse(); 
      //resultString1 = (SoapPrimitive) soapEnvelope.getResponse(); 

      resultString =response.toString(); 
      Log.i(TAG, "Result Celsius: " + resultString); 
     } catch (Exception ex) { 
      // Log.e(TAG, "Error: " + ex.getMessage()); 
     } 
    } 
    private void showData(String json) { 
     String jsonStr = json; 
     Log.e(TAG, "Response from json: " + jsonStr); 
     if (jsonStr != null) { 
      try { 
       JSONObject jsonObj = new JSONObject(jsonStr); 
       // Getting JSON Array node 
       JSONArray contacts = jsonObj.getJSONArray("USER_TBL"); 
       // looping through All Contacts 
       contactList = new ArrayList<HashMap<String, String>>(); 
       for (int i = 0; i < contacts.length(); i++) { 
        JSONObject c = contacts.getJSONObject(i); 
        String id = c.getString("USERID"); 
        String name = c.getString("NAME"); 
        String email = c.getString("EPOSTA"); 
        String address = c.getString("ADRESS"); 
        String pass = c.getString("PASS"); 
        HashMap<String, String> contact = new HashMap<String, String>(); 
        contact.put("id", id); 
        contact.put("name", name); 
        contact.put("email", email); 
        contact.put("adres", address); 
        contact.put("pass", pass); 
        //contact.put("mobile", mobile); 
        // adding contact to contact list 
        contactList.add(contact); 
       } 
      } catch (final JSONException e) { 
       Log.e(TAG, "Json parsing error: " + e.getMessage()); 
       runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 
         Toast.makeText(getApplicationContext(), 
           "Json parsing error: " + e.getMessage(), 
           Toast.LENGTH_LONG) 
           .show(); 
        } 
       }); 
      } 
     } else { 
      Log.e(TAG, "Couldn't get json from server."); 
      runOnUiThread(new Runnable() { 
       @Override 
       public void run() { 
        Toast.makeText(getApplicationContext(), 
          "Couldn't get json from server. Check LogCat for possible errors!", 
          Toast.LENGTH_LONG) 
          .show(); 
       } 
      }); 
     } 
    } 
} 
0

ASP.net

public string xLxS(string TABLENAME, string COLUMNS, string WHERECRTR, string TOP, string COLUMN) 
     { 
      string sonuc = ""; 
      DT = dataclass.SELECTSQL(TABLENAME, COLUMNS,TOP, WHERECRTR, ""); 
      if (DT.Rows.Count == 1) 
      { 
       if (COLUMN != "") 
       { 
        sonuc = DataTableToJsonObj(DT,TABLENAME); 
       } 
       else 
       { 
        sonuc = DT.Rows[0][COLUMN].ToString(); 
       } 
      } 
      else if(DT.Rows.Count > 1) 
      { 
       sonuc = DataTableToJsonObj(DT,TABLENAME); 
      } 
      return sonuc.ToString(); 
     }