小前言:

一般来说,现在很多平台注册、登录的时候会涉及到验证码,这样做的目的是为了防止恶意程序恶意访问,从而给服务器造成一定的压力,会浪费一定的资源,大家也都知道,现在这种短信平台,邮箱平台等都是收费的,如果不做这种防范措施,可能你今晚对某短信平台充值,第二天早上醒来就会收到一条消费多少条短信让你去充值的信息。不是吹牛,我以前做过这种事的,我还专门去找这种网站,玩一玩短信轰炸,邮箱轰炸等。

言归正传,该怎么去防范这种措施呢?

·验证码

·IP

·更多

当然,所有安全都不是绝对的,安全和方便自古以来都是相生相克,想安全点,就得麻烦一点,想方便一点,就没那么安全。

验证码限制: 

现在网上都有很多jar包直接拿来用就行了,或者使用一些开源框架,比如Apache的jcaptcha等等。但是呢,验证码限制也是可以破解的,但是验证码的防范措施已经阻止了大概70%的恶意程序(本来搞恶意破坏的就不会太多,就算不太多,我们是不是也得防着点)。再说一个额外话题,别人怎么去破解验证码呢?验证码上面会布满几个数字、或者是几个字母、或者是字母数字的组合、也可能是几个汉字、等等。破解验证吗要用到投影直方图分割,卡壳法,二值化等技术,比如这张二维码是4个字母(一般都是这种),把这张图片分割成4份,每份一个字母,然后使用相应的技术破解验证码得到里面的value。所以平时大家所见的验证码的背景都会布满一些条条杠杠,这些不是想扰乱客户的视线,这是扰乱恶意程序的破解。好了,来说说IP怎么限制吧。

IP限制:

IP的限制当然是很重要的,当然,这也是可以破解的,这个留到后面说。 什么IP限制呢?你每访问一个网页或者网站,在后台都可以得到你的IP地址,然后在后台把这个IP记住,你连续给某个手机号 发送验证码吵过多少次,就禁止这个IP发送验证码。

一般情况,是把这个IP放到缓存里,你发一次短信,相应的值就+1,如果超过某个值,后台就不会给这个手机号或者邮箱发送验证码。如果做得次一点,那就把它放到session里,key的话就是你的ip,值得话就是你发短信的次数。

 

很多人很好奇,这个恶意程序怎么破击IP地址呢?IP地址不是唯一的吗? 不知道大家听说过代理没有,也就是恶意程序访问的是代理,然后代理去访问你的网站,然后频繁切换代理访问,所以代理是后台多级反向代理所得到的真实IP, 可能你知道这个IP攻击过你的网站,可是你根本找不到这个人,因为你根本无从下手去找。然后你拿着IP上网查一下,发现这个IP的地址是美国洛杉矶。。。

获得客户端真实IP地址的方法一:

public String getRemortIP(HttpServletRequest request) {
if (request.getHeader("x-forwarded-for") == null) {
return request.getRemoteAddr();
}
return request.getHeader("x-forwarded-for");
}

获得客户端真实IP地址的方法二:

public String getIpAddr(HttpServletRequest request) {
String ip = request.getHeader("x-forwarded-for");
if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
}
if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
}
if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
return ip;
}

以上方法还不行的话就采用如下方法:

/**
* 获取当前网络ip
* @param request
* @return
*/
public String getIpAddr(HttpServletRequest request){
String ipAddress = request.getHeader("x-forwarded-for");
if(ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
ipAddress = request.getHeader("Proxy-Client-IP");
}
if(ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
ipAddress = request.getHeader("WL-Proxy-Client-IP");
}
if(ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
ipAddress = request.getRemoteAddr();
if(ipAddress.equals("127.0.0.1") || ipAddress.equals("0:0:0:0:0:0:0:1")){
//根据网卡取本机配置的IP
InetAddress inet=null;
try {
inet = InetAddress.getLocalHost();
} catch (UnknownHostException e) {
e.printStackTrace();
}
ipAddress= inet.getHostAddress();
}
}
//对于通过多个代理的情况,第一个IP为客户端真实IP,多个IP按照','分割
if(ipAddress!=null && ipAddress.length()>15){ //"***.***.***.***".length() = 15
if(ipAddress.indexOf(",")>0){
ipAddress = ipAddress.substring(0,ipAddress.indexOf(","));
}
}
return ipAddress;
}

我以前搞过这些东西,还访问各种网站找网站的漏洞,给同学来一个说来就来的短信轰炸。

因为以前翘过这些后门,所以给大家说说我的心路历程,我的爬虫经历,希望对大家有帮助。

最新文章

  1. 选中统计winform
  2. java学习笔记----枚举测试题
  3. BZOJ2118墨墨的等式[数论 最短路建模]
  4. 【实例】html5-canvas中实现背景图片的移动
  5. iOS block里的self
  6. 【策略】UVa 278 - Chess
  7. 【C语言】编写一个函数实现n^k,使用递归实现
  8. php文件加锁 lock_sh ,lock_ex
  9. 多线程:pthread_exit,pthread_join,pthread_self
  10. Oracle EBS-SQL (OM-4):检查发运网络.sql
  11. 团队作业8——第二次项目冲刺(Beta阶段)5.18
  12. Linux Bash Shell字符串截取
  13. python 全栈开发,Day2
  14. [Spark][Python][RDD][DataFrame]从 RDD 构造 DataFrame 例子
  15. 【P2303】Longge的问题
  16. 【blog】SpringBoot的可执行文件如何在Linux中后台运行(待补充...)
  17. mysql视图的作用
  18. java项目中Excel文件的导入导出
  19. [LCT应用]
  20. POJ 1061 - 青蛙的约会 - [exgcd求解一元线性同余方程]

热门文章

  1. day25 初始面向对象
  2. 【BZOJ2001】[HNOI2010]城市建设(CDQ分治,线段树分治)
  3. List does not exist. The page you selected contains a list that does not exist. It may have been deleted by another user
  4. 教你如何开启/关闭ubuntu防火墙
  5. Spark 集成开发
  6. Java -- JDBC 学习--处理Blob
  7. android 同时打开两个sqlite database db
  8. 【洛谷P1486】郁闷的出纳员
  9. Pentaho BI server 中 CCC table Component 的使用小技巧
  10. 2018.9青岛网络预选赛(B)