94 votes

Comment échapper les chaînes de caractères dans le serveur SQL en utilisant PHP ?

Je cherche l'alternative de mysql_real_escape_string() pour SQL Server. Est-ce que addslashes() ma meilleure option ou y a-t-il une autre fonction alternative qui peut être utilisée ?

Une alternative pour mysql_error() serait également utile.

3 votes

Pour moi, il ne s'agit pas d'une question redondante car elle concerne le cas spécifique de MSSQL qui n'a pas de PDO officiel associé.

75voto

chaos Points 69029

addslashes() n'est pas totalement adapté, mais le paquetage mssql de PHP ne fournit pas d'alternative décente. La solution laide mais tout à fait générale est d'encoder les données comme un bytestring hexadécimal, c'est-à-dire

$unpacked = unpack('H*hex', $data);
mssql_query('
    INSERT INTO sometable (somecolumn)
    VALUES (0x' . $unpacked['hex'] . ')
');

Abstrait, ce serait :

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() L'équivalent est mssql_get_last_message() .

42voto

genio Points 565
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;
    }

Une partie du code ici a été arrachée à CodeIgniter. Il fonctionne bien et constitue une solution propre.

EDIT : Il y a beaucoup de problèmes avec le bout de code ci-dessus. Merci de ne pas l'utiliser sans avoir lu les commentaires pour savoir ce qu'il en est. Mieux encore, ne l'utilisez pas du tout. Les requêtes paramétrées sont vos amies : http://php.net/manual/en/pdo.prepared-statements.php

1 votes

Pourquoi avez-vous besoin du preg_replace ? Est-ce que le str_replace suffisant ?

0 votes

Gabe : Le preg_replace dans ce cas était pour me permettre d'utiliser les plages qui me sont offertes dans les classes de caractères des expressions régulières. Sinon, il y aurait eu beaucoup plus de remplacements de chaînes dans ce cas.

8 votes

-1. Il n'incombe pas à une fonction de citation de manipuler les données - elle doit simplement s'assurer que la chaîne est dans un format tel qu'elle peut être ajoutée à une instruction SQL et survivre sans être modifiée.

17voto

Konstantin Points 36

Pourquoi s'embêter à échapper quoi que ce soit quand on peut utiliser des paramètres dans sa requête !

sqlsrv_query(
    $connection, 
    'UPDATE some_table SET some_field = ? WHERE other_field = ?', 
    array($_REQUEST['some_field'], $_REQUEST['id'])
)

Il fonctionne bien dans les sélections, les suppressions, les mises à jour, que vos paramètres de valeurs soient null ou non. Par principe, ne concaténer pas le SQL, vous êtes toujours en sécurité et vos requêtes se lisent beaucoup mieux.

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

11voto

alex Points 186293

Vous pourriez vous pencher sur le Bibliothèque PDO . Vous pouvez utiliser des instructions préparées avec PDO, qui échappera automatiquement les mauvais caractères dans vos chaînes de caractères si vous faites les instructions préparées correctement. Je pense que c'est seulement pour PHP 5.

0 votes

Avec certains des comportements débiles que j'ai vus avec PDO, je devrais faire des tests sérieux avant de lui faire confiance pour échapper correctement à toutes les données.

0 votes

@Chaos Vraiment ? Je ne suis pas au courant Avez-vous un lien vers un article ?

0 votes

Ce à quoi je pensais, c'est au problème que ce type a eu hier avec PDO. Un problème de transaction sans rapport, mais peu impressionnant. Combinez cela avec toute l'histoire de l'échappement inadéquat des données en PHP (php.net disant aux gens d'utiliser addslashes() !) et je deviens très suspicieux.

4voto

Une autre façon de gérer les guillemets simples et doubles est la suivante :

function mssql_escape($str)
{
    if(get_magic_quotes_gpc())
    {
        $str = stripslashes($str);
    }
    return str_replace("'", "''", $str);
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X