web-dev-qa-db-fra.com

Serveur ByetHost transmettant des valeurs html "Vérification de votre navigateur" avec JSON String

Tout en essayant d’analyser json string avec Android, les valeurs HTML sont transmises . Avant un jour, tout fonctionnait bien et, tout à coup, mon application se bloque lorsque je tente de récupérer la base de données à l’aide de fichiers php.

Quand j’ai vérifié, j’ai remarqué que les valeurs html .. Voir logcat

08-10 01:09:55.814: E/result(6744): <html><body><h2>Checking your browser..<h2><script type="text/javascript" src="/aes.js" ></script><script>function toNumbers(d){var e=[];d.replace(/(..)/g,function(d){e.Push(parseInt(d,16))});return e}function toHex(){for(var d=[],d=1==arguments.length&&arguments[0].constructor==Array?arguments[0]:arguments,e="",f=0;f<d.length;f++)e+=(16>d[f]?"0":"")+d[f].toString(16);return e.toLowerCase()}var a=toNumbers("f655ba9d09a112d4968c63579db590b4"),b=toNumbers("98344c2eee86c3994890592585b49f80"),c=toNumbers("7965e114a1dccaf35af3756261f75ad8");document.cookie="__test="+toHex(slowAES.decrypt(c,2,a,b))+"; expires=Thu, 31-Dec-37 23:55:55 GMT; path=/";location.href="http://realroom.byethost24.com/medical/stokist.php?ckattempt=1";</script></body></html>
08-10 01:09:55.814: E/JSON Parser(6744): Error parsing data org.json.JSONException: Value <html><body><h2>Checking of type Java.lang.String cannot be converted to JSONObject
08-10 01:09:55.816: E/AndroidRuntime(6744): FATAL EXCEPTION: AsyncTask #1
08-10 01:09:55.816: E/AndroidRuntime(6744): Process: com.example.medionline, PID: 6744
08-10 01:09:55.816: E/AndroidRuntime(6744): Java.lang.RuntimeException: An error occured while executing doInBackground()
08-10 01:09:55.816: E/AndroidRuntime(6744):     at Android.os.AsyncTask$3.done(AsyncTask.Java:304)
08-10 01:09:55.816: E/AndroidRuntime(6744):     at Java.util.concurrent.FutureTask.finishCompletion(FutureTask.Java:355)
08-10 01:09:55.816: E/AndroidRuntime(6744):     at Java.util.concurrent.FutureTask.setException(FutureTask.Java:222)
08-10 01:09:55.816: E/AndroidRuntime(6744):     at Java.util.concurrent.FutureTask.run(FutureTask.Java:242)
08-10 01:09:55.816: E/AndroidRuntime(6744):     at Android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.Java:231)
08-10 01:09:55.816: E/AndroidRuntime(6744):     at Java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.Java:1112)
08-10 01:09:55.816: E/AndroidRuntime(6744):     at Java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.Java:587)
08-10 01:09:55.816: E/AndroidRuntime(6744):     at Java.lang.Thread.run(Thread.Java:818)
08-10 01:09:55.816: E/AndroidRuntime(6744): Caused by: Java.lang.NullPointerException: Attempt to invoke virtual method 'Java.lang.String org.json.JSONObject.toString()' on a null object reference
08-10 01:09:55.816: E/AndroidRuntime(6744):     at com.example.medionline.All_supplier_list$FetchMFG.doInBackground(All_supplier_list.Java:182)
08-10 01:09:55.816: E/AndroidRuntime(6744):     at com.example.medionline.All_supplier_list$FetchMFG.doInBackground(All_supplier_list.Java:1)
08-10 01:09:55.816: E/AndroidRuntime(6744):     at Android.os.AsyncTask$2.call(AsyncTask.Java:292)
08-10 01:09:55.816: E/AndroidRuntime(6744):     at Java.util.concurrent.FutureTask.run(FutureTask.Java:237)
08-10 01:09:55.816: E/AndroidRuntime(6744):     ... 4 more

Cela se produit pour toutes les pages que j'ai hébergées sur le serveur byethost, alors que les pages hébergées sur un autre serveur fonctionnent bien. J'ai essayé de déplacer l'un de mes fichiers sur un autre serveur et sur celui-ci, il renvoie la chaîne json appropriée.

