2009-08-04 9 views
7

Buduję ciąg na serwerze, który dostaje się do zmiennej javascript na kliencie.Kodowanie apostrofa

co jest najlepszym kodowania to, aby uniknąć wszelkich problemów

teraz na serwerze robię coś takiego:

html = html.Replace("'", "'"); 

ale zakładam, że jest bardziej elegancki dowód głupi sposób robienie takich rzeczy.

Odpowiedz

10

Naprawdę lepiej wykorzystać do tego celu Microsoft Anti-Cross Site Scripting Library. Zapewniają one metodę JavaScriptEncode że robi to, co chcesz:

Microsoft.Security.Application.AntiXss.JavaScriptEncode("My 'Quotes' and ""more"".", False) 
+0

Nie zapomnij o przywróceniu znaczenia go na front-end jeśli chcesz go użyć na przykład w polu alertu. –

+0

Pakiet Nuget: http://nuget.org/packages/AntiXSS/ –

1

Nie jestem pewien, w jakim kontekście używasz ten ciąg, ale \' może być to, czego szukasz. Odwrotny ukośnik jest postacią ucieczki i pozwala używać certain characters, której nie można w inny sposób znaleźć w literałach łańcuchowych. To właśnie wyjście JavaScript powinna wyglądać następująco:

alert('It\'s amazing'); 

Oczywiście, można użyć alert("It's amazing"); w tym konkretnym przypadku.

W każdym razie, jeśli budujesz kod JavaScript:

html = html.Replace("'", "\\'"); 

Z drugiej strony, istnieją inne znaki oprócz apostrofami, które potrzebują niektóre przetwarzania. Korzystanie z Microsoft Anti-Cross Site Scripting Library spowoduje, że wszystkie z nich naraz.

0

Znaki, które należy ująć w wartości ciągu, to ukośnik odwrotny i znak używany jako ogranicznik łańcucha znaków.

Jeśli apostrofy (') są stosowane jako ciąg ogranicznika:

html = html.Replace(@"\", @"\\").Replace("'", @"\'"); 

Jeżeli cudzysłów (") są wykorzystywane jako ciąg ogranicznika:

html = html.Replace(@"\", @"\\").Replace(@"""", @"\"""); 

Jeśli nie wiesz, jaki jest ogranicznik używany, lub jeśli może się zmienić w przyszłości, można po prostu uciec zarówno:

html = html.Replace(@"\", @"\\").Replace("'", @"\'").Replace(@"""", @"\"""); 
1
html = html.Replace("'", "%27"); 
1

Zauważyłem, że biblioteka AntiXSS nie była w stanie osiągnąć tego, czego szukałem, co miało na celu kodowanie strony serwera i dekodowanie w javascript.

Zamiast Kiedyś Microsoft.JScript.dll, który pozwala na:

GlobalObject.escape(string); 

i po stronie klienta w javascript:

unescape(string);