0
votes

Quel est le meilleur, en utilisant IntTval () ou Sprintf ('% d')?

Je cherche une bonne réponse qui est préférable à utiliser entre IntTval () et Sprintf (% d ') surtout sur la désinfection des caractères indésirables? XXX PRE>

ou P>

function getOffsetLimit($offset, $max = 100) 
{
   $sql = sprintf(" LIMIT %d, %d", $offset, $max);
   return $sql
}


12 commentaires

Ne faites pas l'un ou l'autre de ces. Utilisez Déclarations préparées avec Paramètres liés . Voir Cette page et Ce message pour de bons exemples.


Ni: Mot-clé limite sur MySQL avec déclaration préparée


Dupliqué possible de Comment puis-je empêcher l'injection SQL dans PHP?


Vérifiez auprès de Regex pour des caractères exacts que vous autorisez à la place


@Andrew - Utiliser Regex pour cela serait une excédence extrême. Juste parce que vous peut faire quelque chose avec regex ne signifie pas que c'est une bonne idée. Limiter permet uniquement aux entiers que vous pouvez gérer très bien sans regex. Cependant, comme d'autres personnes ont mentionné, tout ce qui est le mauvais chemin de chaque sens.


Bonjour, je traite des codes hérités à ce moment-là. En supposant que je ne puisse pas utiliser une déclaration préparée, donnez-vous à l'exemple des codes ci-dessus, lequel est le meilleur? Merci.


Cela ne serait-il pas le moment idéal pour refroidir le code afin que vous puissiez l'utiliser?


Vous devez mettre tous les efforts pour la mise à niveau de PHP4 (en supposant que c'est la raison pour laquelle vous ne pouvez pas utiliser des déclarations préparées) et éloignez-vous des requêtes SQL concaténées.


prendrait des âges pour le faire ... L'ensemble du système utilisant legacy mysql_Query () fonctions ... estimé aura 5 ans pour le faire et tuera l'entreprise. En quelque sorte, nous sommes sur le processus de refactoring, mais nous sommes en ressources.


@camsy: Votre premier échantillon est sans danger pour l'integer s'échappant. Vous pouvez également essayer $ numéro = (int) $ string , c'est un alias pour intval fonction.


@ user1597430 merci ..


point est de jeter l'entrée de l'utilisateur sur une mauvaise idée entière, de donner une erreur et de les faire mettre dans un entier à la place


4 Réponses :



4
votes

Ni est meilleur. La solution appropriée serait d'utiliser Déclarations préparées avec Paramètres liés . Notez le troisième $ data_type argument pour pdostatement :: bindparam () - qui vous permet de filtrer les entiers.

Si vous insistez absolument sur la construction SQL avec des chaînes concaténées, j'utiliserais filtre_var () avec soit filtre_validate_int (si vous souhaitez abandonner lorsque les valeurs ne sont pas des entiers) ou filtre_sanitize_number_int (Si vous souhaitez convertir la valeur en un télécopieur entier raisonnable.)


3 commentaires

Ouais, "-5 + 3-8 + 7-" ou "------ ++++++" est incroyable fac-similé raisonnable entier - comme un fac-similé


Ni intval () ni printf () fonctionne pour ce cas, c'est pourquoi vous ne devez utiliser aucun d'entre eux.


Notez également que filtre_var () prend en charge les valeurs min / max arbitraires, vous permettant de limiter les positifs - que ni intval () ni printf () peut faire.



0
votes

Étant donné que la limite et le décalage ne fonctionnent pas avec des déclarations préparées, la meilleure méthode suivante consiste à utiliser filter_var () avec filtre_validate_int. Je pense que pour la limite et le décalage, filter_sanitize_number_int ne doit pas être utilisé.

Notez que vous ne pouvez pas avoir de compensation sans limite dans MySQL et le code ci-dessous est pour MySQL. P>

    function getLimitOffsetStatement($limit=null, $offset=null) {
        $sql = '';

        $filterOptions = ['options'=>['min_range' => 0]];
        if (filter_var($limit, FILTER_VALIDATE_INT, $filterOptions)) {
            $sql .= " LIMIT $limit";
            if (filter_var($offset, FILTER_VALIDATE_INT, $filterOptions)) {
                $sql .= " OFFSET $offset";
            }
        }

        return $sql;
    }


1 commentaires

C'est une approche géniale aussi ... merci.



0
votes

Si vous travaillez avec le code hérité, alors quelque chose aussi simple que cela fonctionnera ...

function build_sql_limit ( $total, $offset, $max = 100 )
{
    if ( ctype_digit ( $total ) )
    {
        $total = $total > $max ? $max : $total;
    }
    else
    {
        $total = $max;
    }

    if ( ! ctype_digit ( $offset ) )
    {
        $offset = NULL;
    }

    return ' LIMIT ' . ( is_null ( $offset ) ? $total : $offset . ', ' . $total );
}


0 commentaires