-1

データベースを検索し、ホストされている JSON を返す PHP に SQL ステートメントを送信するアプリを作成しています。

現在、私のアプリではこのステートメントを渡しています。SentenciaFinal には次の値もあります。

SELECT Nombre FROM Tierra WHERE Nivel <=1 AND CDE <=1000 AND VDE <=1000 AND Coste <=1000 AND Ataque <=1000 AND Defensa<=1000

エラーは次のとおりです。

10-25 16:12:36.201: E/ServicioRest(1240): Error!
10-25 16:12:36.201: E/ServicioRest(1240): java.lang.IllegalArgumentException: Illegal    character in query at index 80:   http://proyectosccv.zz.mu/AppAndroid/phps/ConsultaHabilidad.php?sentencia=SELECT Nombre FROM Tierra WHERE Nivel <=1 AND CDE <=1000 AND VDE <=1000 AND Coste <=1000 AND Ataque <=1000 AND Defensa<=1000
10-25 16:12:36.201: E/ServicioRest(1240):   at java.net.URI.create(URI.java:727)
10-25 16:12:36.201: E/ServicioRest(1240):   at org.apache.http.client.methods.HttpGet.<init>(HttpGet.java:75)
10-25 16:12:36.201: E/ServicioRest(1240):   at browser.habilidades.Busqueda.colocarList(Busqueda.java:63)
10-25 16:12:36.201: E/ServicioRest(1240):   at browser.habilidades.Busqueda.onCreate(Busqueda.java:40)
10-25 16:12:36.201: E/ServicioRest(1240):   at android.app.Activity.performCreate(Activity.java:5104)
10-25 16:12:36.201: E/ServicioRest(1240):   at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
10-25 16:12:36.201: E/ServicioRest(1240):   at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
10-25 16:12:36.201: E/ServicioRest(1240):   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
10-25 16:12:36.201: E/ServicioRest(1240):   at android.app.ActivityThread.access$600(ActivityThread.java:141)
10-25 16:12:36.201: E/ServicioRest(1240):   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
10-25 16:12:36.201: E/ServicioRest(1240):   at android.os.Handler.dispatchMessage(Handler.java:99)
10-25 16:12:36.201: E/ServicioRest(1240):   at android.os.Looper.loop(Looper.java:137)
10-25 16:12:36.201: E/ServicioRest(1240):   at android.app.ActivityThread.main(ActivityThread.java:5041)
10-25 16:12:36.201: E/ServicioRest(1240):   at java.lang.reflect.Method.invokeNative(Native Method)
10-25 16:12:36.201: E/ServicioRest(1240):   at java.lang.reflect.Method.invoke(Method.java:511)
10-25 16:12:36.201: E/ServicioRest(1240):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
10-25 16:12:36.201: E/ServicioRest(1240):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
10-25 16:12:36.201: E/ServicioRest(1240):   at dalvik.system.NativeStart.main(Native Method)

そして、私が実行するコードは次のとおりです。

private void colocarList(String SentenciaFinal) {
 try {


 HttpGet peticion = new HttpGet(
                           "http://proyectosccv.zz.mu/AppAndroid/phps/ConsultaHabilidad.php?sentencia="+SentenciaFinal);

            peticion.setHeader("content-type", "application/json");

            HttpClient httpClient = new DefaultHttpClient();
            HttpResponse resp = httpClient.execute(peticion);
            String respStr = EntityUtils.toString(resp.getEntity());

            JSONArray resparray = new JSONArray(respStr);

            int n = resparray.length();

            NombreHabilidades = new String[n];

            for (int i = 0; i < resparray.length(); i++) {
                    JSONObject respJSON = resparray.getJSONObject(i);

                    String nombre = respJSON.getString("Nombre");
                    NombreHabilidades[i] = nombre;
            }

            // Rellenamos la lista con los resultados
            ArrayAdapter<String> adaptador = new ArrayAdapter<String>(this,
                            android.R.layout.simple_list_item_1, NombreHabilidades);
            list.setAdapter(adaptador);


    } catch (Exception ex) {
            Log.e("ServicioRest", "Error!", ex);
    }

}

インターネット接続許可を与えたjsonとアプリの操作方法を知っています。

何かあったという判断ミスだと思いますが、確かではありません。

どうもありがとうございました!= D

4

2 に答える 2

0

URIに変換

URI uri = new URI(
    "http", 
    "proyectosccv.zz.mu", 
    "/AppAndroid/phps/ConsultaHabilidad.php?sentencia=SELECT Nombre FROM Tierra WHERE Nivel <=1 AND CDE <=1000 AND VDE <=1000 AND Coste <=1000 AND Ataque <=1000 AND Defensa<=1000",
    null);
HttpGet peticion = new HttpGet(uri );
于 2013-10-25T16:35:32.977 に答える
0

ここでの回答は、PHP スクリプトを呼び出す技術的な側面に対処する場合がありますが、ここではセキュリティに対処します。次のようなリンクがあります。

http://domain.com/dir/phpfile.php?sql=SELECT Foo, Bar FROM...

これは重大なセキュリティ上の欠陥です。ユーザーが以下を読み込んでいると想像してください:

http://domain.com/dir/phpfile.php?sql=DROP TABLE FooTable;

これは、この記事の執筆中に誰かが行ったように、SQL テーブルを破壊します

私はこれを完全に再考します。パラメーターを受け入れ、フィルター処理後に SQL クエリに追加する必要があります。

http://domaim.com/dir/phpfile.php?getitem=FooItem

次のようになります。

SELECT SomeCol from SomeTable WHERE SomeOtherCol='FooItem'

これは、最も単純なケースでは、最後に区切り文字としてSELECT SomeCol FROM SomeTable WHERE SomeOtherCol='リクエスト文字列を使用してリクエストを連結することによって行われます。'

ただし、これは、パーティーが要求する「Sql インジェクション」と呼ばれるものを使用したハッキン​​グの可能性があります。

http://domaim.com/dir/phpfile.php?getitem=FooItem'; DROP TABLE FooTable; --

それでもテーブルをドロップします。この使用を次のように修正するmysqli::real_escape_stringには

$filteredString = $db->realEscapeString($unsanitizedString);

次に、フィルタリングされた文字列を連結します。

于 2013-10-25T16:54:54.437 に答える