2009-12-04 5 views
8

J'ai rencontré un problème où l'utilisateur entre des données et s'il y a des guillemets simples du tout, le script des erreurs.guillemets simples dans la chaîne avec jQuery ajax

Quelle est la meilleure façon de gérer les guillemets simples que les utilisateurs saisissent afin de ne pas interférer avec le jquery/javascript?

MISE À JOUR:

Je te l'envoie par ajax à une base de données. Voici le paramètre de données pour un appel json ajax. Le texte de la mise à jour étant la chaîne qui peut contenir les guillemets.
data: "{str_" + sectionName + " :'" + UpdateText + "',EntityID: '" + EntityID + "' }",

+2

Fournir un échantillon de code serait très utile –

+1

Que faites-vous avec l'entrée? –

+0

Je l'envoie par ajax à une base de données. Voici le paramètre de données pour un appel json ajax. données: "{str_" + sectionName + ": '" + UpdateText + "', EntityID: '" + EntityID + "'}", avec le texte de mise à jour étant la chaîne pouvant contenir les guillemets. – Adam

Répondre

3

Vous pouvez trouver une des nombreuses implémentations de String.replaceAll ou d'écrire vos propres, et juste remplacer des guillemets simples ou doubles avec une version échappée comme \ » ou

21

Vous avez besoin d'échapper les guillemets avec un \ ou en fonction de la façon dont vous prévoyez d'utiliser la chaîne, vous pouvez utiliser les fonctions javascript escape et unescape.

alert(escape("mike's")); 
alert(unescape(escape("mike's"))); 

Vérifiez également ceci des moyens de escape strings with jQuery

+0

Cela a fonctionné comme un charme! – CodeLikeBeaker

0

Si vous affichez simplement tout ce que l'utilisateur entre, votre application peut probablement être utilisée pour lancer un script inter-site. attaque

+1

pertinent xkcd http://xkcd.com/327/ – thenoviceoof

+0

Je pense que son problème est qu'il obtient une erreur javascript, côté client, tout en essayant d'envoyer des données au serveur. –

0

Javascript a une méthode intégrée juste pour cela qui couvre plus que de simples guillemets. Son appelé encodeURIComponent, de Javascript Kit:

utilisé pour coder la partie de paramètre d'un URI pour les caractères qui ont une signification particulière, pour les séparer des caractères réservés tels que « & » qui agissent comme séparateurs clé/valeur. Plus inclusif que encodeURI(), il encode tous les caractères ayant une signification particulière dans une chaîne d'URL, y compris "=" et "&". Utilisez cette méthode uniquement sur la partie de paramètre d'un URI; sinon, l'URI peut ne plus être valide s'il contient l'un des caractères qui font partie d'un URI valide (c'est-à-dire: "+") mais devrait être échappé s'il fait partie du paramètre URI.

donc votre code devrait devenir:

data: "{str_" + encodeURIComponent(sectionName) + " :'" + encodeURIComponent(UpdateText) + "',EntityID: '" + encodeURIComponent(EntityID) + "' }", 

J'encode tout ce que j'envoie dans une chaîne de requête pour être sûr, mais codant pour la EntityID pourrait sans doute être sautées parce qu'il ne vient pas de l'utilisateur (Je suppose), donc vous savez qu'il n'aura pas de caractères spéciaux.

+2

encodeURI et encodeURIComponent n'échapperont pas aux guillemets simples, du moins pas sur les versions actuelles de Chrome/Safari –

0

Merci à mbrevoort, je parler plus en détail sa réponse

lorsque vous envoyez un guillemet simple dans une requête empid = « T'via » empid = échappement (empid)

lorsque vous obtenez la valeur incluant une seule citation var xxx = request.QueryString ("empid") xxx = unscape (xxx)

Si vous souhaitez rechercher/insérer la valeur qui comprend un guillemet simple dans une requête xxx = Remplacer (empid, "'", " ''")

0

Pour échapper à une seule citation en Javascript utiliser

UpdateText.replace('\'', '\\\'') 

Pour échapper à toutes les apostrophes utilisent

UpdateText.replace(/'/g, '\\\'') 
3

Pour échapper à des valeurs dans la requête AJAX, ne pas écrire votre propre implémentation de l'e scape ou utiliser la méthode escape().(escape() est obsolète). Au lieu de cela, créez un objet JSON et utilisez la méthode JSON.stringify.

Pour votre cas, il devrait être comme (en ignorant la propriété dynamique pour l'instant):

//Create Javascript object  
var obj = { SectionName: UpdateText, EntityID: EntityID }; 

plus tard dans votre demande de paiement ajax vous pouvez faire:

data: JSON.stringify(obj), 

Si vous souhaitez utiliser dynamique propriétés avec votre objet JSON puis pour votre cas particulier, vous pouvez créer l'objet en deux étapes comme:

var obj = { EntityID: EntityID }; 
obj["str_" + sectionName] = UpdateText; 

Cette pratique vous évitera d'échapper manuellement des guillemets simples ou doubles et d'autres caractères non valides. JSON.stringify prendra soin de cela.

(je suis venu ici à la recherche d'un problème quelque peu similaire, mais n'a pas pu trouver une solution de travail appropriée, donc fini par l'affichage d'un ici)

1

Puisque vous avez mentionné AJAX, il est possible que les cordes impliquant des guillemets simples sont rejetés du côté du serveur. Assurez-vous d'utiliser escape string function fourni, par exemple par php, avant d'insérer des chaînes, dans la base de données.

$user_name = $_REQUEST['username']; 
$user_name = mysqli_real_escape_string($conn,$user_name); 
$query = "INSERT into chat(username,message) VALUES('".$user_name."')"; 

Cela permet d'échapper les guillemets simples ou doubles qui peuvent apparaître dans la chaîne '$ nom_utilisateur'. Aussi, il empêche contre tout type d'attaques SQL!

Questions connexes