Regex 用于验证字符串的正则表达式模式
让我把我的问题简单一点,我想要的是我使用白名单正则表达式模式来避免xss和sql注入,因为字符串中允许的字符是[A-Za-z0-9,()[]{}\”\:./\uS],我想限制在来自客户机的任何未来请求中出现-,但它应该允许-或jjdfasd-dsfads-12321字符串 简而言之,下面的测试用例应该成功运行Regex 用于验证字符串的正则表达式模式,regex,Regex,让我把我的问题简单一点,我想要的是我使用白名单正则表达式模式来避免xss和sql注入,因为字符串中允许的字符是[A-Za-z0-9,()[]{}\”\:./\uS],我想限制在来自客户机的任何未来请求中出现-,但它应该允许-或jjdfasd-dsfads-12321字符串 简而言之,下面的测试用例应该成功运行 import java.util.regex.Pattern; public class RegExTest { private static Pattern xssAttackPa
import java.util.regex.Pattern;
public class RegExTest {
private static Pattern xssAttackPattern;
private static final String XSS_ATTACK_REGULAR_EXPRESSION1 = "-?[A-Za-z0-9,\\(\\)\\[\\]\\{\\}\"\\:./_\\s]*";
public static Pattern getXSSAttackPattern1() {
xssAttackPattern = Pattern.compile(XSS_ATTACK_REGULAR_EXPRESSION1);
return xssAttackPattern;
}
public static boolean hasXSSAttackOrSQLInjection1(String value) {
if (getXSSAttackPattern1().matcher(value).matches()) {
return true;
}
return false;
}
public static void main(String arg[]) {
System.out.println(" :::::: Regular Expression ::::::");
regexTest();
}
private static void regexTest() {
String str1 = "-dsfdsfddsfd2112212s";
String str2 = "--dsfdsfddsfd2112212s";
String str3 = "-dsfdsfdd-sfd2112212s";
String str4="http://rss.cnn.com/rss/edition_business.rss?id=121132511$@#$@$@#%242444+gfghgfhg";
String str5="(.:[]{}";
String str6="--";
String str7="-";
System.out.println("String::" + str1 + "::Result::"
+ hasXSSAttackOrSQLInjection1(str1));
System.out.println("String::" + str2 + "::Result::"
+ hasXSSAttackOrSQLInjection1(str2));
System.out.println("String::" + str3 + "::Result::"
+ hasXSSAttackOrSQLInjection1(str3));
System.out.println("String::" + str4 + "::Result::"
+ hasXSSAttackOrSQLInjection1(str4));
System.out.println("String::" + str5 + "::Result::"
+ hasXSSAttackOrSQLInjection1(str5));
System.out.println("String::" + str6 + "::Result::"
+ hasXSSAttackOrSQLInjection1(str6));
System.out.println("String::" + str7 + "::Result::"
+ hasXSSAttackOrSQLInjection1(str7));
}
}您当前的正则表达式匹配
- 由单个
字符组成的字符串,或-
- 由一系列字母、数字和一些特殊字符组成的字符串,或
- 空字符串
-
,请从表达式中删除或字符|
;如果要在字符串中的任何位置最多匹配一个破折号,请将表达式更改为
[A-Za-z0-9,\\(\\)\\[\\]\\{\\}\"\\:./_\\s]*-?[A-Za-z0-9,\\(\\)\\[\\]\\{\\}\"\\:./_\\s]*
编辑1:如果需要避免两个连续的破折号,可以将此表达式用于:
注意:清理字符串不是避免SQL注入攻击的最佳方法;使用参数化语句是。“允许A-Z 0-9和A-Z多次出现,但(-)只在字符串中出现零或一次。“我不明白这一点,这句话自相矛盾。你提议的regexp中的反斜杠狂欢是怎么回事?”@Harshil-那么你希望你的regex匹配上述字符串还是丢弃它们?他们离A-Za-z0-9很远,只有一个破折号。。。谢谢你的快速回复,但它仍然不能满足我上面的测试用例classI just的要求,并且它产生了一个很好的答案序列:第一个是匹配的,第二个和第三个不是,因为它们都有两个破折号。第四个有无效字符(@、#、$、%),第五个没有非法字符或破折号,因此匹配;第六个是双破折号,第七个可以匹配。我想要的是我的第三个字符串应该匹配,因为没有两个连续的-@Harshil我不知道你在寻找连续破折号。请看一下我的编辑。您好,因为我对您给定的Regex模式非常大的字符串(约14965个字符)有问题,这是从一些文件中读取的。我有与此链接中相同的失败跟踪
([A-Za-z0-9,\\(\\)\\[\\]\\{\\}\"\\:./_\\s]|(?<!-)-)*
[^A-Za-z0-9,\\(\\)\\[\\]\\{\\}\"\\:./_\\s]|--