10
votes

Pourquoi ne pouvez-vous pas passer des fonctions MySQL dans des déclarations PDO préparées?

Dans mon esprit, le script devrait fonctionner:

$stmt->execute(array(1, $var));


1 commentaires

Les déclarations préparées sont utilisées pour Séparation de commandes et de données. Et vous ne pouvez pas annuler cette séparation et obtenir des données interprétées comme des déclarations SQL.


3 Réponses :


14
votes

Vous n'avez pas besoin de passer maintenant () en tant que paramètre car il n'est pas nécessaire de faire un traitement sur celui-ci, étant donné qu'il est une fonction SQL intégrée, il suffit donc de l'inclure dans le réel Requête comme ci-dessous. xxx

Vous pouvez simplement définir le date_modifié sur un champ horodatage et mettrea à jour automatiquement le champ date_modifié sur une mise à jour SQL.


7 commentaires

@Brad - merci, j'ai déjà un autre champ horodatage dans la base de données et l'appel est beaucoup plus qu'on () mais je modifierai en conséquence


Pour clarifier - je passe une valeur de valeur $ car la fonction peut changer entièrement pour que je pense toujours qu'il "pourrait" être une affaire d'injection?


Alors pourquoi avez-vous publié ce code? Vous devez publier le code actuel utilisé, si vous y passez une variable, affichez la variable réelle que vous utilisez (ou au moins des exemples de celui-ci comme maintenant () ne fonctionnera jamais comme vous l'avez ), comment vous utilisez maintenant () dans le scénario que vous avez publié n'a aucun sens.


@Brad F Jacobs - La logique est exactement la même quelle que soit la fonction que je posterai quand ils sont tous liés au temps. Une fonction utiliserait maintenant (), deux autres champs DateTime ne le feraient pas. La variable est définie sur égale () ou une autre fonction donc, oui, mon code et ma question sont toujours valables.


@ Jm4 dans la version mise à jour, où est-ce que $ var vient exactement? Est-ce qu'il est codé ou provient d'une source inconnue (poteau / cookie / get)? S'il est codé en dur, vous n'êtes pas vulnérable à l'injection SQL. S'il s'agit d'une source inconnue, votre seule autre option serait d'utiliser un type de méthode de validation pour la valider ou supprimer tous les caractères qui ne sont pas nécessaires, c'est-à-dire: '": \ / etc.": que vous ne vous attendriez pas à voir pour cette requête, via regex ou similaire.


@Brad - Var Var's Varure vient d'une série de variables de poste, donc par exemple: Si $ _Post ['date_selected']> date ('d'), puis $ var = 'maintenant ()'; Si $ _Post ['date_selected']]


@ JM4, étant donné que vous n'utilisez pas réellement les données post et vous définissez manuellement $ var , il n'y a aucune crainte pour que l'injection SQL ne se produise.



1
votes

Je suppose que le PDO suppose que "maintenant ()" est une chaîne et la joignez-la dans des guillemets lors de la collecte des paramètres de requête. Je voudrais simplement passer la date actuelle à l'aide de la date de la fonction PHP ('Y-M-D'), qui vous donnera les mêmes résultats.


0 commentaires

7
votes

Les déclarations préparées interprètent tout ce que vous insérez en eux comme une chaîne littérale. Ceci pour empêcher tout type d'injection SQL imprévisible.

Qu'est-ce qui se passe effectivement est que maintenant () tente d'être inséré dans la base de données exactement tel qu'il se lit (littéralement, maintenant () ) au lieu d'obtenir le réel Date d'insérer. Il ressort alors probablement vide dans votre base de données car vous avez une colonne de date, qui n'interprète pas maintenant () comme une date et ne l'accepte donc pas.

Si possible, vous devriez essayer d'exécuter le SQL sans utiliser de méthodes de substitution car il n'y a rien de dangereux pour cette approche.


2 commentaires

merci, voyez mon commentaire ci-dessous Brad ci-dessous. La variable que je suis "en fait" peut changer et peut être susceptible d'être une injection encore?


Si toutes vos valeurs $ var sont définies dans votre script PHP et non de sources externes, vous n'avez pas à vous soucier de toute sorte d'injection.