【项目问题】如何校验表单中的特殊字符? 本帖最后由 mycdsnstudy 于 2012-03-11 13:20:59 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 http://blog.csdn.net/linlzk/article/details/3389919 为什么要检验呢?防sql注入,jdbc的preparedStatement就行啦。hibernate的setParameter也可以放注入啊。js和html脚本,显示的时候把< > 替换成 &lt;&gt;就行啦,或者用struts1/2标签或jstl标签来显示就行啦。<c:out escapeXML="true"/><bean:writer filter="true"/><s:property escape="true"/> Wep application安全方面的框架,你可以看看owasp 的esapi,再結合jdk 的jce,對web前端的各種非法輸入等等都可以做到安全限制。 用表单校验插件啊,jquery-easy-ui就不错,可以自己扩展。nullCheck: {/* 不允许输入空 */ validator: function (value, param) { return !(/^((A-Za-z\d[-_\~!@#\$%\^&\*\.\(\)\[\]\{\}<>\?\\\/\'\"]*))$|\s/.test(value)); }, message: '请正确输入' },nameCheck: { validator: function (value, param) { if(value.substring(0,1)!=" "&&value.substring(value.length-1,value.length)!=" "){ if(value.length <= 32){ return /^[\u3220-\uE76c\uE815-\uFA29\w, %]+$/.test(value); }else{ return false; } }else{ return false; } }, message: '您的输入不合法' },........然后在所有你需要校验的地方将key引进来就ok啦<td class="widget_td"> <input type="text" name="userStandbyName" id="userStandbyName" class="easyui-validatebox" validType="nameCheck" value="${userStandbyName}" msg="用户别名" max="13" /> </td> 可以写个过滤器filter吧,把提交的特殊字符转换普通字符 我发现,我自己写的和他那个也挺像,不过校验的范围比他那个宽一点,可以校验HTML标签、特殊标点符号、SQL关键字、敏感字符 因为是用公司自己的framework,所以集成struts不太可行 /** * 規範化input,從配置文件中取出的屬性取反,例如:配置如下則執行 this.canonicalize(input,true,true); * Encoder.AllowMultipleEncoding=false * Encoder.AllowMixedEncoding=false * @param input 輸入的字符串 * @return String * */ public static String canonicalize(String input) { return ESAPI.encoder().canonicalize(input); } /** * 規範化input 相當於執行 this.canonicalize(input,strict,strict); * @param input 輸入的字符串 * @param strict 是否需要檢測 多種編碼和混合編碼 * @return String * */ public static String canonicalize(String input, boolean strict) { return ESAPI.encoder().canonicalize(input, strict); } /** * 規範化input 相當於執行 this.canonicalize(input,strict,strict); * @param input 輸入的字符串 * @param restrictMultiple 是否需要檢測多種編碼 * @param restrictMixed 是否需要檢測混合編碼 * @return String * */ public static String canonicalize(String input, boolean restrictMultiple, boolean restrictMixed) { return ESAPI.encoder().canonicalize(input, restrictMultiple, restrictMixed); } /** * 將字符串解碼成字節集 (編碼方式為:Base64) * @param input 輸入的字符串 * @return byte[] * */ public static byte[] decodeFromBase64(String input) throws Exception { return ESAPI.encoder().decodeFromBase64(input); } /** * 解碼特殊字符為對應的URL實體 * @param input 輸入的字符串 * @return String * */ public static String decodeFromURL(String input) throws Exception { return ESAPI.encoder().decodeFromURL(input); } /** * 解碼特殊字符為對應的HTML實體,如 '<'轉換成'<'等 * @param input 輸入的字符串 * @return String * */ public static String decodeForHTML(String input) { return ESAPI.encoder().decodeForHTML(input); } /** * 將字節集轉碼成字符串 (編碼方式為:Base64) * @param input 輸入的字節集 * @param wrap 是否換行 * @return String * */ public static String encodeForBase64(byte[] input, boolean wrap) { return ESAPI.encoder().encodeForBase64(input, wrap); } /** * 將字符串中的URL實體轉換為其對應的字符 * @param input 輸入的字符串 * @return String * */ public static String encodeForURL(String input) throws Exception { return ESAPI.encoder().encodeForURL(input); } /** * 將字符串中的HTML實體轉換為其對應的字符,如 '<'轉換成 '<'等 * @param input 輸入的字符串 * @return String * */ public static String encodeForHTML(String input) { return ESAPI.encoder().encodeForHTML(input); } /** * Encode data for use in HTML attributes. * @param input 輸入的字符串 * @return String * */ public static String encodeForHTMLAttribute(String input) { return ESAPI.encoder().encodeForHTMLAttribute(input); } /** * 將字符串中的CSS實體轉換為其對應的字符 * @param input 輸入的字符串 * @return String * */ public static String encodeForCSS(String input) { return ESAPI.encoder().encodeForCSS(input); } /** * 將字符串中的JavaScript實體轉換為其對應的字符 * @param input 輸入的字符串 * @return String * */ public static String encodeForJavaScript(String input) { return ESAPI.encoder().encodeForJavaScript(input); } /** * Encode data for use in LDAP queries. * @param input 輸入的字符串 * @return String * */ public static String encodeForLDAP(String input) { return ESAPI.encoder().encodeForLDAP(input); } /** * Encode data for use in an LDAP distinguished name. * @param input 輸入的字符串 * @return String * */ public static String encodeForDN(String input) { return ESAPI.encoder().encodeForDN(input); } /** * Encode data for use in an XPath query. * @param input 輸入的字符串 * @return String * */ public static String encodeForXPath(String input) { return ESAPI.encoder().encodeForXPath(input); } /** * Encode data for use in an XML element. * @param input 輸入的字符串 * @return String * */ public static String encodeForXML(String input) { return ESAPI.encoder().encodeForXML(input); } /** * Encode data for use in an XML attribute. * @param input 輸入的字符串 * @return String * */ public static String encodeForXMLAttribute(String input) { return ESAPI.encoder().encodeForXMLAttribute(input); } /** * Encode data for insertion inside a data value in a Visual Basic script. * @param input 輸入的字符串 * @return String * */ public static String encodeForVBScript(String input) { return ESAPI.encoder().encodeForVBScript(input); } 那这些特殊,应该允许插入到数据库吧,只是显示的时候,不允许运行js和html吧。。只要把< > replaceAll掉就行啦。。 I’m a man这是我写的工具类,封装了ESAPI相关东西 求一个算法????????? 开源自主研发搜索引擎,单机400万网页,任意50词以内检索不超过20毫秒 寻求批量打印插件 jsp页面中多列排序的问题-急!非常急! 求助:中国象棋网站BS架构 兄弟们,我要自杀了,进来救救兄弟吧!!!!!(连接池的一个CLASS) tomcat分割日志文件 SourceMed project是啥意思啊? 简单问题,数据格式 这样为什么连不上数据库?请指点! javaScript = == ===区别 怎么隐藏Mysql数据库中一个字段 JSP+Struts1.2
js和html脚本,显示的时候把< > 替换成 &lt;&gt;就行啦,或者用struts1/2标签或jstl标签来显示就行啦。
<c:out escapeXML="true"/>
<bean:writer filter="true"/>
<s:property escape="true"/>
nullCheck: {/* 不允许输入空 */
validator: function (value, param) {
return !(/^((A-Za-z\d[-_\~!@#\$%\^&\*\.\(\)\[\]\{\}<>\?\\\/\'\"]*))$|\s/.test(value));
},
message: '请正确输入'
},
nameCheck: {
validator: function (value, param) {
if(value.substring(0,1)!=" "&&value.substring(value.length-1,value.length)!=" "){
if(value.length <= 32){
return /^[\u3220-\uE76c\uE815-\uFA29\w, %]+$/.test(value);
}else{
return false;
}
}else{
return false;
}
},
message: '您的输入不合法'
},
........
然后在所有你需要校验的地方将key引进来就ok啦
<td class="widget_td">
<input type="text" name="userStandbyName" id="userStandbyName"
class="easyui-validatebox"
validType="nameCheck" value="${userStandbyName}" msg="用户别名"
max="13" />
</td>
因为是用公司自己的framework,所以集成struts不太可行
/**
* 規範化input,從配置文件中取出的屬性取反,例如:配置如下則執行 this.canonicalize(input,true,true);
* Encoder.AllowMultipleEncoding=false
* Encoder.AllowMixedEncoding=false
* @param input 輸入的字符串
* @return String
* */
public static String canonicalize(String input) {
return ESAPI.encoder().canonicalize(input);
}
/**
* 規範化input 相當於執行 this.canonicalize(input,strict,strict);
* @param input 輸入的字符串
* @param strict 是否需要檢測 多種編碼和混合編碼
* @return String
* */
public static String canonicalize(String input, boolean strict) {
return ESAPI.encoder().canonicalize(input, strict);
}
/**
* 規範化input 相當於執行 this.canonicalize(input,strict,strict);
* @param input 輸入的字符串
* @param restrictMultiple 是否需要檢測多種編碼
* @param restrictMixed 是否需要檢測混合編碼
* @return String
* */
public static String canonicalize(String input, boolean restrictMultiple, boolean restrictMixed) {
return ESAPI.encoder().canonicalize(input, restrictMultiple, restrictMixed);
}
/**
* 將字符串解碼成字節集 (編碼方式為:Base64)
* @param input 輸入的字符串
* @return byte[]
* */
public static byte[] decodeFromBase64(String input) throws Exception {
return ESAPI.encoder().decodeFromBase64(input);
}
/**
* 解碼特殊字符為對應的URL實體
* @param input 輸入的字符串
* @return String
* */
public static String decodeFromURL(String input) throws Exception {
return ESAPI.encoder().decodeFromURL(input);
}
/**
* 解碼特殊字符為對應的HTML實體,如 '<'轉換成'<'等
* @param input 輸入的字符串
* @return String
* */
public static String decodeForHTML(String input) {
return ESAPI.encoder().decodeForHTML(input);
}
/**
* 將字節集轉碼成字符串 (編碼方式為:Base64)
* @param input 輸入的字節集
* @param wrap 是否換行
* @return String
* */
public static String encodeForBase64(byte[] input, boolean wrap) {
return ESAPI.encoder().encodeForBase64(input, wrap);
}
/**
* 將字符串中的URL實體轉換為其對應的字符
* @param input 輸入的字符串
* @return String
* */
public static String encodeForURL(String input) throws Exception {
return ESAPI.encoder().encodeForURL(input);
}
/**
* 將字符串中的HTML實體轉換為其對應的字符,如 '<'轉換成 '<'等
* @param input 輸入的字符串
* @return String
* */
public static String encodeForHTML(String input) {
return ESAPI.encoder().encodeForHTML(input);
}
/**
* Encode data for use in HTML attributes.
* @param input 輸入的字符串
* @return String
* */
public static String encodeForHTMLAttribute(String input) {
return ESAPI.encoder().encodeForHTMLAttribute(input);
}
/**
* 將字符串中的CSS實體轉換為其對應的字符
* @param input 輸入的字符串
* @return String
* */
public static String encodeForCSS(String input) {
return ESAPI.encoder().encodeForCSS(input);
}
/**
* 將字符串中的JavaScript實體轉換為其對應的字符
* @param input 輸入的字符串
* @return String
* */
public static String encodeForJavaScript(String input) {
return ESAPI.encoder().encodeForJavaScript(input);
}
/**
* Encode data for use in LDAP queries.
* @param input 輸入的字符串
* @return String
* */
public static String encodeForLDAP(String input) {
return ESAPI.encoder().encodeForLDAP(input);
}
/**
* Encode data for use in an LDAP distinguished name.
* @param input 輸入的字符串
* @return String
* */
public static String encodeForDN(String input) {
return ESAPI.encoder().encodeForDN(input);
}
/**
* Encode data for use in an XPath query.
* @param input 輸入的字符串
* @return String
* */
public static String encodeForXPath(String input) {
return ESAPI.encoder().encodeForXPath(input);
}
/**
* Encode data for use in an XML element.
* @param input 輸入的字符串
* @return String
* */
public static String encodeForXML(String input) {
return ESAPI.encoder().encodeForXML(input);
}
/**
* Encode data for use in an XML attribute.
* @param input 輸入的字符串
* @return String
* */
public static String encodeForXMLAttribute(String input) {
return ESAPI.encoder().encodeForXMLAttribute(input);
}
/**
* Encode data for insertion inside a data value in a Visual Basic script.
* @param input 輸入的字符串
* @return String
* */
public static String encodeForVBScript(String input) {
return ESAPI.encoder().encodeForVBScript(input);
}
那这些特殊,应该允许插入到数据库吧,只是显示的时候,不允许运行js和html吧。。只要把< > replaceAll掉就行啦。。
I’m a man
这是我写的工具类,封装了ESAPI相关东西