special sirve real_escape_string que para mysqli_real_escape_string mysql_real_escape_string expects exactly escape comillas characters alternative php special-characters sql-injection illegal-characters

sirve - En PHP al enviar cadenas a la base de datos, ¿debo ocuparme de los caracteres ilegales usando htmlspecialchars() o usar una expresión regular?



mysqli_real_escape_string() expects exactly 2 parameters (6)

Estoy trabajando en un formulario con la posibilidad de que el usuario use caracteres ilegales / especiales en la cadena que se enviará a la base de datos.

Los usuarios pueden ir mucho más allá de eso en realidad.

Quiero escapar / negar estos caracteres en la cadena y he estado usando htmlspecialchars (). Sin embargo, me gustaría saber si hay un método mejor / más rápido.

Use el purificador de HTML :

HTML Purifier es una biblioteca de filtro HTML compatible con los estándares escrita en PHP. HTML Purifier no solo eliminará todos los códigos maliciosos (mejor conocidos como XSS) con una lista blanca completamente auditada, segura y permisiva.

y decide por ti mismo :)

Estoy trabajando en un formulario con la posibilidad de que el usuario use caracteres ilegales / especiales en la cadena que se enviará a la base de datos. Quiero escapar / negar estos caracteres en la cadena y he estado usando htmlspecialchars () . Sin embargo, ¿hay un método mejor / más rápido?


En primer lugar, debe desinfectar las cosas cuando se muestran, no antes de insertarlas en la base de datos. Las inyecciones de SQL son otra historia, pero probablemente fuera del tema.

En segundo lugar, si no necesita que sus usuarios puedan publicar HTML, htmlspecialchars es todo lo que necesita. Cuida todos los caracteres especiales en HTML.


Este no es un problema que quiera abordar por su cuenta. Hay bibliotecas para hacer esto por usted, como el purificador de HTML .


No ha indicado cuáles pueden ser estos caracteres ilegales, pero definitivamente debe utilizar el mecanismo proporcionado por la API de la base de datos para escapar de los datos. Por ejemplo, si está utilizando MySQL, use declaraciones SQL parametrizadas con PDO.


Si envía estos datos a la base de datos, eche un vistazo a las funciones de escape de su base de datos.

Es decir, para MySQL hay mysql_real_escape_string .

Estas funciones de escape se encargan de los caracteres que puedan ser maliciosos, y de todos modos obtendrá sus datos de la misma manera que los puso allí.

También puede usar declaraciones preparadas para cuidar los datos:

$dbPreparedStatement = $db->prepare(''INSERT INTO table (htmlcontent) VALUES (?)''); $dbPreparedStatement->execute(array($yourHtmlData));

O un poco más auto explicativo:

$dbPreparedStatement = $db->prepare(''INSERT INTO table (htmlcontent) VALUES (:htmlcontent)''); $dbPreparedStatement->execute(array('':htmlcontent'' => $yourHtmlData));

En caso de que desee guardar diferentes tipos de datos, utilice bindParam para definir cada tipo, es decir, un entero puede definirse por: $db->bindParam('':userId'', $userId, PDO::PARAM_INT); . Ejemplo:

$dbPreparedStatement = $db->prepare(''INSERT INTO table (postId, htmlcontent) VALUES (:postid, :htmlcontent)''); $dbPreparedStatement->bindParam('':postid'', $userId, PDO::PARAM_INT); $dbPreparedStatement->bindParam('':htmlcontent'', $yourHtmlData, PDO::PARAM_STR); $dbPreparedStatement->execute();

Donde $db es su objeto de datos PHP (PDO). Si no está utilizando uno, puede obtener más información al respecto en PHP Data Objects .


No hay caracteres "ilegales" para la base de datos. La base de datos que no puede almacenar algunos caracteres es una tontería. Hay algunos caracteres de servicio , como comillas, usados ​​para delimitar cadenas. Estos personajes deberían escaparse, no eliminarse.

Para enviar una consulta a la base de datos, tiene 2 opciones:

  1. Cree una consulta de la manera habitual, para que se vea exactamente como la consulta SQL que puede ejecutar en la consola sql.
    Para hacerlo, uno debe entender un conjunto completo de reglas , no solo "usar mysql_real_escape_string".
    Reglas tales como:

    • Las cadenas deben estar entre comillas y escapadas. Ese es el único significado de escapar: ¡son solo delimitadores de escape! (y algunos otros caracteres: cadena de caracteres de terminación y carácter de escape en sí). Sin citas circundantes, mysql_real_escape_string es inútil.
    • Los números deben enviarse a su tipo explícitamente. Aunque los números de datos se pueden amenazar como las cadenas, hay algunos números, como los parámetros de la cláusula LIMIT, que no se pueden escapar y solo se pueden transmitir.
  2. Para enviar consulta y datos por separado .
    Esta es la forma más preferida, ya que puede acortarse para simplemente "usar enlace". Todas las cadenas, números y parámetros LIMIT se pueden vincular, no se preocupe en absoluto.
    Con este método, su consulta con marcadores de posición se envía a la base de datos tal cual, y los datos vinculados se envían en paquetes separados, por lo que no puede interferir. Es como la separación de código y datos . Envía su programa (consulta misma) separado de los datos.

¡Pero!

Todo lo dicho anteriormente cubre solo datos de la consulta.
Pero a veces tenemos que hacer que nuestra consulta sea aún más dinámica, agregando operadores o identificadores.
En este caso, todos los parámetros dinámicos deben estar codificados en nuestro script y elegidos de ese conjunto.
Por ejemplo, para hacer un pedido dinámico:

$orders = array("name","price","qty"); //field names $key = array_search($_GET[''sort''],$orders)); // see if we have such a name $orderby = $orders[$key]; //if not, first one will be set automatically. smart enuf :) $query = "SELECT * FROM `table` ORDER BY $orderby"; //value is safe

o búsqueda dinámica:

$w = array(); $where = ''''; if (!empty($_GET[''rooms''])) $w[]="rooms=''".mesc($_GET[''rooms''])."''"; if (!empty($_GET[''space''])) $w[]="space=''".mesc($_GET[''space''])."''"; if (!empty($_GET[''max_price''])) $w[]="price < ''".mesc($_GET[''max_price''])."''"; if (count($w)) $where="WHERE ".implode('' AND '',$w); $query="select * from table $where";

En este ejemplo, estamos agregando a la consulta solo los datos ingresados ​​por el usuario, no los nombres de campo, que están todos codificados en el script. Para el enlace el algoritmo sería muy similar.

Y así.