Y a-t-il une fonction ou une bibliothèque qui peut être utilisée pour nettoyer l'entrée de l'utilisateur. Comme par exemple, si l'utilisateur saisit un texte appelé Baily's code>, je devrais échapper au ' code> avant de l'envoyer à la requête MySQL. De même, je devrais pouvoir filtrer des caractères nuls et \ n, \ t, \ r, etc. Comme dans PHP, nous avons mysql_real_escape_string ($ entrée) code> Y a-t-il quelque chose à Java pour faire cela? p>
5 Réponses :
Vous devez utiliser PréparéStatement et définir Les valeurs de La raison de l'utilisation d'utiliser entrée code> à l'aide de la fonction SETString code>. p>
préparé (code> est une base de données que chaque base de données peut avoir besoin d'échapper à différentes choses. Cette complexité est cachée dans la mise en œuvre concrète de préparetstatement code> fourni par le fournisseur de base de données. P>
en Java, vous ne le faites généralement pas à la main.
Au lieu de cela, vous utiliserez un Paretstatement code> et transmettez-les dans tous les arguments de votre relevé SQL via explicite SETString () code> ou SetObject () code> méthodes. p>
De cette façon, le pilote JDBC le gérera (en faisant l'évanouissement nécessaire ou en envoyant l'instruction SQL former séparément les arguments, en fonction de Sur la base de données). p>
Par exemple, votre code pourrait ressembler à celui (en utilisant préparation ARESTATIMENT () CODE> ): P>
Connection c = ...; // get Connection from somehwere
PreparedStatement stmt = c.prepareStatement("SELECT * FROM BOOKS WHERE TITLE = ?");
stmt.setString(1, userInput);
ResultSet result = stmt.executeQuery();
Vous utilisez des déclarations préparées avec des espaces réservés pour cela. Voir http://download.oracle.com/javase/tatuuteur/jdbc/ Principes de base / préparé.html p>
Tout comme si vous devriez en PHP: http://php.net/manual /en/pdo.prepared-statifs.php p>
Je veux dire aucune infraction lorsque je dis que seuls les idiots utiliseraient mysql_real_escapape_string code> en faveur des déclarations préparées avec des espaces réservés. P>
L'échappement que vous utilisez est spécifique pour le système que vous souhaitez utiliser la chaîne. Si vous utilisez MySQL, vous devez effectuer différentes échappées que si vous souhaitez utiliser la chaîne dans un morceau de JavaScript. P>
Pour répondre à votre question, nous devons savoir comment vous voulez échapper à votre chaîne. Les chances sont que vous n'avez pas besoin d'échapper à la chaîne avant de l'utiliser dans un contexte de la base de données. Par exemple, si vous utilisez Queries préparées , vous n'avez pas besoin d'échapper à vos valeurs. p>
Réponse courte, non, à l'exception des définitions très spécifiques de "Clean". À l'heure actuelle, vous devez utiliser une solution spécifique à une langue - pour SQL, utilisez simplement une déclaration préparée.
Réponse plus longue, il y a eu des travaux récents sur les désinfectants de chaîne automatique qui déterminent comment intégrer la teneur en texte brut en toute sécurité et correctement dans le contenu. Dans d'autres langues. P>
Les échappeurs automatiques de contextuels automatiques existent pour HTML dans des langages de modèle tels que SOY , Go , une variante de < Un href = "https://github.com/mikesamuel/jquery-jquerer-tmpl-proplosal" rel = "Nofollow NOREFERRER"> JQuery , Ctemplatés, ClearSilver et espérons-le bientôt d'autres. P>
Il y a des recherches sur la généralisation de cela afin qu'il puisse facilement être étendu à d'autres langues. Une idée que je travaille est en train de prendre une grammaire annotée décrivant une langue cible comme SQL et de déterminer ce que l'évacuation doit être effectuée pour les trous pouvant être remplis de données utilisateur. P>
donné une grammaire comme Le ci-dessous qui inclut des annotations qui montrent comment la structure des cartes de données vers des substrings dans la langue: p> Nous pouvons construire une machine d'état comme ci-dessous: p> qui convertit des séquences d'événements (Démarrer, start_Object, start_key, start_key, caractère 'x', ...) dans les instructions qui codent des caractères sur un tampon. p> à partir de cette machine d'état, nous pouvons également générer des traces génériques d'instructions à utiliser pour générer du code efficace pour les codeurs, et espérons-le que le contexte Algorithmes d'analyse qui déterminent les codeurs à appliquer quand. P> Si cela fonctionne, il faciliterait l'intégration de langages de programmation à usage général, des mécanismes pour automatiquement et sécurisé Composition de contenu dans des langues telles que SQL, HTML, etc. avec des modifications aux définitions de langue pour autoriser
p> exécuté_query code> pour trouver les limites entre le contenu spécifié par programmateur et le contenu injecté dans Execute_Query ("Sélectionner * à partir de la table Où id = $ ID ") code> et utilisez celles-ci pour échapper automatiquement au contenu injecté, nous pouvons rendre cette idiome juste fonctionner car le programmeur entend. P> p>
Si vous utilisez une couche ORM (qui est une pratique courante en Java) ou même simplement des instructions avec des paramètres nommés ou énumérées, l'évacuation des paramètres SQL sera effectué automatiquement pour vous. Tant que vous ne concaturez pas manuellement des cordes de concaténage manuellement pour construire vos requêtes, vous devriez être en sécurité.
Voir aussi: b>
JDBC - Comment échapper aux paramètres fournis par l'utilisateur avec une requête SQL code>