Conexión Android MySQL remoto

kraneok

Hola buenos días, voy a lanzar una preguntilla sobre el título.

Actualmente ando indagando un poco en el tema de bases de datos remotas desde Android.
De momento solo uso MySQL, pues es el motor de base de datos que mas tiempo le llevo echado y con el que mas he trabajado, además que lo veo como uno de los que mas trabajan en sus APIS para otras plataformas.

Bien, la pregunta es la siguiente.
Para conectar MySQL desde Android tengo un "webservice" en PHP, en realidad son clases que reciben datos por POST realizan la petición y devuelven valores codeados a json, que es lo que recibe la aplicación de la terminal móvil.

Lo que es la seguridad de acceso a la base de datos es lo que me vuelve un poco loco, me refiero a loco por aún no sé como es de seguro ese sistema, es decir, la password de la bbdd está en los php si y el user también, pero hay posibilidad de que algún tramer la intente ver?

Aparte de los apartes, si me pusiesen un sniffer entre la terminal y la capa bbdd seguro que captarían algunas estructuras de tablas.

¿ Como se encripta información desde android ?¿ Qué método utiliza para ello ?¿ Estoy totalmente equivocado y con eso basta ?

Abridme los ojos, pues en google no encuentro solución, quizás mis keyword no son de lo mas ajustadas.

Gracias de antemano!.

elkaoD

"Para conectar MySQL desde Android tengo un "webservice" en PHP..."

Genial, es la opción correcta.

"la password de la bbdd está en los php si y el user también, pero hay posibilidad de que algún tramer la intente ver?"

Hombre, la posibilidad está ahí si encuentran un bug (por ejemplo, si logran acceder al fuente de tu .php) pero en principio es seguro.

"si me pusiesen un sniffer entre la terminal y la capa bbdd seguro que captarían algunas estructuras de tablas."

¿Estás pidiendo las tablas al MySQL a mano? Mala idea. Tienes que abstraerlo: tu terminal no debe saber de tablas, sólo del modelo que espera (lo que viene en JSON).

"¿ Como se encripta información desde android ?¿ Qué método utiliza para ello ?"

Por defecto de ninguna forma. Puedes encriptarlo usando HTTPS para acceder al JSON o encriptando por tu cuenta, pero da un poco igual. Graba a fuego esta frase en tu mente: si tu aplicación puede leer algo, un hacker también podrá por mucho que entremedias lo encriptes. En algún momento lo tendrás que desencriptar para leerlo y ahí será cuando el hacker pueda echar un ojo también.

La seguridad por oscuridad NO es seguridad. Haz tu aplicación teniendo como base que el cliente puede leer todo, sé transparente, y basa tu seguridad en ello.

2 1 respuesta
kraneok

#2 Después de esta caída...muchísimas gracias por tus respuesta, realmente me tranquilizan.

De todos modos te específico sobre esta:

"si me pusiesen un sniffer entre la terminal y la capa bbdd seguro que captarían algunas estructuras de tablas."

¿Estás pidiendo las tablas al MySQL a mano? Mala idea. Tienes que abstraerlo: tu terminal no debe saber de tablas, sólo del modelo que espera (lo que viene en JSON).

Como he dicho, el PHP recibe unos datos por POST desde Android, y la consulta está montada en el PHP, después de realizar las consultas y hacer todo lo que tenga que hacer el PHP devuelve lo que tenga que devolver en JSON.

Véase

PHP

<?php

/*
 * Following code will create a new product row
 * All product details are read from HTTP Post Request
 */

// array for JSON response
$response = array();

