CuteKe网站开发与安全2——记录URL与URL不符合

9 篇文章 0 订阅
6 篇文章 0 订阅

    我的CuteKe网站也上线一段时间了,之前也是做了访问日志,发现日志还是不利于观察,还是把它访问记录数据库化了。但是这几天却发现在记录URL的时候发现了一个问题。

1. 记录URL

    我们先来看看如何记录URL与IP地址:

1.1 访问记录Model

    因为我们要把访问记录数据化,所以我们要创建访问记录实体类:VistorLog,代码如下:

@Entity
public class VisitorLog {
    private static final long serialVersionUID = 1L;

    @Id // 主键
    @GeneratedValue(strategy = GenerationType.IDENTITY) // 自增长策略
    private Long id; // 用户的唯一标识


    @NotEmpty(message = "访问地址不能为空")
    @Column(nullable = false)
    private String url;

    @NotEmpty(message = "访问方法不能为空")
    @Column(nullable = false)
    private String httpMethod;
    
    @NotEmpty(message = "IP地址不能为空")
    @Column(nullable = false)
    private String ip;


    @NotEmpty(message = "IP地址映射的真实不能为空")
    @Column(nullable = false)
    private String trueAddress;

    @Column(nullable = false) // 映射为字段,值不能为空
    @org.hibernate.annotations.CreationTimestamp  // 由数据库自动创建时间
    private Timestamp visitTime;
    
    
    @NotEmpty(message = "后台访问方法不能为空")
    @Column(nullable = false)
    private String classMethod;

    @NotEmpty(message = "访问方法参数")
    @Column(nullable = false)
    private String getClassMethodArgs;

    protected  VisitorLog(){
        
    }

    public VisitorLog(String url, String httpMethod, String ip, String trueAddress,String classMethod, String getClassMethodArgs) {
        this.url = url;
        this.httpMethod = httpMethod;
        this.ip = ip;
        this.trueAddress= trueAddress;
        this.classMethod = classMethod;
        this.getClassMethodArgs = getClassMethodArgs;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public String getHttpMethod() {
        return httpMethod;
    }

    public void setHttpMethod(String httpMethod) {
        this.httpMethod = httpMethod;
    }

    public String getIp() {
        return ip;
    }

    public void setIp(String ip) {
        this.ip = ip;
    }

    public String getClassMethod() {
        return classMethod;
    }

    public void setClassMethod(String classMethod) {
        this.classMethod = classMethod;
    }

    public String getGetClassMethodArgs() {
        return getClassMethodArgs;
    }

    public void setGetClassMethodArgs(String getClassMethodArgs) {
        this.getClassMethodArgs = getClassMethodArgs;
    }
}

1.2 利用Spring AOP

    在gradle里添加spring-boot-starter-aop依赖以后,我们可以这样设计:

  1. 切入点:每个Controller的每个方法即各个请求方法
    @Pointcut("execution(public * com.cuteke.spring.boot.blog.controlller.*.*(..))")
    public void log() {
    };
  1. 通知:在这里我选择的是前置通知,你也可以选择其他通知
 @Before("log()")
    public void doBefore(JoinPoint joinPoint) {
    ....
    }
  1. 获取HttpServletRequest:我们通过Request上下文来获取HttpServertRequest
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
  1. 获取各个属性:获取到HttpServertRequest就可以通过调用其方法就可以获取到VisitLog的各个属性了:
String url=new String(request.getRequestURL());
String method=request.getMethod();
String ip=IpUtil.getClinetIpByReq(request);
String class_method=joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName();
String args= Arrays.toString(joinPoint.getArgs());
logger.info("url={} method={} ip={} class_method={} args={}", url, method
                , ip, class_method
                , joinPoint.getArgs());
VisitorLog visitorLog=new VisitorLog(url,method,ip,IpUtil.getAddressByIP(ip),class_method,args);
vistorLogService.saveVistorLog(visitorLog);

IpUtil是处理ip的工具类,核心思想是通过getRemoteAddr()方法和过滤掉代理ip来实现的,我们会在其余章节里面提到,百度也能很简单的找到

2. URL不符合

    网站上线了几个星期,我在数据找到了很奇怪的记录,如下图1所示:

URL不符合

图1. 数据库中行URL不符合

    其中怪异的url我都用红线划出来了,而且发现了没,这些搞事的url都是国外的,国外还是喜欢搞事情呀!

2.1 是否使用代理?

    代理可以分为两种:

  1. 正向代理:客户端要配置代理服务器,由代理服务器代替访问你,所以说URL一般并不会改变
  2. 反向代理:客户端不知道代理的存在,访问URL的网址时,会经过反向代理服务器,由反向代理服务器转向对应的服务器上访问,一般用于
    负载均衡,URL一般也不会改变

    其实使用代理的情况下是可以出现我这种情况的,因为服务器的存在,修改URL或者其他操作是用户不知道的,我们知道URL是用来解析ip地址,像国外这种情况只要能确定我的服务器IP地址,不管URL是不是我的网站URL,都可以访问我的网站。

2.2 HOST实践

    前面讲到只要解析我的服务器IP地址不管URL是否正确都可以,我们就在本机实践一下,我们知道在C:\Windows\System32\drivers\etc有一个HOST文件,我们只要改变URL对应的IP即可完成解析。代码如下:

# localhost name resolution is handled within DNS itself.
127.0.0.1 localhost
#	::1             localhost
127.0.0.1 www.cuteke.cn

    在这里我把自己的网站域名解析成本机地址,在本机我也开启我的网站,不过里面内容不一样,在浏览器输入www.cuteke.cn,发现页面如下图所示:

host-1

图1. 本地访问CuteKe网站

    这页面是本机服务器展示展示的页面,因为本机的置顶文章和公网上置顶的文章不一样。同时我们看一下本地数据库的访问记录:

host-2

图2. 本地数据库访问记录

    最后两行我们可以发现URL并不是localhost而是www.cuteke.cn,也是验证了我们的思想。

修改HOSTS文件后如果访问的URL还是解析成原来的地址,那么记得清楚一下系统DNS和浏览器DNS缓存

修改HOSTS文件只是其中一种可能,还有一种极大的可能是Http Host头攻击,我们在下一章会讲述其原理和具体防御措施

参考资料

[1] Spring Boot进阶之Web进阶
[2] 正向代理与反向代理【总结】

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CuteXiaoKe

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值