让我提出我的问题简单我想要的是我使用白名单正则表达式模式以避免xss和sql注入,因为我在字符串中允许的字符是[A-Za-z0-9,()[] {} \ “\:./_ \ s]我希望在客户端的任何请求中限制 - 的出现,但它应该允许 - 或者jjdfasd-dsfads-12321 string
简而言之,下面的测试用例应该成功运行
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));
}
}
答案 0 :(得分:2)
您当前的正则表达式匹配
-
字符或如果您想将其更改为仅在字符串的开头允许零或一个短划线-
,请从表达式中删除 OR 字符|
;如果您想在字符串中的任何位置匹配最多一个短划线,请将表达式更改为
[A-Za-z0-9,\\(\\)\\[\\]\\{\\}\"\\:./_\\s]*-?[A-Za-z0-9,\\(\\)\\[\\]\\{\\}\"\\:./_\\s]*
编辑1:如果您需要避免两个连续的破折号,可以将此表达式与negative lookbehind一起使用:
([A-Za-z0-9,\\(\\)\\[\\]\\{\\}\"\\:./_\\s]|(?<!-)-)*
上面表达式的(?<!-)-
部分与短划线匹配,除非它前面有另一个破折号。
编辑2:如果你有10000+长度的字符串,正面的正则表达式解决方案不如负面的解决方案。不是寻找myString.matches(positiveExpr)
,而是查找!myString.matches(negativeExpr)
更有效,并将此表达式用于您的否定匹配。换句话说,您可以为不需要的字符串定义更简单的表达式,而不是指定定义所需字符串的表达式:
[^A-Za-z0-9,\\(\\)\\[\\]\\{\\}\"\\:./_\\s]|--
注意:清理字符串并不是避免SQL注入攻击的最佳方法;使用参数化语句是。