2017-02-24 6 views
14

Ich bin Neuling für Android-Entwicklung. Ich verwende android studio für die Entwicklung einer Anwendung. Dinge, die ich getan habeSicherung von PHP-API zur Verwendung in Android-Anwendung

  1. Erstellt eine DB mit zwei Tabellen in MySQL.
  2. Erstellt zwei separate für beide GET und POST Methoden.
  3. zugegriffen Erfolgreich beide api's

Was ich jetzt

  1. Kann GET Daten der Form api GET erreicht haben.
  2. Kann POST Daten, die die POST api

Was jetzt

ich habe zu tun mit möchte ich meine api online publizieren, das heißt ich meine Dienste in einem Server bereitgestellt werden soll und auf sie zugreifen. Zu diesem Zeitpunkt kann ich die Dienste auf dem Server bereitstellen und auf sie zugreifen.

Jetzt möchte ich meine Dienste() gesichert werden. Dafür habe ich viele Artikel gesucht und zwei Wege gefunden.

  1. Verwenden Sie yii Rahmen. Jemand hat mir gesagt, ich solle es benutzen, weil es automatisch die gesichert hat. Aber ich weiß nicht genau, ob es das tut oder nicht.
  2. manuell api's

Bezüglich Punkt sichern 1 der Rahmen wird hilfreich sein, aber es ist mir neu, und es wird einige Zeit dauern, damit coop, wie ich bereits die Web-Services erstellt werde.

Für Punkt 2 ich habe einige Informationen

  1. using HMAC_SHA1
  2. DETECTING MOBILE DEVICES USING PHP

Beiden Links scheint gut zu sein, aber Link 1 nicht gibt mir nicht viele Informationen über das.

Offensichtlich möchte ich meine beide = api's

Jetzt ist der Code Teil

GET_DATA.php

require_once ('config.php'); 

$sql = "SELECT * FROM users"; 


$r = mysqli_query($con,$sql); 

$result = array(); 

while($row = mysqli_fetch_array($r)){ 
array_push($result,array(
    'Id'=>$row['Id'], 
    'Name'=>$row['Name'] 
));} 

Echo json_encode (array ('Benutzer'> $ result sichern));

POST_DATA.php

require_once ('config.php'); 

$return_arr = array(); 

$UserId=($_POST['UserId']); 
$Latitude=($_POST['Latitude']); 
$Longitude=($_POST['Longitude']); 
$DateTime=($_POST['DateTime']); 


$user_register_sql1 = "INSERT INTO `activity`(`Id`,`UserId`, `Latitude`,`Longitude`,`DateTime`) values (NULL,'".$UserId."','".$Latitude."','".$Longitude."','".$DateTime."')"; 
mysqli_query ($con,$user_register_sql1); 
$row_array['errorcode1'] = 1; 

Ich habe einen user class, aus dem ich bin immer username und ID

JSONfunctions.java

Diese Klasse ist verantwortlich für die Daten aus dem api

public static JSONObject getJSONfromURL(String url) 
{ 

    String json = ""; 
    JSONObject jsonObject = null; 
    try 
    { 
     HttpClient httpClientt = new DefaultHttpClient(); 
     HttpGet httpGet = new HttpGet(url); 
     HttpResponse httpResponse = httpClientt.execute(httpGet); 
     BufferedReader br = new BufferedReader(new InputStreamReader(httpResponse.getEntity().getContent())); 
     StringBuffer sb = new StringBuffer(); 
     String line = ""; 
     while ((line = br.readLine()) != null) { 
      sb.append(line); 
     } 

     json = sb.toString(); 
    } catch (ClientProtocolException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    try 
    { 
     jsonObject = new JSONObject(json); 
    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 

    return jsonObject; 
} 
bekommen

PutUtility.Java

Diese Klasse ist verantwortlich für POST Methode

public void setParam(String key, String value) { 
    params.put(key, value); 
} 

public String postData(String Url) { 

    StringBuilder sb = new StringBuilder(); 
    for (String key : params.keySet()) { 
     String value = null; 
     value = params.get(key); 


     if (sb.length() > 0) { 
      sb.append("&"); 
     } 
     sb.append(key + "=" + value); 
    } 

    try { 
     // Defined URL where to send data 

     URL url = new URL(Url); 

     URLConnection conn = null; 
     conn = url.openConnection(); 

     // Send POST data request 
     httpConnection = (HttpURLConnection) conn; 
     httpConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 
     httpConnection.setRequestMethod("POST"); 
     httpConnection.setDoInput(true); 
     httpConnection.setDoOutput(true); 
     OutputStreamWriter wr = null; 

     wr = new OutputStreamWriter(conn.getOutputStream()); 
     wr.write(sb.toString()); 
     wr.flush(); 

     BufferedReader in = new BufferedReader(
       new InputStreamReader(httpConnection.getInputStream())); 
     String inputLine; 
     response = new StringBuffer(); 

     while ((inputLine = in.readLine()) != null) { 
      response.append(inputLine); 
     } 
     in.close(); 

    } catch (MalformedURLException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    }finally { 
     try { 
      reader.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 


    return response.toString(); 
} 

MainActivity.java

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    _latitude = (TextView)findViewById(R.id.latitude); 
    _longitude = (TextView)findViewById(R.id.longitude); 
    btn_get_coordinates = (Button)findViewById(R.id.button); 
    btn_save_data = (Button)findViewById(R.id.btn_save); 


    btn_save_data.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

      if(UserId.toString()== "" || Latitude.toString() == "" || Longitude.toString() == "" || DateTime.toString() == "") 
      { 
       Toast.makeText(getApplicationContext(), "Data Not Saved !!!! Please select appropriate data to save", Toast.LENGTH_SHORT).show(); 
      } 


      new ServiceLogin().execute(UserId, Latitude, Longitude, DateTime); 

     } 
    }); 

    // Download JSON file AsyncTask 
    new DownloadJSON().execute(); 
} 
    // Download JSON file AsyncTask 