De plus, lorsque je vérifie l'URL dans le navigateur, il renvoie la chaîne JSON correcte sans exception ni erreur avec byethost .. mais dans Android en donnant des valeurs html ..

Voici ma classe JSONfunction

package com.example.medionline;
import Java.io.BufferedReader;
import Java.io.IOException;
import Java.io.InputStream;
import Java.io.InputStreamReader;
import Java.io.UnsupportedEncodingException;
import Java.util.List;

import org.Apache.http.HttpEntity;
import org.Apache.http.HttpResponse;    
import org.Apache.http.NameValuePair;
import org.Apache.http.client.ClientProtocolException;
import org.Apache.http.client.HttpClient;
import org.Apache.http.client.entity.UrlEncodedFormEntity;
import org.Apache.http.client.methods.HttpGet;
import org.Apache.http.client.methods.HttpPost;
import org.Apache.http.client.utils.URLEncodedUtils;
import org.Apache.http.impl.client.DefaultHttpClient;
import org.json.JSONException;
import org.json.JSONObject;

import Android.util.Log;

public class JSONfunctions
{

     static InputStream is = null;
 static String result = "";
 static JSONObject jArray = null;
public static JSONObject getJSONfromURL(String url) 
{
    // Download JSON data from URL
    try 
    {
        HttpClient httpclient = new DefaultHttpClient();
        HttpPost httppost = new HttpPost(url);
        httppost.setHeader("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.10240 ");
        HttpResponse response = httpclient.execute(httppost);
        HttpEntity entity = response.getEntity();
        is = entity.getContent();
    } 
    catch (Exception e) 
    {
        Log.e("log_tag", "Error in http connection " + e.toString());
    }

    try 
    {
        BufferedReader reader = new BufferedReader(new InputStreamReader(is, "iso-8859-1"), 8);
        StringBuilder sb = new StringBuilder();
        String line = null;
        while ((line = reader.readLine()) != null) 
        {
            Log.e("jsonnnnnnn", line);
            sb.append(line + "\n");
        }
        is.close();
        result = sb.toString();
        Log.e("result", result);
    } 
    catch (Exception e) 
    {
        Log.e("log_tag", "Error converting result " + e.toString());
    }
    try 
    {
        jArray = new JSONObject(result);
    } 
    catch (JSONException e)
    {
        Log.e("log_tag", "Error parsing data " + e.toString());
    }
    return jArray;
}

public static JSONObject makeHttpRequest(String loginUrl, String post, List<NameValuePair> para)
{
    try 
    {
        if(post == "POST")
        {
            HttpClient httpClient = new DefaultHttpClient();
            HttpPost httpPost = new HttpPost(loginUrl);
            httpPost.setEntity(new UrlEncodedFormEntity(para));
            httpPost.setHeader("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.10240 ");
            HttpResponse httpResponse = httpClient.execute(httpPost);
            HttpEntity httpEntity = httpResponse.getEntity();
            is = httpEntity.getContent();

        }
        else if(post == "GET")
        {
            HttpClient httpClient = new DefaultHttpClient();
            String paramString = URLEncodedUtils.format(para, "utf-8");
            loginUrl += "?" + paramString;
            HttpGet httpGet = new HttpGet(loginUrl);
            HttpResponse httpResponse = httpClient.execute(httpGet);
            HttpEntity httpEntity = httpResponse.getEntity();
            is = httpEntity.getContent();
        }
    }
    catch (UnsupportedEncodingException e)
    {
        e.printStackTrace();
    }
    catch (ClientProtocolException e)
    {
        e.printStackTrace();
    }
    catch (IOException e)
    {
        e.printStackTrace();
    }
    try 
    {
        BufferedReader reader = new BufferedReader(new InputStreamReader(is, "utf-8"), 8);
        StringBuilder sb = new StringBuilder();
        String line = null;
        if (is != null) 
        {
            while ((line = reader.readLine()) != null) 
            {
                //Log.e("jsonnnnnnn", line);
                sb.append(line + "\n");
            }
            is.close();
            result = sb.toString();
            Log.e("result", result);
        }
    }
    catch (Exception e)
    {
        Log.e("Buffer Error", "Error converting result " + e.toString());
    }
    try
    {
        jArray = new JSONObject(result);
    }
    catch (JSONException e)
    {
        Log.e("JSON Parser", "Error parsing data " + e.toString());
    }
    return jArray;
}
}

