Estoy buscando la alternativa de mysql_real_escape_string()
SQL Server. ¿Es addslashes()
mi mejor opción o hay otra función alternativa que se puede utilizar?
mysql_error()
También sería útil una alternativa para .
php
sql-server
escaping
input-sanitization
Haga clic en Upvote
fuente
fuente
Respuestas:
addslashes()
no es del todo adecuado, pero el paquete mssql de PHP no ofrece ninguna alternativa decente. La solución fea pero completamente general es codificar los datos como una cadena de bytes hexadecimal, es decirAbstraído, eso sería:
mysql_error()
equivalente esmssql_get_last_message()
.fuente
SQLSTATE[22007]: Invalid datetime format: 210 [Microsoft][ODBC SQL Server Driver][SQL Server]Conversion failed when converting datetime from binary/varbinary string.
creo que este método puede ser correcto solo si funciona con todos los tipos de datos MSSQL.mssql_escape()
función devuelta no lo hace por mí. La pantalla de texto después de hacer una selección se ve0x4a2761696d65206269656e206c652063686f636f6c6174
así, ilegible.Parte del código aquí fue extraído de CodeIgniter. Funciona bien y es una solución limpia.
EDITAR: Hay muchos problemas con ese fragmento de código anterior. No use esto sin leer los comentarios para saber cuáles son. Mejor aún, no use esto en absoluto. Las consultas parametrizadas son tus amigos: http://php.net/manual/en/pdo.prepared-statements.php
fuente
preg_replace
? ¿No esstr_replace
suficiente?empty($value)
devolverátrue
no solo para''
, sino también paranull
,0
y'0'
! Devolvería una cadena vacía en todos esos casos.¿Por qué se molestaría en escapar de algo cuando puede utilizar parámetros en su consulta?
Funciona bien en selecciones, eliminaciones, actualizaciones independientemente de si los parámetros de sus valores lo son
null
o no. Haga una cuestión de principio: no concatenar SQL y siempre estará seguro y sus consultas se leerán mucho mejor.http://php.net/manual/en/function.sqlsrv-query.php
fuente
Puede buscar en la biblioteca PDO . Puede usar declaraciones preparadas con PDO, que escapará automáticamente de cualquier carácter incorrecto en sus cadenas si hace las declaraciones preparadas correctamente. Esto es solo para PHP 5, creo.
fuente
Otra forma de manejar comillas simples y dobles es:
fuente
Para escapar de las comillas simples y dobles, debe duplicarlas:
$value = str_replace( '"', '""', $value );
etc ...
y atribución: carácter de escape en Microsoft SQL Server 2000
fuente
Después de luchar con esto durante horas, se me ocurrió una solución que se siente casi mejor.
La respuesta de Chaos de convertir valores a cadenas hexadecimales no funciona con todos los tipos de datos, específicamente con columnas de fecha y hora.
Yo uso PHP
PDO::quote()
, pero como viene con PHP,PDO::quote()
no es compatible con MS SQL Server y devuelveFALSE
. La solución para que funcionara fue descargar algunos paquetes de Microsoft:Después de eso, puede conectarse en PHP con PDO usando un DSN como el siguiente ejemplo:
El uso de los parámetros
UID
yPWD
en el DSN no funcionó, por lo que el nombre de usuario y la contraseña se pasan como segundo y tercer parámetro en el constructor de PDO al crear la conexión. Ahora puedes usar PHPPDO::quote()
. Disfrutar.fuente
Una respuesta de 2009-02-22T121000 por el caos de usuarios no se ajusta a todas las consultas.
Por ejemplo, "CREATE LOGIN [0x6f6c6f6c6f] FROM WINDOWS" te dará una excepción.
PD: mire el controlador de SQL Server para PHP, http://msdn.microsoft.com/library/cc296181%28v=sql.90%29.aspx y la función sqlsrv_prepare, que puede enlazar parámetros.
PSS: que tampoco le ayudó con la consulta anterior;)
fuente
http://php.net/manual/en/function.mssql-query.php
Para cualquiera que todavía use estas funciones mssql_ *, tenga en cuenta que se han eliminado de PHP a partir de la v7.0.0. Entonces, eso significa que eventualmente tendrá que reescribir el código de su modelo para usar la biblioteca PDO, sqlsrv_ *, etc. Si está buscando algo con un método de "cotización / escape", recomendaría PDO.
fuente
Si está usando PDO, puede usar el
PDO::quote
método.fuente
Es mejor escapar también de las palabras reservadas SQL. Por ejemplo:
fuente
He estado usando esto como una alternativa de
mysql_real_escape_string()
:fuente
Para que la conversión vuelva a obtener los valores hexadecimales en SQL en ASCII, aquí está la solución que obtuve (usando la función del caos del usuario para codificar en hexadecimal)
fuente
Se podría rodar su propia versión de
mysql_real_escape_string
, (y mejorarlo) con la siguiente expresión regular:[\000\010\011\012\015\032\042\047\134\140]
. Eso se ocupa de los siguientes caracteres: nulo, retroceso, tabulación horizontal, nueva línea, retorno de carro, sustituto, comillas dobles, comillas simples, barra invertida, acento grave. El retroceso y la pestaña horizontal no son compatibles conmysql_real_escape_string
.fuente