94

我正在寻找mysql_real_escape_string()SQL Server 的替代方案。是addslashes()我最好的选择还是可以使用其他替代功能?

的替代方案mysql_error()也很有用。

4

14 回答 14

75

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().

于 2009-02-22T12:10:12.640 回答
42
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

于 2010-03-26T21:01:29.957 回答
17

当您可以在查询中使用参数时,为什么还要费心转义任何东西?!

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

于 2015-09-09T14:53:26.973 回答
11

您可以查看PDO Library。您可以将预准备语句与 PDO 一起使用,如果您正确执行预准备语句,它将自动转义字符串中的任何坏字符。我认为这仅适用于 PHP 5。

于 2009-02-22T12:06:21.247 回答
4

另一种处理单引号和双引号的方法是:

function mssql_escape($str)
{
    if(get_magic_quotes_gpc())
    {
        $str = stripslashes($str);
    }
    return str_replace("'", "''", $str);
}
于 2014-03-02T14:04:49.927 回答
3

为了逃避单引号和双引号,您必须将它们加倍:

$value = 'This is a quote, "I said, 'Hi'"';

$value = str_replace( "'", "''", $value ); 

$value = str_replace( '"', '""', $value );

$query = "INSERT INTO TableName ( TextFieldName ) VALUES ( '$value' ) ";

ETC...

和归属: Microsoft SQL Server 2000 中的转义字符

于 2012-09-07T23:14:12.910 回答
2

在为此苦苦挣扎了几个小时之后,我想出了一个感觉几乎是最好的解决方案。

Chaos 将值转换为十六进制字符串的答案不适用于每种数据类型,尤其是日期时间列。

我使用 PHP 的PDO::quote(),但由于它带有 PHP,PDO::quote()MS SQL Server 不支持它并返回FALSE。它的工作解决方案是下载一些 Microsoft 捆绑包:

之后,您可以使用 DSN 在 PHP 中使用 PDO 连接,如下例所示:

sqlsrv:Server=192.168.0.25; Database=My_Database;

在 DSN 中使用UIDandPWD参数不起作用,因此在创建连接时,用户名和密码作为 PDO 构造函数的第二个和第三个参数传递。现在您可以使用 PHP 的PDO::quote(). 享受。

于 2012-06-19T19:02:19.927 回答
1

来自用户混乱的 2009-02-22T121000 的答案并不适合所有查询。

例如,“CREATE LOGIN [0x6f6c6f6c6f] FROM WINDOWS”会给你一个例外。

PS:看PHP的SQL Server驱动, http: //msdn.microsoft.com/library/cc296181%28v=sql.90%29.aspx和sqlsrv_prepare函数,可以绑定参数。

PSS:上面的查询也没有帮助您;)

于 2011-05-11T03:48:41.843 回答
1

警告:这个函数在 PHP 7.0.0 中被移除。

http://php.net/manual/en/function.mssql-query.php

对于仍在使用这些 mssql_* 函数的任何人,请记住,从 v7.0.0 开始,它们已从 PHP 中删除。因此,这意味着您最终必须重写模型代码以使用 PDO 库、sqlsrv_* 等。如果您正在寻找具有“引用/转义”方法的东西,我会推荐 PDO。

此函数的替代方法包括:PDO::query()、sqlsrv_query() 和 odbc_exec()

于 2016-02-17T19:02:12.737 回答
0

为了将 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);
于 2016-08-22T18:49:43.940 回答
0

如果您使用的是 PDO,则可以使用该PDO::quote方法。

于 2016-10-11T10:11:01.683 回答
0

最好也转义 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;
}
于 2017-11-05T05:00:28.240 回答
-1

我一直在使用它作为替代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));
于 2017-08-16T12:08:45.470 回答
-2

您可以使用以下正则表达式滚动您自己的mysql_real_escape_string, 版本(并对其进行改进):[\000\010\011\012\015\032\042\047\134\140]. 这会处理以下字符:null、退格、水平制表符、换行符、回车、替换、双引号、单引号、反斜杠、重音符。不支持退格和水平制表符mysql_real_escape_string

于 2009-03-02T18:31:23.407 回答