Et voici mon fichier PHP

<?php
include('config.php');
date_default_timezone_set("Asia/Calcutta");

$result1 = mysqli_query($con,"SELECT  *
                                    FROM  `pj_medionline_mst_stockist` 
                                    ORDER BY  `pj_medionline_mst_stockist`.`ID` ASC ");


$response = array();
$posts = array();
while($row=mysqli_fetch_array($result1))
{
    $id =$row["ID"];
    $stkcode =$row["stkcode"];
    $comName =$row["ComName"];
    $operatorid =$row["operatorid"];
    $password =$row["Password"];


    $posts[] = array('id'=>$id, 'stkcode'=>$stkcode, 'stkname'=>$comName, 'operatorid'=>$operatorid, 'password'=>$password);
}

$response['stokist'] = $posts;
print(json_encode($response));
?>
10
Malav Shah

Je devrais ajouter ce qui suit comme réponse car il s’agit de la solution de contournement pour contourner le problème ci-dessus. Publier comme cela pourrait aider quelqu'un:

Ce problème peut être résolu en écrivant simplement exit (); dans le fichier php à la dernière instruction exécutable. Cela va quitter le fichier php et ne va pas ajouter le texte .

<?php
include('config.php');
date_default_timezone_set("Asia/Calcutta");

$result1 = mysqli_query($con,"SELECT  *
                                FROM  `pj_medionline_mst_stockist` 
                                ORDER BY  `pj_medionline_mst_stockist`.`ID` ASC ");


$response = array();
$posts = array();
while($row=mysqli_fetch_array($result1))
{
    $id =$row["ID"];
    $stkcode =$row["stkcode"];
    $comName =$row["ComName"];
    $operatorid =$row["operatorid"];
    $password =$row["Password"];


    $posts[] = array('id'=>$id, 'stkcode'=>$stkcode, 'stkname'=>$comName, 'operatorid'=>$operatorid, 'password'=>$password);
}

$response['stokist'] = $posts;
print(json_encode($response));
exit();
?>
0
Malav Shah

Résolu!

J'ai eu le même problème en utilisant Byethost pour récupérer les données JSON de mon serveur PHP. Nous avons juste besoin d'ajouter un cookie à la requête HTTP pour passer le testcookie-nginx-module

Comme le dit réponse de Richard:

Le principal problème est que Byet Host implémente un module simple de sécurité anti-virus> nommé testcookie-nginx-module

_ { https://kyprizel.github.io/testcookie-nginx-module/ } _

Sur le lien qu'il a fourni, nous pouvons voir que le testcookie-nginx-module effectue une validation en 2 étapes:

  1. La première fois qu'une requête HTTP est effectuée, le module renvoie un code javascript au lieu du code JSON attendu. Ce script est exécuté sur le client (typiquement un navigateur Web) et génère un cookie de validation contenant une clé AES. 

Voici le script que j'ai reçu de mon serveur:

<html>
<body>
    <script type="text/javascript" src="/aes.js" ></script>
    <script>
        function toNumbers(d){
        var e=[];
            d.replace(/(..)/g,function(d){
                e.Push(parseInt(d,16))});
            return e
        }
        function toHex(){
            for(var d=[],d=1==arguments.length&&arguments[0].constructor==Array?arguments[0]:arguments,e="",f=0;f<d.length;f++)
                e+=(16>d[f]?"0":"")+d[f].toString(16);
                return e.toLowerCase()
        }
        var a=toNumbers("f655ba9d09a112ffff8c63579db590b4"),
            b=toNumbers("98344c2eee86c3ffff90592585b49f80"),
            c=toNumbers("1286963467aa92ffff8323bdca0d7be9");
        document.cookie="__test="+toHex(slowAES.decrypt(c,2,a,b))+"; expires=Thu, 31-Dec-37 23:55:55 GMT; path=/"; 
        location.href="http://myserver.byethost8.com/myPhpPage.php?i=1";
    </script>
    <noscript>This site requires Javascript to work, please enable Javascript in your browser or use a browser with Javascript support</noscript>
</body>

  1. Le script ajoute le cookie de validation au document et le redirige vers l'URL à laquelle nous voulons réellement accéder. Le testcookie-nginx-module valide la clé AES du cookie et laisse la demande accéder à l'URL qui répondra avec les données JSON auxquelles nous voulons accéder.

Sur les demandes HTTP suivantes, le client aura stocké le cookie et l'ajoutera à la demande en ignorant l'étape 1. 

Solution pour notre application Android

Nous allons ignorer la génération de cookies en le récupérant à partir d'un navigateur Web et en l'ajoutant directement à notre requête HTTP Android (à moins bien sûr que vous souhaitiez vous impliquer dans sa création).

Avant d’obtenir le cookie du navigateur Web, assurez-vous d’avoir accédé à l’URL au moins une fois avec le navigateur pour le générer.

  • Obtenir la clé de cookie à partir du navigateur Web. J'ai utilisé Google Chrome pour cela:

    1. Dans le menu Chrome situé dans le coin supérieur droit du navigateur, sélectionnez Paramètres.
    2. Au bas de la page, cliquez sur Afficher les paramètres avancés ....
    3. Sous Confidentialité, sélectionnez Paramètres du contenu ....
    4. sélectionnez Tous les cookies et les données du site ....
    5. Recherchez votre nom de site Web. En cherchant "byethost", vous le trouverez.
    6. Ouvrez le cookie nommé __test et copiez les valeurs de contenu, chemin et expire.
  • Définir le cookie sur notre application Android. Sur votre code devrait être quelque chose comme:

    try 
    {
     if(post == "POST")
     {
         HttpClient httpClient = new DefaultHttpClient();
         HttpPost httpPost = new HttpPost(loginUrl);
         httpPost.setEntity(new UrlEncodedFormEntity(para));
         httpPost.setHeader("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.10240 ");
         httpPost.addHeader("Cookie", "__test=THE_CONTENT_OF_YOUR_COOKIE_HERE; expires=Thu, 31-Dec-37 23:55:55 GMT; path=/");
         HttpResponse httpResponse = httpClient.execute(httpPost);
         HttpEntity httpEntity = httpResponse.getEntity();
         is = httpEntity.getContent();
    }
    else if(post == "GET")
    {
        HttpClient httpClient = new DefaultHttpClient();
        String paramString = URLEncodedUtils.format(para, "utf-8");
        loginUrl += "?" + paramString;
        HttpGet httpGet = new HttpGet(loginUrl);
        httpGet.addHeader("Cookie", "__test=THE_CONTENT_OF_YOUR_COOKIE_HERE; expires=Thu, 31-Dec-37 23:55:55 GMT; path=/");
        HttpResponse httpResponse = httpClient.execute(httpGet);
        HttpEntity httpEntity = httpResponse.getEntity();
        is = httpEntity.getContent();
    }
    }
    

Et c'est tout. Désormais, chaque fois que l'application envoie une requête HTTP, elle inclut le cookie permettant de transmettre le testcookie-nginx-module et récupère vos données JSON.

J'espère que cela aide et qu'il n'est pas trop tard.

Cordialement

21
Sebastian Mora

Le principal problème est que Byet Host implémente un module de sécurité simple, appelé testcookie-nginx-module

https://kyprizel.github.io/testcookie-nginx-module/

Cela fait planter votre application

4
Richard

Ceci est une fonctionnalité nouvellement introduite de détection de bots sur l'hébergement gratuit pour empêcher les robots indésirables. Cela n'apparaît que lors de la première visite sur la page. 

Par exemple, /upper_respiratory_infection.htm?ckattempt=1 a été enregistré 37 fois par mes analyses Web entre le 8 et le 11 août. Il cause des ravages dans mes analyses Web puisque je collecte actuellement deux ensembles de données pour chaque page un sans CKattempt = 1, et quelques-uns portant même le complément CKattempt = 2)

Cela ne peut pas être supprimé malheureusement

pour plus de détail

0
Adiii