利用Referer请求头阻止“盗链”

利用Referer请求头阻止“盗链”

String referrer = request.getHeader("referer");

String sitePart = "http://" + request.getServerName();

if(referrer!=null && referrer.startsWith(sitePart))

{

//处理正当的下载请求,这里只进行示意

out.println("dealing download ...");

}

else

{

//非法下载请求跳转到本站的下载说明页

RequestDispatcher rd = request.getRequestDispatcher("/down.html");

rd.forward(request,response);

}

String referrer = request.getHeader("referer");

String sitePart = "http://" + request.getServerName();

if(referrer!=null && referrer.startsWith(sitePart))

{

//向客户端输出javascript的document.write(...)语句

out.println(

"document.write('假设这是很多重要的Javascript代码的执行结果');");

}

客户端身份认证

当客户端访问WEB服务器时, WEB服务器可以发送401(Unauthorized)响应状态码和WWW-Authenticate响应头来要求客户端进行身份认证。

客户端可以再次发出请求,并通过Authorization请求头来提供用户名和密码信息。

服务器对Authorization请求头中的身份信息进行认证,并根据认证结果来决定是否提供服务。

WWW-Authenticate响应头中可以指定两种认证方式:BASIC和DIGEST。

对于BASIC验证方式,客户端需要把用冒号(:)分隔的用户名和密码进行Base64 编码之后传送给WEB服务器。

举例:用户名为“zxx”和密码为“123456”的认证头信息

Authorization: Basic enh4OjEyMzQ1Ng==

BASE64编码

BASE64编码规则将一组连续的字节数据按6个bit位进行分组,然后对每组数据用一个ASCII字符来表示。6个bit位最多能表示26=64个数值,因此可以使用64个ASCII字符来对应这64个数值,这64个ASCII字符为:

"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"

计算[0110,0001] [0110,0010] [0110,0011]的BASE64编码

[0110,0001] [0110,0010] [0110,0011]à[0110,00] [01,0110,] [0010,01] [10,0011]

[0110,00] [01,0110,] [0010,01] [10,0011] à [24]10 [22]10 [9]10 [35]10

[24]10 [22]10 [9]10 [35]10 à "YWJj"

BASE64编码要求把3个8位字节(即24个bit)的数据转化为4个6位字节(也是24个bit)的数据,如果原来的8位字节数据的字节个数不能被3整除,那么如何对余下的1个或2个8位字节数据进行处理呢?

仍然按6个bit位对剩余的字节进行分组,在最后不够6个bit位的内容后面添加几个为0的bit位来凑成6个bit位,例如,[0110,0001] à [0110,00] [01,0000]

如果编码后的整个结果文本的字符个数不是4的整数倍,那么需要在最后填充“=”字符来凑成4的倍数。

经过BASE64编码后的结果所占用的字节个数大约是原始内容的4/3倍,计算公式为:编码后的大小 = ((原始大小+2)/3)*4 。

客户端身份认证à实践

String encodedAuth = request.getHeader("Authorization");

//要求客户端发送身份认证信息,并且只能是BASIC认证方式中

if (encodedAuth == null || !encodedAuth.toUpperCase().startsWith("BASIC"))

{

response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);

response.setHeader("WWW-Authenticate","BASIC realm=\"it315\"");

//当用户单击登录框中的“取消”按钮时,将输出下面的内容

out.println("没有传递用户身份!");

return ;

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值