// check for required fields
if (isset($_POST['nombre']) && isset($_POST['cedula']) && isset($_POST['apellido'])) {
    
$nombre = $_POST['nombre']; $cedula = $_POST['cedula']; $apellido = $_POST['apellido']; $sueldo = $_POST['sueldo']; // include db connect class require_once __DIR__ . '/db_connect.php'; // connecting to db $db = new DB_CONNECT(); // mysql inserting a new row $result = mysql_query("INSERT INTO empleados(cedula, nombre, apellido, sueldo) VALUES('$cedula', '$nombre', '$apellido', '$sueldo')"); // check if row inserted or not if ($result) { // successfully inserted into database $response["success"] = 1; $response["message"] = "Empleado successfully created."; // echoing JSON response echo json_encode($response); } else { // failed to insert row $response["success"] = 0; $response["message"] = "Oops! An error occurred."; // echoing JSON response echo json_encode($response); } } else { // required field is missing $response["success"] = 0; $response["message"] = "Required field(s) is missing"; // echoing JSON response echo json_encode($response); } ?>

Android

public class NewEmpladoActivity extends Activity {

// Progress Dialog
private ProgressDialog pDialog;

JSONParser jsonParser = new JSONParser();
EditText inputName;
EditText inputApe;
EditText inputCed;
EditText inputSueldo;

// url to create new Empleado Reemplaza la IP de tu equipo o la direccion de tu servidor 
// Si tu servidor es tu PC colocar IP Ej: "http://127.97.99.200/taller06oct/..", no colocar "http://localhost/taller06oct/.."
private static String url_create_Empleado = "http://AquiTuServidor/taller06oct/nuevoempleado.php";

// JSON Node names
private static final String TAG_SUCCESS = "success";

@Override
public void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
	setContentView(R.layout.add_empleado);

	// Edit Text
	inputName = (EditText) findViewById(R.id.inputName);
	inputCed = (EditText) findViewById(R.id.inputCedula);
	inputApe = (EditText) findViewById(R.id.inputApellido);
	inputSueldo = (EditText) findViewById(R.id.inputSueldo);

	// Create button
	Button btnCreateEmpleado = (Button) findViewById(R.id.btnCreateEmpleado);

	// button click event
	btnCreateEmpleado.setOnClickListener(new View.OnClickListener() {

		@Override
		public void onClick(View view) {
			// creating new Empleado in background thread
			new CreateNewEmpleado().execute();
		}
	});
}

/**
 * Background Async Task to Create new Empleado
 * */
class CreateNewEmpleado extends AsyncTask<String, String, String> {

	/**
	 * Before starting background thread Show Progress Dialog
	 * */
	@Override
	protected void onPreExecute() {
		super.onPreExecute();
		pDialog = new ProgressDialog(NewEmpladoActivity.this);
		pDialog.setMessage("Registrando Empleado..");
		pDialog.setIndeterminate(false);
		pDialog.setCancelable(true);
		pDialog.show();
	}

	/**
	 * Creating Empleado
	 * */
	protected String doInBackground(String... args) {
		String name = inputName.getText().toString();
		String ape = inputApe.getText().toString();
		String cedula = inputCed.getText().toString();
		String sueldo = inputSueldo.getText().toString();

		// Building Parameters
		List<NameValuePair> params = new ArrayList<NameValuePair>();
		params.add(new BasicNameValuePair("nombre", name));
		params.add(new BasicNameValuePair("apellido", ape));
		params.add(new BasicNameValuePair("cedula", cedula));
		params.add(new BasicNameValuePair("sueldo", sueldo));

		// getting JSON Object
		// Note that create Empleado url accepts POST method
		JSONObject json = jsonParser.makeHttpRequest(url_create_Empleado,
				"POST", params);
		
		// check log cat fro response
		Log.d("Create Response", json.toString());

		// check for success tag
		try {
			int success = json.getInt(TAG_SUCCESS);

			if (success == 1) {
				// successfully created Empleado
				Intent i = new Intent(getApplicationContext(), EmpleadosActivity.class);
				startActivity(i);
				
				// closing this screen
				finish();
			} else {
				// failed to create Empleado
			}
		} catch (JSONException e) {
			e.printStackTrace();
		}

		return null;
	}

	/**
	 * After completing background task Dismiss the progress dialog
	 * **/
	protected void onPostExecute(String file_url) {
		// dismiss the dialog once done
		pDialog.dismiss();
	}

}
}

Esto lo acabo de encontrar por internet, pero es básicamente lo que me refiero.

Tunnecino

La mezcla de inglés y castellano en los comments me encanta xD

1
1 mes después
O

Hola, espero me puedas ayudar mi propósito es desarrollar una aplicacion en android que se conecte a una BD remota en Mysql he visto que tu lo haces mediante php, no se si tendrás alguna guía o una pagina que me puedas recomendar para poder entender mejor al tema te agradecería mucho si me pudieras ayudar.

Saludos!

JuAn4k4

La idea principal es

App Android ------ Servicio REST ----- Mysql

No te conectas a una BD remota, si no a un servicio remoto, y este servicio utiliza la BD.

Si quieres seguridad, utiliza https y basa tu respuesta en el servicio siempre en el usuario que esta accediendo desde Android, y no le dejes toquitear la BD a su antojo.

Usuarios habituales