系统很多Url地址都暴露给用户,存在安全隐患,用户可以去随意修改Url地址和参数值,为了解决这个问题提供以下解决方案,具体步骤如下:
第一步:编码URL地址,调用CommonMethod.js的rewriteUrl方法,对Url地址进行Base64编码。
例如:
var url = basePath + "/testAction.do?ExeMethod=query&a=中国&b=2&c=3";
url = rewriteUrl(url); //Base64转码
转码前:
http://localhost:9080/demo/testAction.do?ExeMethod=query&a=中国&b=2&c=3
转码后:
http://localhost:9080/demo/dGVzdEFjdGlvbg==_ZG8=_RXhlTWV0aG9kPXF1ZXJ5JmE95Lit5Zu9JmI9MiZjPTM=.shtml
rewriteUrl方法JS代码:
/**
* 重写Url地址
* @param url
*/
function rewriteUrl(url){
var urlStr = "";
if(typeof(enableUrlEncrypt) != "undefined" && enableUrlEncrypt && enableUrlEncrypt != null && enableUrlEncrypt === "1"){
var queryStr = "";
var index = url.indexOf("?");
if(index != -1){
urlStr = url.substring(0, index);
queryStr = url.substring(index + 1);
}else{
urlStr = url;
}
$.base64.utf8encode = true;
index = urlStr.indexOf(".");
var suffix = urlStr.substring(index + 1);
if(index != -1 && suffix.toLowerCase() != "html"){
var idx = urlStr.lastIndexOf("/");
var prefix = "";
if(idx != -1 && idx < index){
prefix = urlStr.substring(idx + 1, index);
urlStr = urlStr.substring(0, idx);
}else{
urlStr = urlStr.substring(0, index);
}
if(prefix != ""){
urlStr += "/" + $.base64.btoa(prefix).replace(/\//g, ':');
}
if(queryStr != ""){
queryStr = encodeURI(queryStr);
queryStr = $.base64.btoa(suffix) + "_" + $.base64.btoa(queryStr);
queryStr = queryStr.replace(/\//g, ':');
}else{
queryStr = $.base64.btoa(suffix);
queryStr = queryStr.replace(/\//g, ':');
}
urlStr = urlStr + "_" + queryStr + ".shtml";
}
queryStr = null;
}else{
urlStr = url;
}
return urlStr;
}
第二步:解码URL地址并跳转,创建一个过滤器XssFilter,具体如下:
web.xml文件中增加过滤器配置:
<!-- 跨站恶意脚本攻击(XSS)过滤器 -->
<filter>
<filter-name>XssFilter</filter-name>
<filter-class>com.spsoft.eintmgr.servlet.XssFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>XssFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
过滤器代码:
public class XssFilter implements Filter{
private static String[] openUrls = null; //跳过xss过滤的uri地址
public void destroy() {}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest)request;
String uri = req.getRequestURI();
int stIndex = uri.lastIndexOf("/");
int edIndex = uri.indexOf(".shtml");
String url = uri;
if(stIndex != -1 && edIndex != -1 && stIndex < edIndex){
String temp = uri.substring(stIndex + 1, edIndex);
String tempArr[] = temp.split("_");
String prefix = new String(Base64.decodeBase64(tempArr[0].getBytes()));
if(tempArr.length == 2){
temp = new String(Base64.decodeBase64(tempArr[1].getBytes()));
}else if(tempArr.length > 2){
temp = new String(Base64.decodeBase64(tempArr[1].getBytes()));
temp += "?" + new String(Base64.decodeBase64(tempArr[2].getBytes("GBK")), "UTF8");
}else{
temp = "";
}
url = uri.substring(0, stIndex) + "/" + prefix + "." + temp;
int index = uri.indexOf("?");
if(index != -1){
uri = url.substring(0, index);
}else{
uri = url;
}
}
int index = url.lastIndexOf("/");
if(index != -1 && index < url.length()){
url = url.substring(index + 1);
}
if(null != openUrls && openUrls.length > 0){
for(int i = 0; i < openUrls.length; i++){
if(uri.indexOf(openUrls[i]) != -1){ //包含跳过xss过滤的url地址,就不过滤
req.getRequestDispatcher(url).forward(req, response);
return;
}
}
}
req.getRequestDispatcher(url).forward(new RequestWrapper(req), response);
}
public void init(FilterConfig filterConfig) throws ServletException {}
}
第三步:跳转后可以获取各参数的值,例如:
@Controller
@RequestMapping("/testAction.do")
public class TestAction extends BasicAction {
@RequestMapping(params = "ExeMethod=query")
public String query(Model model, HttpServletRequest request, HttpServletResponse response) {
System.out.println("-->a:"+ request.getParameter("a"));
System.out.println("-->b:"+ request.getParameter("b"));
System.out.println("-->c:"+ request.getParameter("c"));
return "index";
}
}
打印结果:
16:13:17,415 INFO [STDOUT] -->a:中国
16:13:17,416 INFO [STDOUT] -->b:2
16:13:17,416 INFO [STDOUT] -->c:3
桔妹导读: LogI-KafkaManager脱胎于滴滴内部多年的Kafka运营实践经验,是面向Kafka用户、Kafka运维人员打造的共享多租户Kafka云平台。专注于Kafka运维管...
昨天重装了win10系统,发现以前配好的java环境变量和tomcat环境变量全都清空了,在重新配置的时候总是出现问题,即在cmd命令窗口下,输入java,显示正常,输入java -version 也是显示正常,唯独输入javac,显示“javac不是内部或外部命令,布拉布拉一些的问题”,然后我就开始各种百度各种谷歌,终于在大半夜把这个问题搞定了。。。下面来说说这个问题的解决办法,其实很简单:
场景SpringBoot+MySql+ElementUI实现一对多的数据库的设计以及增删改查的实现https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/107971394上面讲了app应用对应权限实现一对多的逻辑。如果一对多多的那层再是一对多的话要怎样设计。比如白名单设计,一个白名单可以包含多个手机app,而每个app又对应多个权限。注:博客:https://blog.csdn.net/badao_liumang_qi
my-react-blog前端使用了react,后端使用springcloud, oauth2做统一认证,springboot2.0,图片上传使用腾讯COS项目比较简单,也有不少坑,仅做学习参考码云:https://gitee.com/dy.huang项目介绍react实现个人博客,关于CSS我是渣渣,不太会,样式我趴了简书和知乎一些小的组件UI 用了蚂蚁金服的antd...
限流,可以网络的基础设施进行配置实现,也可以在网关的地方进行限流,但服务本身的限流也不可或缺,因为当多副本时,一个副本故障,流量对于其他副本来说会提高,如果超过其承受请求量的范围,会引起服...
2019独角兽企业重金招聘Python工程师标准>>> ...
本文选自 OneAPM Cloud Insight 高级工程师刘斌博客 。刘斌,一个才思敏捷的程序员,《第一本 Docker 书》、《GitHub 入门与实践》等书籍译者,Docker入门与实践课程主讲人。时间序列数据库,Cloud Insight 实现对性能指标进行聚合、分组、过滤所采取的解决方案。由于工作上的关系,最近看了一...
GMAIL:接收邮件服务器: pop.gmail.com接收端口: 995(必须使用ssl)发送邮件服务器: smtp.gmail.com发送端口: 465(必须使用ssl)或者587(TLS/STARTTLS)IMAP接收邮件服务器: imap.gmail.com接收端口: 993(必须使用ssl)163邮箱(126类似163,参照即可):接收邮件服务器: pop.163.com接收端口: 110或995(使用ssl时)接收邮件服务器: imap.163.com接收端口: 143或9
本节我们学习 Less 中的混合(Mixin),混合是一种将一组属性从一个规则集包含或混入到另一个规则集的方法。简单一点来说,其实混合就有点类似编程语言中的函数,通过这种方式,可以在代码中实现复用。如果还不懂,下面我们通过实际例子来看一下混合的使用。普通Mixins我们先来看下面这段 Less 代码:.xkd{ font-size: 14px; color: #ccc;}.good{ font-size: 14px; color: #ccc; padding: 10px;}
退回输入键盘 - (BOOL)textFieldShouldReturn:(id)textField{ [textField resignFirstResponder];} CGRectCGRect frame = CGRectMake (origin.x,origin.y, size.width, size.height);矩形NSStringFrom
全球著名的调研机构Forrester Research近日发布了《The Forrester New Wave: Enterprise Container Platform Software Suites, Q4 2018》报告,对企业级容器平台(ECP)市场进行全面评估,希望可以为有容器需求的企业提供一份权威参考,综合排出了八大最领先的企业容器平台提供商,按照排名依次是:Docker,Red...
0x00 前言在做渗透测试的时候如果遇到安全配置比较好的服务器,当你通过各种途径获得一个php类型的webshell后,却发现面对的是无法执行系统命令的尴尬,因为这类服务器针对命令执行函数做了防范措施,后续的渗透行为都因此而止步。笔者这里分享一个绕过思路,希望你能在实际测试中派上用场。0x02 绕过思路严苛环境下php设置的disable_function如下: dlexecsystempa...