14 ответов:
addslashes()не полностью адекватен, но пакет MSSQL PHP не предоставляет достойной альтернативы. Уродливое, но полностью общее решение-это кодирование данных в виде шестнадцатеричного bytestring, т. е.$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().
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
зачем вам беспокоиться о том, чтобы избежать чего-либо, когда вы можете использовать параметры в своем запросе?!
sqlsrv_query( $connection, 'UPDATE some_table SET some_field = ? WHERE other_field = ?', array($_REQUEST['some_field'], $_REQUEST['id']) )Он работает прямо в выбирает, удаляет, обновляет независимо от того, являются ли ваши значения параметров
nullили нет. Сделайте дело принципа-не объединяйте SQL, и вы всегда в безопасности, и ваши запросы читаются намного лучше.
вы могли бы заглянуть в библиотека 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' ) ";etc...
и атрибуции: Escape-символ в Microsoft SQL Server 2000
после борьбы с этим в течение нескольких часов, я придумал решение, которое чувствует себя чуть ли не лучшей.
Chaos ' ответ преобразования значений в hexstring не работает с каждым типом данных, особенно со столбцами datetime.
Я использую PHP
PDO::quote(), но как это происходит с PHP,PDO::quote()Не поддерживается для MS SQL Server и возвращаетFALSE. Решение для его работы состояло в том, чтобы загрузить некоторые пакеты Microsoft:
- Драйверы Microsoft 3.0 для PHP для SQL Server (SQLSRV30.EXE): Загрузите и следуйте инструкциям по установке.
- собственный клиент Microsoft® SQL Server® 2012: поиск по обширной странице для собственного клиента. несмотря на то, что это 2012 год, я использую его для подключения к SQL Server 2008 (установка собственного клиента 2008 года не работала). скачать и установить.
после этого вы можете подключиться в PHP с PDO, используя DSN, как показано ниже пример:
sqlsrv:Server=192.168.0.25; Database=My_Database;С помощью
UIDиPWDпараметры в DSN не работали, поэтому имя пользователя и пароль передаются как второй и третий параметры в конструкторе PDO при создании соединения. Теперь вы можете использовать PHPPDO::quote(). Наслаждаться.
Я знаю, немного поздно, но ответ от '22 февраля '09 В 12:10' хаос не подходит для всех запросов. Например: "Создать логин [0x6f6c6f6c6f] из WINDOWS" даст вам исключение
p.s. посмотрите на драйвер mssql для php,http://msdn.microsoft.com/library/cc296181%28v=sql.90%29.aspx и функция sqlsrv_prepare, которая может связывать параметры.
p.s. s. который также не помогает вам с запросом выше ;)
внимание: эта функция была удалена в PHP 7.0.0.
http://php.net/manual/en/function.mssql-query.php
для тех, кто все еще использует эти функции mssql_*, имейте в виду, что они были удалены из PHP с версии v7.0.0. Таким образом, это означает, что вам в конечном итоге придется переписать код модели, чтобы использовать библиотеку PDO, sqlsrv_* и т. д. Если вы ищете что-то с методом" цитирование/экранирование", я бы рекомендовал ПДО.
альтернативы этой функции включают: PDO:: query (), sqlsrv_query () и odbc_exec ()
Если вы используете PDO, вы можете использовать
PDO::quoteметод.
Не лучше ли также избежать зарезервированных слов 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 '//' ); foreach ( $non_displayables as $regex ) $data = preg_replace( $regex, '', $data ); $reemplazar = array('"',"'",'='); $data = str_replace($reemplazar, "*", $data ); return $data; }
для преобразования, чтобы получить шестнадцатеричный код в 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);
Я использую это как альтернативу
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, (и улучшить его) со следующим регулярным выражением:[0012522740]. Это заботится о следующих символах: null, backspace, горизонтальная вкладка, новая строка, возврат каретки, замена, двойная кавычка, одинарная кавычка, обратная косая черта, серьезный акцент. Backspace и горизонтальная вкладка не поддерживаютсяmysql_real_escape_string.
Comments