Я ищу альтернативу mysql_real_escape_string()
для SQL Server. Это addslashes()
лучший вариант или есть еще одна альтернативная функция, которую можно использовать?
Альтернатива для mysql_error()
также была бы полезна.
php
sql-server
escaping
input-sanitization
Нажмите Голосовать за
источник
источник
Ответы:
addslashes()
не вполне адекватен, но пакет PHP mssql не предоставляет достойной альтернативы. Уродливое, но полностью общее решение - это кодирование данных в виде шестнадцатеричной строки байтов, т.е.$unpacked = unpack('H*hex', $data); mssql_query(' INSERT INTO sometable (somecolumn) VALUES (0x' . $unpacked['hex'] . ') ');
В абстракции это будет:
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()
эквивалентmssql_get_last_message()
.источник
SQLSTATE[22007]: Invalid datetime format: 210 [Microsoft][ODBC SQL Server Driver][SQL Server]Conversion failed when converting datetime from binary/varbinary string.
я считаю, что этот метод может быть правильным, только если он работает со всеми типами данных MSSQL.mssql_escape()
возвращенной функции не делает этого за меня. Текст, отображаемый после выбора, выглядит0x4a2761696d65206269656e206c652063686f636f6c6174
нечитаемым.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; }
Часть кода здесь была скопирована с CodeIgniter. Хорошо работает и является чистым решением.
РЕДАКТИРОВАТЬ: с этим фрагментом кода выше есть много проблем. Пожалуйста, не используйте это, не прочитав комментарии, чтобы узнать, что это такое. А еще лучше, пожалуйста, не используйте это вообще. Параметризованные запросы - ваши друзья: http://php.net/manual/en/pdo.prepared-statements.php
источник
preg_replace
? Разве неstr_replace
достаточно?empty($value)
вернетtrue
не только для''
, но и дляnull
,0
и'0'
! Во всех этих случаях вы вернете пустую строку.Зачем вам нужно избегать чего-либо, если вы можете использовать параметры в своем запросе ?!
sqlsrv_query( $connection, 'UPDATE some_table SET some_field = ? WHERE other_field = ?', array($_REQUEST['some_field'], $_REQUEST['id']) )
Он работает прямо при выборе, удалении, обновлении независимо от того, являются ли ваши параметры значениями
null
или нет. Сделайте вопрос принципа - не объединяйте SQL, и вы всегда в безопасности, а ваши запросы читаются намного лучше.http://php.net/manual/en/function.sqlsrv-query.php
источник
Вы можете заглянуть в библиотеку PDO . Вы можете использовать подготовленные операторы с PDO, который автоматически исключит любые плохие символы в ваших строках, если вы правильно выполните подготовленные операторы. Думаю, это только для PHP 5.
источник
Другой способ обработки одинарных и двойных кавычек:
function mssql_escape($str) { if(get_magic_quotes_gpc()) { $str = stripslashes($str); } return str_replace("'", "''", $str); }
источник
Чтобы избежать одинарных и двойных кавычек, вы должны их удвоить:
$value = 'This is a quote, "I said, 'Hi'"'; $value = str_replace( "'", "''", $value );
$value = str_replace( '"', '""', $value );
$query = "INSERT INTO TableName ( TextFieldName ) VALUES ( '$value' ) ";
так далее...
и атрибуция: escape-символ в Microsoft SQL Server 2000
источник
После нескольких часов борьбы с этим я нашел решение, которое кажется мне лучшим.
Ответ хаоса о преобразовании значений в шестнадцатеричную строку не работает с каждым типом данных, особенно со столбцами datetime.
Я использую PHP
PDO::quote()
, но поскольку он поставляется с PHP,PDO::quote()
он не поддерживается для MS SQL Server и возвращаетсяFALSE
. Решением для этого была загрузка некоторых пакетов Microsoft:После этого вы можете подключиться в PHP с PDO, используя DSN, как в следующем примере:
sqlsrv:Server=192.168.0.25; Database=My_Database;
Использование
UID
иPWD
параметры в DSN не работал, поэтому имя пользователя и пароль передаются в качестве второго и третьего параметров на конструктору PDO при создании подключения. Теперь вы можете использовать PHPPDO::quote()
. Наслаждаться.источник
Ответ от 22.02.2009 T121000 от user chaos не подходит для всех запросов.
Например, «СОЗДАТЬ ЛОГИН [0x6f6c6f6c6f] ИЗ WINDOWS» выдаст исключение.
PS: посмотрите драйвер SQL Server для PHP, http://msdn.microsoft.com/library/cc296181%28v=sql.90%29.aspx и функцию sqlsrv_prepare, которая может связывать параметры.
PSS: Что также не помогло вам с запросом выше;)
источник
http://php.net/manual/en/function.mssql-query.php
Тем, кто все еще использует эти функции mssql_ *, имейте в виду, что они были удалены из PHP начиная с версии 7.0.0. Таким образом, это означает, что вам в конечном итоге придется переписать код модели, чтобы использовать библиотеку PDO, sqlsrv_ * и т. Д. Если вы ищете что-то с методом «цитирования / экранирования», я бы порекомендовал PDO.
источник
Если вы используете PDO, вы можете использовать
PDO::quote
метод.источник
Для преобразования, чтобы получить шестнадцатеричные значения в SQL обратно в ASCII, вот решение, которое я получил по этому поводу (используя функцию из пользовательского хаоса для кодирования в шестнадцатеричный)
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);
источник
Лучше также избегать зарезервированных слов SQL. Например:
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; }
источник
Я использовал это как альтернативу
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));
источник
Вы можете свернуть свою собственную версию
mysql_real_escape_string
, (и улучшить его) со следующим регулярным выражением:[\000\010\011\012\015\032\042\047\134\140]
. Это заботится о следующих символах: null, backspace, горизонтальная табуляция, новая строка, возврат каретки, подстановка, двойная кавычка, одинарная кавычка, обратная косая черта, серьезный акцент. Backspace и горизонтальная табуляция не поддерживаютсяmysql_real_escape_string
.источник