Pregunta

Lo siento por no formatear mi código. la barra de herramientas se había ido ...

Quiero insertar algunos datos en una base de datos mysql. He escrito una función en php:

function add_ID($ID, $token)  {
 $add = "INSERT INTO ids (ID, token) VALUES ('$ID', '$token')";
 mysql_query($add);
 echo 'added successfully';
}  
if(isset($_GET['addDeviceID'])) {
 add_ID($_GET['ID'], $_GET['token']);
}

En la URL-Campo de mi Browswe I'am llamar a la función de esa manera: http://www.justanexample.com/example.php?ID=123123123&token= qwertzuiop

Esto funciona.

Si pongo un espacio en cualquiera de los parámetros, por ejemplo, así: http://www.justanexample.com/example.php?ID=123123 123 y token = qwertzuiop

Nada se añadió a mi base de datos mysql.

Sería muy bueno para conseguir un poco de ayuda :) Gracias!

¿Fue útil?

Solución

Su función es vulnerable a la inyección de SQL. Debe validar todos los parámetros recibidos por el usuario antes de usarlos en una consulta SQL, y pasar a través de cualquier cadena mysql_real_escape_string, porque entonces tan sólo pudiera pasar algo así como example.php?token='; DROP DATABASE; y regiamente tornillo hasta su aplicación.

En su caso, se debe realizar una prueba de que los parámetros recibidos están en la forma que se espera en primer lugar, devolver un error al usuario si no lo hacen, y sólo luego se pasa a la consulta SQL.

function add_ID($ID, $token)  {
  $id = mysql_real_escape_string($id);
  $token = mysql_real_escape_string($token);

  $add = "INSERT INTO ids (ID, token) VALUES ('$ID', '$token')";
  mysql_query($add);
  echo 'added successfully';
}  

if(isset($_GET['addDeviceID'])) {
  $id    = isset($_GET['id']) ? $_GET['id'] : 0; // in case no ID has been passed in
  $token = isset($_GET['token']) ? $_GET['token'] : '';

  if (!is_numeric($id) {
    die('ID is not a number');
  } 

  // validate token here as well

  add_ID($id, $token);
}

También debe buscar en las consultas parametrizadas, que son una forma general mucho mejor de hacer las consultas SQL con parámetros que sólo mediante la concatenación de cadenas. Por eso, mirar en el uso de la extensión mysqli en lugar de MySQL, o en un nivel superior, DOP.

Otros consejos

Usted debe validar su entrada antes de enviarlo a la base de datos. O bien, si la validación no es posible, filtro y / o el valor escapar.

Validación

Si esperas ID sea un número entero mayor que cero:

if (!ctype_digit($ID)) {
    // invalid ID
}

Si esperas Moneda a ser una cadena alfanumérica:

if (!ctype_alnum($token)) {
    // invalid token
}

Filtrado

El filtrado es la eliminación de partes no válidos de la entrada para que sea válida:

if (!ctype_digit($ID)) {
    $ID = preg_replace('/\D+/', '', $ID);
    // $ID does now only contain digits
}
if (!ctype_alnum($token)) {
    $token = preg_replace('/\D+/', '', $token);
    // $token does now only contain alphanumeric characters
}

Escapar

Escapar está reemplazando los meta-caracteres de un contexto específico alguna cadena está destinado a ser colocado en Para MySQL consulta se debe utilizar una función que se escapa de los meta-caracteres de la contexto Declaración de cadena en MySQL . PHP tiene la href="http://php.net/mysql_real_escape_string" rel="nofollow noreferrer"> mysql_real_escape_string función

$add = "INSERT INTO ids (ID, token) VALUES ('".mysql_real_escape_string($ID)."', '".mysql_real_escape_string($token)."')";

Eliminar espacio de ellos usando la función str_replace por ejemplo:

 $ID = str_replace(' ', '', $ID);
 $token= str_replace(' ', '', $token);

 $add = "INSERT INTO ids (ID, token) VALUES ('$ID', '$token')";

Además, sospecho que su $ ID es un campo entero de la tabla para que pueda ejecutar la consulta sin especificar paréntesis, por ejemplo:

 $add = "INSERT INTO ids (ID, token) VALUES ($ID, '$token')";

Su código está asumiendo la consulta completa con éxito sin tener que comprobar si había un error. Supongo que será un error de sintaxis debido a los espacios. Si el campo ID es un tipo entero, a continuación, haciendo ID=123 123 será el error de sintaxis. Incluyendo toda la inyección de SQL y datos de desinfección consejos en las otras respuestas, debe reescribir su función add_id de la siguiente manera:

function add_ID($ID, $token) {
  $query = 'blah blah blah';
  mysql_query($query);
  if (mysql_error()) {
       echo 'ruhroh, someone set us up the bomb: ', mysql_error();
  } else {
       echo 'woohoo, it worked!';
  }
}

Al menos esto le dirá si la consulta realmente tuvo éxito, y lo hizo estallar si no lo hizo. Nunca asuma que una consulta de base de datos de cualquier tipo tendrá éxito. Hay demasiadas maneras para que pueda hacer estallar (servidor murió, estancamiento transacción, grupo de conexión agotado, sin espacio en disco, etc ...) que no tienen ni siquiera un poco de manipulación que el anterior error simplista.

Puede utilizar str_replace para eliminar espacios. Pero no es una buena práctica. ¿Cómo puede URL de ser modificado de modo? En casos normales es irreal. Al contrario, debe probar todos los valores de entrada de usuario (ID debe ser un número entero, Token no debería contiene "'" símbolo y otras comprobaciones). Lee sobre sql-inyecciones.

scroll top