2012-04-30 154 views
2

让我提出我的问题简单的我想要的是我使用白名单正则表达式模式,以避免xss和sql注入,因为我允许的字符串是[A-Za-z0-9,() [] {} \“\:./_ \ s],我想限制 - 来自客户端的任何请求的发生,但它应该允许 - 或jjdfasd-dsfads-12321字符串正则表达式模式来验证字符串

简而言之,案件应该成功运行

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/[email protected]#[email protected][email protected]#%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

”允许多次出现A-Z 0-9和a-z,但( - )出现的只有零或一个字符串。“我无法理解这一点,这句话自相矛盾。 – jon

+1

你提出的正则表达式中的反斜线狂欢是什么? – ddaa

+0

@Harshil - 你想要你的正则表达式匹配上面的字符串还是放弃它们?他们远离A-ZA-Z0-9,只有一个冲刺...并请解释斜杠。 –

回答

2

您当前的正则表达式匹配

  • 由单个-字符的字符串,或
  • 由字母,数字和一些特殊的字符序列的字符串,或
  • 一个空字符串

,如果您喜欢将其更改为仅允许零个或一个破折号-在字符串的开头,从您的表达式中删除字符|;如果你想在字符串中的任何位置匹配最多一个破折号,改变表达

[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注入攻击;使用参数化语句是。 “

+0

感谢您的快速响应,但仍然不能满足我的上述测试用例类 – Harshil

+0

我只是[在ideone上运行您的代码](http://ideone.com/7pNL2),并且它产生了一个很好的答案序列:首先是一场比赛,第二场比赛和第三场比赛都没有,因为两者都有两个破折号。四有无效字符(@,#,$,%),第五没有非法字符或破折号,所以它匹配;第六是双重冲刺,第七场比赛罚款。 – dasblinkenlight

+0

我想要的是我的第三个字符串应该匹配,因为没有两个连续的 - – Harshil