web-dev-qa-db-ja.com

ByetHostサーバーがJSON文字列を使用してHTML値「ブラウザをチェックしています」を渡す

Json文字列をAndroidに解析しようとすると、HTML値が渡されます。一日の前にすべてがうまくいき、phpファイルの助けを借りてデータベースをフェッチしようとすると、突然アプリがクラッシュし始めました。

チェックしたところ、htmlの値に気づきました。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

これは、byethostサーバーでホストしているすべてのページで発生していますが、他のサーバーでホストしているページは問題なく機能しています。私は自分のファイルの1つを他のサーバーに移動しようとしたところ、適切なjson文字列が返されました。

また、ブラウザでURLを確認すると、例外やエラーなしで適切なjson文字列が返されますが、AndroidではHTML値が表示されます。

ここに私の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;
}
}

そして、これは私の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));
?>
13
Malav Shah

上記の問題を回避するための回避策であるため、以下を回答として追加する必要があります。それが誰かを助けるかもしれないので、投稿する:

この問題は単にexit();と書くことで解決できます。最後の実行可能ステートメントのphpファイル内。これは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));
exit();
?>
0
Malav Shah

解決しました!

Byethostを使用して、同じPHPサーバーからJSONデータを取得しました。testcookie-nginx-モジュール

リチャードの answer が言うように:

主な問題は、Byet Hostがtestcookie-nginx-moduleという名前のシンプルなセキュリティアンチボットモジュールを実装していることです。

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

彼が提供したリンクでは、testcookie-nginx-moduleが2段階の検証を行うことがわかります。

  1. 最初にHTTPリクエストが行われると、モジュールは期待しているJSONではなくJavaScriptを返します。このスクリプトはクライアント(通常はWebブラウザー)で実行され、AESキーを含む検証Cookieを生成します。

サーバーから受け取ったスクリプトは次のとおりです。

<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. スクリプトは検証Cookieをドキュメントに追加し、実際にアクセスしたいURLにリダイレクトします。 testcookie-nginx-moduleはCookieのAESキーを検証し、アクセスしたいJSONデータで応答するURLにリクエストをヒットさせます。

次のHTTPリクエストでは、クライアントはCookieを保存し、ステップ1をスキップしてリクエストに追加します。

ソリューションAndroid App

Webブラウザーから取得してCookieの生成をスキップし、Android HTTPリクエストに直接追加します(もちろん、生成に関与したくない場合を除きます)。

WebブラウザからCookieを取得する前に、ブラウザでURLに少なくとも1回アクセスして、URLを生成したことを確認してください。

  • WebブラウザーからCookieキーを取得します。私はGoogleを使用しましたChromeそのため:

    1. ブラウザの右上隅にあるChromeメニューから、Settingsを選択します。
    2. ページの下部にあるShow advanced settings ...をクリックします。
    3. プライバシーの下で、コンテンツ設定...を選択します。
    4. すべてのCookieとサイトデータ...を選択します。
    5. あなたのウェブサイト名を検索します。 「byethost」を検索すると見つかります。
    6. __ testという名前のCookieを開き、contentpathおよび有効期限
  • AndroidアプリにCookieを設定します。コードでは次のようになります。

    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();
    }
    }
    

以上です。これで、アプリがHTTPリクエストを行うたびに、testcookie-nginx-moduleを渡すためのCookieが含まれ、JSONデータが取得されます。

これがお役に立てば幸いです。

よろしく

25
Sebastian Mora

主な問題は、Byet Hostがtestcookie-nginx-moduleという名前のシンプルなセキュリティアンチボットモジュールを実装していることです。

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

これによりアプリがクラッシュします

5
Richard

これは、不要なボットを防止するために無料ホスティングに新しく導入されたボット検出機能です。これは、ページに初めてアクセスしたときにのみ表示されます。

たとえば、/ upper_respiratory_infection.htm?ckattempt = 1は、8月8日から11月の間にWeb分析によって37回登録されました。これにより、各ページの2つのデータセット(およびCKattempt = 1のないものと、アドオンCKattempt = 2のあるものもいくつかあります)

残念ながらこれは削除できません

詳細

0
Adiii