Как экранировать строки в SQL Server с помощью PHP?



Я ищу альтернативу mysql_real_escape_string() для SQL Server. Это addslashes() мой лучший вариант или есть другая альтернативная функция, которую можно использовать?



Edit: альтернатива mysql_error() также было бы полезно.

1064   14  

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, и вы всегда в безопасности, и ваши запросы читаются намного лучше.

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' ) ";

etc...

и атрибуции: Escape-символ в Microsoft SQL Server 2000

после борьбы с этим в течение нескольких часов, я придумал решение, которое чувствует себя чуть ли не лучшей.

Chaos ' ответ преобразования значений в hexstring не работает с каждым типом данных, особенно со столбцами 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 при создании соединения. Теперь вы можете использовать PHP PDO::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

    Ничего не найдено.