private class DownloadJSON extends AsyncTask<Void, Void, Void> 
{ 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     progressDialog = new ProgressDialog(MainActivity.this); 
     progressDialog.setMessage("Fetching Users....!"); 
     progressDialog.setCancelable(false); 
     progressDialog.show(); 

    } 

    @Override 
    protected Void doInBackground(Void... params) { 

     // Locate the Users Class 
     users = new ArrayList<Users>(); 

     // Create an array to populate the spinner 
     userList = new ArrayList<String>(); 
     // http://10.0.2.2:8000/MobileApp/index.php 
     //http://10.0.2.2:8000/app/web/users/ 
     //http://192.168.100.8:8000/app/web/users/ 
     // JSON file URL address 
     jsonObject = JSONfunctions.getJSONfromURL("http://192.168.100.9:8000/MobileApp/GET_DATA.php"); 

     try 
     { 
      JSONObject jobj = new JSONObject(jsonObject.toString()); 
      // Locate the NodeList name 
      jsonArray = jobj.getJSONArray("users"); 

      for(int i=0; i<jsonArray.length(); i++) 
      { 
       jsonObject = jsonArray.getJSONObject(i); 

       Users user = new Users(); 

       user.setId(jsonObject.optString("Id")); 
       user.setName(jsonObject.optString("Name")); 
       users.add(user); 

       userList.add(jsonObject.optString("Name")); 

      } 
     } catch (JSONException e) { 
      Log.e("Error", e.getMessage()); 
      e.printStackTrace(); 
     } 


     return null; 
    } 

    @Override 
    protected void onPostExecute(Void args) 
    { 
     // Locate the spinner in activity_main.xml 
     Spinner spinner = (Spinner)findViewById(R.id.spinner); 

     // Spinner adapter 
     spinner.setAdapter(new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_spinner_dropdown_item, userList)); 

     // Spinner on item click listener 

     spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 


      @Override 
      public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 

       textViewResult = (TextView)findViewById(R.id.textView); 

       // Set the text followed by the position 

       textViewResult.setText("Hi " + users.get(position).getName() + " your ID is " + users.get(position).getId()); 
       UserId = String.valueOf(users.get(position).getId()); 
       progressDialog.dismiss(); 
       _latitude.setText(""); 
       _longitude.setText(""); 
       Latitude = null; 
       Longitude= null; 

      } 

      @Override 
      public void onNothingSelected(AdapterView<?> parent) { 
       textViewResult.setText(""); 
      } 
     }); 
    } 


} 

