escape - ¿Cómo escapar cadenas en SQL Server usando PHP?
php stripslashes (14)
Estoy buscando la alternativa de mysql_real_escape_string()
para SQL Server. Es addslashes()
mi mejor opción o hay otra función alternativa que se puede utilizar?
Editar : Alternativa para mysql_error()
también sería útil.
Advertencia: esta función fue eliminada en PHP 7.0.0.
http://php.net/manual/en/function.mssql-query.php
Para cualquiera que todavía esté usando estas funciones mssql_ *, tenga en cuenta que han sido eliminadas de PHP a partir de la versión 7.0.0. Entonces, eso significa que eventualmente tendrá que volver a escribir su código de modelo para usar la biblioteca PDO, sqlsrv_ * etc. Si está buscando algo con un método de "cotización / escape", recomendaría PDO.
Las alternativas a esta función incluyen: PDO :: query (), sqlsrv_query () y odbc_exec ()
¿No es mejor también escapar de las palabras reservadas de SQL? Por ejemplo:
function ms_escape_string($data) {
if ( !isset($data) or empty($data) ) return '''';
if ( is_numeric($data) ) return $data;
$non_displayables = array(
''/%0[0-8bcef]/'', // url encoded 00-08, 11, 12, 14, 15
''/%1[0-9a-f]/'', // url encoded 16-31
''/[/x00-/x08]/'', // 00-08
''//x0b/'', // 11
''//x0c/'', // 12
''/[/x0e-/x1f]/'', // 14-31
''//27/''
);
foreach ( $non_displayables as $regex )
$data = preg_replace( $regex, '''', $data );
$reemplazar = array(''"'',"''",''='');
$data = str_replace($reemplazar, "*", $data );
return $data;
}
¿Por qué te molestas en escapar de todo cuando puedes usar parámetros en tu consulta?
sqlsrv_query(
$connection,
''UPDATE some_table SET some_field = ? WHERE other_field = ?'',
array($_REQUEST[''some_field''], $_REQUEST[''id''])
)
Funciona correctamente en selecciones, eliminaciones, actualizaciones independientemente de si sus parámetros de valores son null
o no. Haga una cuestión de principio: no concatene SQL y siempre estará seguro y sus consultas se leerán mucho mejor.
Después de luchar con esto durante horas, he encontrado una solución que se siente casi mejor.
La respuesta de Chaos de convertir valores a hexstring no funciona con todos los tipos de datos, específicamente con columnas de fecha y hora.
Utilizo PHP''s PDO::quote()
, pero como viene con PHP, PDO::quote()
no es compatible con MS SQL Server y devuelve FALSE
. La solución para que funcione es descargar algunos paquetes de Microsoft:
- Microsoft Drivers 3.0 para PHP para SQL Server (SQLSRV30.EXE): descargue y siga las instrucciones para instalar.
- Microsoft® SQL Server® 2012 Native Client : Busque en la extensa página de Native Client. Aunque es 2012, lo estoy usando para conectarme a SQL Server 2008 (la instalación de 2008 Native Client no funcionó). Descargar e instalar.
Después de eso, puede conectarse en PHP con PDO usando un DSN como en el siguiente ejemplo:
sqlsrv:Server=192.168.0.25; Database=My_Database;
El uso de los parámetros UID
y PWD
en el DSN no funcionó, por lo que el nombre de usuario y la contraseña se pasan como el segundo y el tercer parámetro en el constructor de PDO al crear la conexión. Ahora puede usar PHP''s PDO::quote()
. Disfrutar.
He estado usando esto como una alternativa de mysql_real_escape_string()
:
function htmlsan($htmlsanitize){
return $htmlsanitize = htmlspecialchars($htmlsanitize, ENT_QUOTES, ''UTF-8'');
}
$data = "Whatever the value''s is";
$data = stripslashes(htmlsan($data));
Lo sé, un poco tarde, pero la respuesta del ''22 de febrero ''09 a las 12:10'' por caos no se ajusta a todas las consultas. Por ejemplo: "CREATE LOGIN [0x6f6c6f6c6f] FROM WINDOWS" le dará una excepción
Mire el controlador mssql para php, http://msdn.microsoft.com/library/cc296181%28v=sql.90%29.aspx y la función sqlsrv_prepare, que puede enlazar params.
pss que tampoco te ayuda con la consulta anterior;)
Otra forma de manejar las comillas simples y dobles es
function mssql_escape($str)
{
if(get_magic_quotes_gpc())
{
$str= stripslashes($str);
}
return str_replace("''", "''''", $str);
}
Para evitar comillas simples y dobles, debe duplicarlas:
$value = ''This is a quote, "I said, ''Hi''"'';
$value = str_replace( "''", "''''", $value );
$value = str_replace( ''"'', ''""'', $value );
$query = "INSERT INTO TableName ( TextFieldName ) VALUES ( ''$value'' ) ";
etc ...
y atribución: Carácter de escape en Microsoft SQL Server 2000
Para la conversión para obtener el HEX en SQL de nuevo en ASCII aquí está la solución que obtuve en esto (usando la función de Chaos para codificar en Hex)
function hexEncode($data) {
if(is_numeric($data))
return $data;
$unpacked = unpack(''H*hex'', $data);
return ''0x'' . $unpacked[''hex''];
}
function hexDecode($hex) {
$str = '''';
for($i=0;$i<strlen($hex);$i+=2) $str .= chr(hexdec(substr($hex,$i,2)));
return $str;
}
$stringHex = hexEncode(''Test String'');
var_dump($stringHex);
$stringAscii = hexDecode($stringHex);
var_dump($stringAscii);
Puede consultar 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.
Puede rodar su propia versión de mysql_real_escape_string
, (y mejorarla) con la siguiente expresión regular: [/000/010/011/012/015/032/042/047/134/140]
. Esto se ocupa de los siguientes caracteres: nulo, retroceso, pestaña horizontal, nueva línea, retorno de carro, sustituto, comillas dobles, comillas simples, diagonal inversa, acento grave. Backspace y la pestaña horizontal no son compatibles con mysql_real_escape_string
.
Si está utilizando PDO, puede usar el método PDO::quote
.
addslashes()
no es completamente adecuado, pero el paquete mssql de PHP no ofrece ninguna alternativa decente. La solución fea pero totalmente general es codificar los datos como una cadena de bytes hex, es decir,
$unpacked = unpack(''H*hex'', $data);
mssql_query(''
INSERT INTO sometable (somecolumn)
VALUES (0x'' . $unpacked[''hex''] . '')
'');
Abstraído, eso sería:
function mssql_escape($data) {
if(is_numeric($data))
return $data;
$unpacked = unpack(''H*hex'', $data);
return ''0x'' . $unpacked[''hex''];
}
mssql_query(''
INSERT INTO sometable (somecolumn)
VALUES ('' . mssql_escape($somevalue) . '')
'');
mysql_error()
equivalente es mssql_get_last_message()
.
function ms_escape_string($data) {
if ( !isset($data) or empty($data) ) return '''';
if ( is_numeric($data) ) return $data;
$non_displayables = array(
''/%0[0-8bcef]/'', // url encoded 00-08, 11, 12, 14, 15
''/%1[0-9a-f]/'', // url encoded 16-31
''/[/x00-/x08]/'', // 00-08
''//x0b/'', // 11
''//x0c/'', // 12
''/[/x0e-/x1f]/'' // 14-31
);
foreach ( $non_displayables as $regex )
$data = preg_replace( $regex, '''', $data );
$data = str_replace("''", "''''", $data );
return $data;
}
Parte del código aquí fue arrancado de CodeIgniter. Funciona bien y es una solución limpia.