2013-05-16 10 views
6

Potrzebuję zweryfikować ciąg przychodzący dla tekstu <script.Jak znaleźć znacznik "<script>" z ciągu znaków przy użyciu JAVASCRIPT/wyrażenia regularnego

Przykład:
string a = "This is a simple <script> string"; 

Teraz muszę napisać wyrażenie regularne, że powie mi, czy ten ciąg zawiera <script> tag czy nie.

skończyło się pisać coś takiego: <* ?script.* ?>

Ale wyzwanie jest Przychodzący łańcuch może zawierać skrypt w następujący sposób,

string a = "This is a simple <script> string"; 
string a = "This is a simple < script> string"; 
string a = "This is a simple <javascript></javascript> string"; 
string a = "This is a simple <script type=text/javascript> string"; 

Stąd wyrażenie regularne ma sprawdzać począwszy < znacznik, a następnie powinien sprawdzić dla script.

+1

Proszę przeczytać ten https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet To może być bardzo istotne tutaj. – Prinzhorn

Odpowiedz

1

Przydaje się tu zanegowane character class.

<[^>]*script 
+0

Dzięki bodhizero. Znalazłem też coś podobnego, (% 3C * | <) [^ *]? Skrypt –

17

Zastosowanie:

/<script[\s\S]*?>[\s\S]*?<\/script>/gi 

@ odpowiedź bodhizero z dnia <[^>]*script nieprawidłowo zwraca true pod następującymi warunkami:

// Not a proper script tag. 
string a = "This is a simple < script> string"; 

// Space added before "img", otherwise the entire tag fails to render here. 
string a = "This is a simple < img src='//example.com/script.jpg'> string"; 

// Picks up "nonsense code" just because a '<' character happens to precede a 'script' string somewhere along the way. 
string a = "This is a simple for(i=0;i<5;i++){alert('script')} string"; 

Here is an excellent resource for building and testing regular expressions.

+0

A co, jeśli użyte zostanie kodowanie html. Tak więc ciąg musi być sprawdzony również w tym wyrażeniu: % 3Cscript [\ s \ S] *?% 3E [\ s \ S] *?% 3C \/script% 3E/gi Jeszcze jedna rzecz "i" należy stosować w przypadku niewrażliwości na wielkość liter. –

2

Rozwiązanie oparte regex Polecam jest następujący:

Regex rMatch = new Regex(@"<script[^>]*>(.*?)</script[^>]*>", RegexOptions.IgnoreCase & RegexOptions.Singleline); 
myString = rMatch.Replace(myString, ""); 

To wyrażenie regularne będzie poprawnie zidentyfikować i usunąć tagi skryptu w następujących ciągów:

<script></script> 
<script>something...</script> 
something...<ScRiPt>something...</scripT>something... 
something...<ScRiPt something...="something...">something...</scripT something...>something... 

A, nie będzie pasować dowolny z następujących niepoprawnych ciągów znaków:

< script></script> 
<javascript>something...</javascript> 
+0

Hej Jason, w jaki sposób użyłbyś negatywnego uprzedzenia z tym regxem? ie: Nie to. – yardpenalty

2

Spróbuj tego:

/(<|%3C)script[\s\S]*?(>|%3E)[\s\S]*?(<|%3C)(\/|%2F)script[\s\S]*?(>|%3E)/gi 
Powiązane problemy