Wie ich Neuling bin, so dass ich weiß nicht, was in zu tun php Skript und was in meinem Android-Code zu tun :(. Es wäre sehr hilfreich, wenn mich jemand führen oder mir ein Tutorial geben könnte, dem ich folge.

Jede Hilfe würde sehr geschätzt werden.

Antwort

7

Um Ihre APIs zu sichern, benötigen Sie einen Mechanismus, um zu erkennen, dass die Anfrage an die API von einer vertrauenswürdigen Quelle stammt. Viele Frameworks verfügen standardmäßig über diese Funktion.

auch immer Sie gerade JSON Web Tokens (jwt) mit PHP verwenden können

Erfahren Sie mehr über Token-basierte Authentifizierung von this page Berechtigung Ihre api fordert hinzuzufügen.

Schauen Sie sich simple tutorial an, wie Sie Ihre PHP API Endpunkte mit JWT sichern können.

Wenn Sie noch mehr Sicherheit benötigen, können Sie der API den OAuth-Providerdienst hinzufügen. Schauen Sie sich diesen Beitrag auf how to write OAuth provider in PHP

3

Die einzige Methode, um Ihre API zu sichern ist Ihre Android-Anfrage einzigartig zu machen. Sammeln Sie spezifischere Daten aus Ihrer App.

1 - Get Android Eindeutige ID -

String UniqueID=Secure.getString(getActivity().getContentResolver(),Secure.ANDROID_ID); 

und geben es durch Ihre api Eg.

http://192.168.100.9:8000/MobileApp/GET_DATA.php?yourvalue=something&id=UniqueID 

In Ihrem php, Zugriff verweigern, wenn es keine eindeutige Android-ID (sollte mit komplexen Variablennamen ändern).ZB:

if($_REQUEST['UniqueID']=="" || strlen($_REQUEST['UniqueID'])<9){ //do something about abuse }else{ //your code } 

2 - Erstellen Sie Ihre eigene Zufallsvariable in Android App

Ihre eigene Variable erstellen, zu entscheiden, die Anforderung kommt, um sicherzustellen, aus der App zB:

Random r = new Random(); 
int i1 = r.nextInt(9999 - 1000) + 1000; 

Und übergeben Sie diesen Wert auch über Ihre Anfrage und validieren Sie, wenn es um PHP geht.

if($_REQUEST['r']>=1000 && $_REQUEST['r']<=9999){//} 

Anfrage ablehnen, wenn kein oder falscher Wert übergeben wird.

3 - kostenlos besten PHP-Bibliothek http://mobiledetect.net/ prüfen zu verwenden, um eine Empfehlung, ob es von Android ist und schreiben verweigern Funktion auf ungültige Mißbräuche Stellen Sie sicher, Anfragen kommen aus Android

ich will.

4 - Validieren Anfrage per User-Agent-String in PHP

$agent = $_SERVER['HTTP_USER_AGENT']; 
$agent=strtolower($agent); 

if (strpos($agent, 'android') !== false) { 
$os = 'Android'; 
} 

Und verweigern, wenn nicht von Android in PHP.

5 - Nehmen Sie die Angreifer

Sie müssen verfolgen, wenn jemand eine Ihrer obigen Wertpapiere zu brechen. Derzeit verwende ich ip-api.com, um Angreifer zu verfolgen.

müssen Sie verweigern Funktion mit mysql einfügen schreiben. nach ip-api, werden Sie

1- Attackers' ip
2- Attackers' Geolocation
3- Attackers' ISP

So erhalten Sie können sie statisch verweigern.

Es ist ungefähr sicher, Ihre API von Android zu verwenden und PC-Anfragen fast abgelehnt. Aber drei ist eine Chance, Ihre App mit Reverse-Engineering wie Dex2jar oder ShowJava zu brechen und Ihre einfache Datenstruktur zu greifen. Als Programmierer sind die obigen Funktionen und Codes sehr einfach für sie und sie werden mit falschen Dateneingaben reinkommen.

Also sollten Sie kein Programm mit statischen Werten schreiben, so wichtig Link "http://192.168.100.9:8000/MobileApp/GET_DATA.php" wie hart codiert wie in Ihrer App. Sie sollten Daten teilen, einfach verschlüsseln und erhalten alle Ihre wichtigsten URLs dynamisch wie oben gesicherte PHP/MySQL API-Methode.

Wenn Sie wie ein 2-stufiges dynamisches System arbeiten, gibt es sehr wenige Möglichkeiten, in Ihrem System zu brechen.
Ich habe noch eine wichtige Anmerkung zu sagen, wenn Sie für geschlossene Gruppe von Benutzern verwenden, sollten Sie request-> genehmigen System für jeden Benutzer für die erste Zeit App-Registrierung mit ihrer eindeutigen ID und leicht den Zugriff von den anderen verweigern.

0

sichern Sie die APIs, um von einer dritten Partei zugegriffen werden, ist eine große Domäne zu diskutieren.Der am häufigsten verwendete Mechanismus zum Sichern von APIs ist die tokenbasierte Zugriffssteuerung. Es kann auf viele Arten implementiert werden.

1. Sie müssen verstehen, wie es funktioniert. Siehe hierzu link und link.

Dann versuchen Sie zu sehen, wie Sie es implementieren.

Working example of implementing 'Token Based Authentication' using 'JSON Web Token (i.e. JWT)' in PHP and MySQL?

Wenn Sie weitergehende Beispiel dieses link versuchen, so gut.

Wenn Sie weitere Informationen benötigen, lassen Sie es mich wissen.

0

Verwenden Sitzungssteuerungsmechanismus alle oben genannten Methoden sprechen auch für das gleiche. In einfachen Worten verschlüsselten privaten Schlüssel verwenden, um die gültige Quelle

kann
0
I will simply say, 

If you already using PHP OPP, then no need to go with any framework. It will be time consuming for you. 
Solution is: "Use remember_token system as like laravel and yii. Authenticate to each method before filter." 

If you are using Core PHP. Try same code and include it before filter each method in your api 
0

Sie zu erkennen, wählen Sie die Authentifizierung für PHP hier:

http://pear.php.net/packages.php?catpid=1&catname=Authentication

Ich denke, dass Basic oder Digest Auth (+ https: // SSL mit selbstsigniertem Zertifikat) ist gut für Sie wählen Rest-Service (PHP RESTful JSON API).

Für Android-Anwendung Ich denke, das Beste für RestClient Bibliothek wählen ist:

http://square.github.io/retrofit/

(Ich empfehle Ihnen nur -Java in einer Sprache alle Quellcode halten Sie einfach Java Rest Service erstellen und Frühling hinzufügen. Sicherheitsauthentifizierung)

Verwandte Themen