当前位置: 首页 > news >正文

网站空间是虚拟主机吗wordpress优化插件

网站空间是虚拟主机吗,wordpress优化插件,如何做网页或网站,自己建立网站后怎么做淘客简介 登录模块很简单#xff0c;前端发送账号密码的表单#xff0c;后端接收验证后即可~ 淦#xff01;可是我想多了#xff0c;于是有了以下几个问题#xff08;里面还包含网络安全问题#xff09;#xff1a; 1.登录时的验证码 2.自动登录的实现 3.怎么维护前后端…简介 登录模块很简单前端发送账号密码的表单后端接收验证后即可~ 淦可是我想多了于是有了以下几个问题里面还包含网络安全问题 1.登录时的验证码 2.自动登录的实现 3.怎么维护前后端登录状态 在这和大家分享下我实现此功能的过程包括一些技术和心得 1.登录时的验证码 为什么要验证码原因很简单防止脚本无限次重复登录来暴力破解用户密码或者攻击服务器 验证码的出现使得每次登录都有个动态变量需要输入无法用脚本写死代码 2.自动登录的实现 所谓自动登录指的是当用户登录网站时勾选了自动登录那么下次再访问网站就不需要输入账号密码直接登录了 这说明账号密码信息是必须保存在用户这边的因此自动登录都是不安全的方便的代价呀 尽管不安全但是我们也必须要尽力让它安全一点有以下常用方法 1.账号密码加密保存 2.降低自动登录后用户的权限如果用户自动登录想改密码想给我转钱等操作的话就必须输入账号密码再登录一次 3.进行ip检测之前登录的ip小本本记着如果发现和上次不一致则不允许自动登录 数据存储在前端哪里呢 浏览器有3个经常保存数据的地方 1.Cookie 我用这个 2.LocalStorage 3.SessionStorage 各位可以按F12直接观看 如果你在多个大型网站下都按按F12会发现SessionStorage基本没数据 为啥因为真的不好用它并不是后台的session那样生命周期是一个会话这个SessionStorage存储的数据只限于该标签的页面 意思是标签1和标签2即使是同个URL的网址里面的数据都是不互通的这有个毛用 那么LocalStorage存储的数据如何呢答案是无限期本地存储 不过后台无法操作这里的数据只能由js代码操作至于操作结果完全看js后端无法感知不太可靠我认为这里不适合保存敏感点的信息因为前端的功能是展示状态性的数据应该由后端直接掌控后端能直接操作Cookie保证完成任务 你看英雄所见略同CSDN网站的用户密码也是存在Cookie的 Token就是登录后的令牌下一点会讲 所以用Cookie就对啦具体实现都很简单前端多个自动登录的选择选择后多个参数传给后端后端根据参数往Cookie里设置加密后的账号密码 等下次访问时用拦截器Interceptor进行拦截检测是否要自动登录即可~ 3.如何维护前后端登录状态 大家最先想到是用Session来维护登录后在Session中存放用户信息不过对分布式很不友好什么你说你用不到分布式我也没用到可是梦想还是要有的嘛需要维护个分布式数据库来进行数据同步才行 于是我用Token实现的Token就是一串字符串最适合API鉴权例如SSO单点登录这种俗称令牌 好处就是账号密码用户输入一次就够了特别是多个系统之间一张身份的凭证都通用 当用户登录后服务器就会生成一个Token放在Cookie中之后用户的所有操作都带这个Token访问将Token放入http头部 为什么要将Token放入头部 1.能抵挡下简单的CSRF攻击 2.浏览器跨域问题 什么是CSRF攻击 举个例子我登录了A网站A网站给我返回了一些Cookie信息然后我再同一浏览器的另外标签访问了B网站谁知这个B网站返回了一些攻击代码向A网站发起一些请求比如转钱给你这时候由于是访问A网站会附带A网站的Cookie让一切都好像是我在访问一样这个就是CSRF攻击 但B网站并不知道A网站这么鸡贼会在头部放了Token所以这次攻击请求是的头部是没Token的因此检测后发现非法所以没得逞 当然这并不可靠哪天B网站知道你头部放了Token它研究A网站的js代码清楚逻辑之后也加上那就防不住了所以说前端的东西一切都不可靠 正确做法应该是后端检测头部的Referer字段每个网页里发起请求请求的头部都会带有此字段如 这说明这个请求是从 http://localhost:8099/swr 中发出的 B网站如果返回攻击代码这里显示的事B网站的网址判断出不是自家网站发出就可以禁止访问 浏览器跨域访问会发生什么 说到跨域自家网站去请求别人家的网站得先了解什么是同源策略 同源策略Same origin policy是一种约定它是浏览器最核心也最基本的安全功能如果缺少了同源策略则浏览器的正常功能可能都会受到影响。可以说 Web 是构建在同源策略基础之上的浏览器只是针对同源策略的一种实现。 它的核心就在于它认为自任何站点装载的信赖内容是不安全的。当被浏览器半信半疑的脚本运行在沙箱时它们应该只被允许访问来自同一站点的资源而不是那些来自其它站点可能怀有恶意的资源。 所谓同源是指域名、协议、端口相同。 另外同源策略又分为以下两种 DOM 同源策略禁止对不同源页面 DOM 进行操作。这里主要场景是 iframe 跨域的情况不同域名的 iframe 是限制互相访问的。XMLHttpRequest 同源策略禁止使用 XHR 对象向不同源的服务器地址发起 HTTP 请求。就是ajax 咳咳这里要说下第二种其实设置一些参数之后ajax访问时允许跨域请求的甚至允许跨域时带上自身cookie 但是带上自己的Cookie多不安全明明里面只有1,2个信息要传给对方现在被人全看见了不好不好所以要将Token放入头部 你说为啥不放到参数里因为这会跟业务用的参数混淆造成逻辑混乱就好像你上学时要扔家里的垃圾你不会放到书包里吧都是手里提着的 每个请求都放token所以要封装起来例如我是将ajax封装起一个新的对象然后在这个对象使用时添加Token 当然啦封装了ajax后还有其他好处例如统一的成功失败回调函数统一的数据解析统一的等待框等等有兴趣的同学可以看下 View Code 预防XSS攻击Filter知识讲解 网上有些文章说后端设置HttpOnly让Cookie无法让js读写可以防止XSS攻击。 (⊙o⊙)…简直就是乱写首先要了解下什么是XSS攻击 Xss攻击是什么 举个简单的例子假设你前端有个地方可以输入然后保存的数据库的地方 用户A输入了以下东西 scriptalert(123)/script 然后这东西就到了后台当作一串字符串保存了起来 刚好你网站的html代码里有个地方是显示用户输入过的东西的例如评论区然后上面的东西就被加载到html里面如 !DOCTYPE html htmlheadmeta charsetutf-8 /title/titlepscriptalert(123)/script/p/headbody/body /html 接下来每个人打开你的网站都会弹出123的对话框这就是XSS攻击 怎么预防呢在后端设置过滤器对输入进行过滤先上代码 1 /**2 * auther: NiceBin3 * description: 系统的拦截器注册在FilterConfig类中进行4 * 不能使用WebFilter因为Filter要排序5 * 1.对ServletRequest进行封装6 * 2.防止CSRF检查http头的Referer字段7 * date: 2020/12/15 15:328 */9 Component 10 public class SystemFilter implements Filter { 11 private final Logger logger LoggerFactory.getLogger(SystemFilter.class); 12 Autowired 13 private Environment environment; 14 15 Override 16 public void init(FilterConfig filterConfig) throws ServletException { 17 logger.info(系统拦截器SystemFilter开始加载); 18 } 19 20 Override 21 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 22 SystemHttpServletRequestWrapper requestWrapper new SystemHttpServletRequestWrapper((HttpServletRequest) request); 23 24 //检测http的Referer字段不允许跨域访问 25 String hostPath environment.getProperty(server.host-path); 26 String referer requestWrapper.getHeader(Referer); 27 if(!Tool.isNull(referer)){ 28 if(referer.lastIndexOf(hostPath)!0){ 29 ((HttpServletResponse)response).setStatus(HttpStatus.FORBIDDEN.value()); //设置错误状态码 30 return; 31 } 32 } 33 chain.doFilter(requestWrapper,response); 34 } 35 36 Override 37 public void destroy() { 38 39 } 40 } 乍一看是不是没发现哪里预防了XSS其实正在的关键点在22行和33行代码里面的SystemHttpServletRequestWrapper类才是关键这个类是包装类是替换参数里的ServletRequest类的为的就是重写里面的方法来达到预防XSS的目的因为Spring也是根据ServletRequest类来进行前端参数读取的所以它就是后端获得数据的源头 1 /**2 * auther: NiceBin3 * description: 包装的httpServlet进行以下增强4 * 1.将流数据取出保存方便多次读出5 * 2.防止XSS攻击修改读取数据的方法过滤敏感字符6 * date: 2020/4/23 19:507 */8 public class SystemHttpServletRequestWrapper extends HttpServletRequestWrapper {9 private final byte[] body; 10 private HttpServletRequest request; 11 12 public SystemHttpServletRequestWrapper(HttpServletRequest request) throws IOException { 13 super(request); 14 //打印属性 15 //printRequestAll(request); 16 body HttpHelper.getBodyString(request).getBytes(Charset.forName(UTF-8)); //HttpHelper是我自己写的工具类 17 this.request request; 18 } 19 20 Override 21 public BufferedReader getReader() throws IOException { 22 return new BufferedReader(new InputStreamReader(getInputStream())); 23 } 24 25 Override 26 public ServletInputStream getInputStream() throws IOException { 27 final ByteArrayInputStream bais new ByteArrayInputStream(body); 28 return new ServletInputStream() { 29 Override 30 public boolean isFinished() { 31 return false; 32 } 33 34 Override 35 public boolean isReady() { 36 return false; 37 } 38 39 Override 40 public void setReadListener(ReadListener readListener) { 41 42 } 43 44 Override 45 public int read() throws IOException { 46 return bais.read(); 47 } 48 }; 49 } 50 51 /** 52 * 可以打印出HttpServletRequest里属性的值 53 * param request 54 */ 55 public void printRequestAll(HttpServletRequest request){ 56 Enumeration e request.getHeaderNames(); 57 while (e.hasMoreElements()) { 58 String name (String) e.nextElement(); 59 String value request.getHeader(name); 60 System.out.println(name value); 61 } 62 } 63 64 //以下为XSS预防 65 Override 66 public String getParameter(String name) { 67 String value request.getParameter(name); 68 if (!StringUtils.isEmpty(value)) { 69 value StringEscapeUtils.escapeHtml4(value); 70 } 71 return value; 72 } 73 74 Override 75 public String[] getParameterValues(String name) { 76 String[] parameterValues super.getParameterValues(name); 77 if (parameterValues null) { 78 return null; 79 } 80 for (int i 0; i parameterValues.length; i) { 81 String value parameterValues[i]; 82 parameterValues[i] StringEscapeUtils.escapeHtml4(value); 83 } 84 return parameterValues; 85 } 86 } HttpHelper工具类 View Code 可以看到SystemHttpServletRequestWrapper的64行开始重写了两个获取参数的方法在获取参数的时候进行过滤即可~ 那64行往上是干啥的咧这个是将ServletRequest里的数据读出来保存一份因为ServletRequest里的数据流只能读取一次很不方便 啥意思呢就是你在这个Filter里 inputStream request.getInputStream(); reader new BufferedReader(new InputStreamReader(inputStream, Charset.forName(UTF-8))); String line ; while ((line reader.readLine()) ! null) {sb.append(line); } 把数据读完下个Filter再执行这些代码就没数据了从而导致Spring也接收不到数据 所以要保存起来让后面的过滤器Filter和拦截器Interceptor快乐的读数据没有后顾之忧例如上面提到的验证码设计如果你想用拦截器拦截然后进行验证则势必会读数据既然封装ServletRequest这么重要那必须得保证这个Filter第一个加载啊 在Springboot中Filter的排序用Order是没用的必须要用FilterRegistrationBean进行注册才能排序如 1 /**2 * auther: NiceBin3 * description: 为了排序Filter如果Filter有顺序要求4 * 那么需要在此注册设置order值越低优先级越高5 * 其他没顺序需要的可以WebFilter注册6 * 如WebFilter(filterName SecurityFilter, urlPatterns /*, asyncSupported true)7 * date: 2020/12/15 15:488 */9 Configuration 10 public class FilterConfig { 11 12 Autowired 13 SystemFilter systemFilter; 14 /** 15 * 注册SystemFilter顺序为1任何其他filter不能比他优先 16 * return 17 */ 18 Bean 19 public FilterRegistrationBean filterRegist(){ 20 FilterRegistrationBean filterRegistrationBean new FilterRegistrationBean(); 21 filterRegistrationBean.setFilter(systemFilter); 22 filterRegistrationBean.setName(SystemFilter); 23 filterRegistrationBean.addUrlPatterns(/*); 24 filterRegistrationBean.setAsyncSupported(true); 25 filterRegistrationBean.setOrder(1); 26 return filterRegistrationBean; 27 } 28 } 当然了如果你没用Springboot那web.xml中定义的顺序就是Filter加载的顺序 知识点提问在我们之后的Filter或者Interceptor中需要 1 SystemHttpServletRequestWrapper requestWrapper (SystemHttpServletRequestWrapper) request 这样强制转换才能用吗 答案是不用的你可以想想Spring也用了这个东西的它怎么知道你定义的类叫什么名字怎么强制转换那么这设计到Java什么知识呢 没错就是Java的多态性我们看以下代码 public class Father {public void sayName(){System.out.println(我是爸爸);} }public class Son extends Father{public void sayName(){System.out.println(我是儿子);} }public class Test {org.junit.Testpublic void test() throws Exception {Father father new Son();otherMethod(father);}public void otherMethod(Father father){father.sayName();} } 输出我是儿子 答错了的留言看看有多少小伙子~~ 接下来言归正传 选择JWT生成Token JWT全称JSON Web Tokens 是一种规范化的 token别人想的挺多挺全面的了比你自己想的token要好一点 一个 JWT token 是一个字符串它由三部分组成头部、载荷与签名中间用 . 分隔例如xxxxx.yyyyy.zzzzz 头部header 头部通常由两部分组成令牌的类型即 JWT和正在使用的签名算法如 HMAC SHA256 或 RSA.。 例如 {alg: HS256,typ: JWT } 然后用 Base64Url 编码得到头部即 xxxxx。Base64Url编码后才能在URL中正常传输因为有人会把Token放在URL里..... 载荷Payload 载荷中放置了 token 的一些基本信息以帮助接受它的服务器来理解这个 token。同时还可以包含一些自定义的信息用户信息交换如: {sub: 1,iss: http://localhost:8000/auth/login,iat: 1451888119,exp: 1454516119,nbf: 1451888119,jti: 37c107e4609ddbcc9c096ea5ee76c667,aud: dev} 可以将载荷用别的方式加密一遍这样别人得到了token也看不懂 签名Signature 签名时需要用到前面编码过的两个字符串如果以 HMACSHA256 加密就如下 HMACSHA256(base64UrlEncode(header) . base64UrlEncode(payload),secret) 加密后再进行 base64url 编码最后得到的字符串就是 token 的第三部分 zzzzz。 组合便可以得到 tokenxxxxx.yyyyy.zzzzz。 签名的作用保证 JWT 没有被篡改过原理如下 HMAC 算法是不可逆算法类似 MD5 和 hash 但多一个密钥密钥即上面的 secret由服务端持有客户端把 token 发给服务端后服务端可以把其中的头部和载荷再加上事先共享的 secret 再进行一次 HMAC 加密得到的结果和 token 的第三段进行对比如果一样则表明数据没有被篡改。 具体Java使用 dependencygroupIdcom.auth0/groupIdartifactIdjava-jwt/artifactIdversion3.10.2/version/dependency!--jwt一些工具类--dependencygroupIdio.jsonwebtoken/groupIdartifactIdjjwt/artifactIdversion0.9.1/version /dependency 1 **2 * auther: NiceBin3 * description: Jwt构造器创建Token来进行身份记录4 * jwt由3个部分构成jwt头有效载荷主体,payLoad签名5 * date: 2020/5/7 22:406 */7 public class JwtTool {8 9 //以下为JwtTool生成时的主题10 //登录是否还有效11 public static final String SUBJECT_ONLINE_STATE online_state;12 13 //以下为载荷固定的Key值14 //主题15 public static final String SUBJECT subject;16 //发布时间17 public static final String TIME_ISSUED timeIssued;18 //过期时间19 public static final String EXPIRATION expiration;20 21 /**22 * 生成token参数都是载荷自定义内容23 * 其中Map里为非必要数据而其他参数为必要参数24 *25 * param subject 主题token生成干啥用的用上面的常量作为参数26 * param liveTime 存活时间(秒单位)建议使用TimeUnit方便转换27 * 如TimeUnit.HOURS.toSeconds(1);将1小时转为秒 360028 * param claimMap 自定义荷载可以为空29 * return30 */31 public static String createToken(String subject, long liveTime, HashMapString, String claimMap) throws Exception {32 33 SignatureAlgorithm signatureAlgorithm SignatureAlgorithm.HS256;34 35 //毫秒要转为秒36 long now System.currentTimeMillis() / 1000;37 38 // byte[] apiKeySecretBytes DatatypeConverter.parseBase64Binary(EncrypRSA.keyString);39 //40 // Key signingKey new SecretKeySpec(apiKeySecretBytes, signatureAlgorithm.getJcaName());41 42 JwtBuilder jwtBuilder Jwts.builder()43 //加密算法44 .setHeaderParam(alg, HS256)45 //jwt签名46 .signWith(signatureAlgorithm, EncrypRSA.convertSecretKey); //这个Key是我自个的密码你们自己设个字符串也成这个得保密47 48 HashMapString,String payLoadMap new HashMap();49 payLoadMap.put(SUBJECT,subject);50 payLoadMap.put(TIME_ISSUED,String.valueOf(now));51 //设置Token的过期时间52 if (liveTime 0) {53 long expiration now liveTime;54 payLoadMap.put(EXPIRATION,String.valueOf(expiration));55 } else {56 throw new SystemException(SystemStaticValue.TOOL_PARAMETER_EXCEPTION_CODE, liveTime参数异常);57 }58 59 StringBuilder payLoad new StringBuilder();60 61 62 63 if (!Collections.isEmpty(claimMap)) {64 payLoadMap.putAll(claimMap);65 }66 67 //拼接主题payLoad采用 key1,value1,key2,value2的格式68 for (Map.EntryString, String entry : payLoadMap.entrySet()) {69 payLoad.append(entry.getKey()).append(,).append(entry.getValue()).append(,);70 }71 72 //对payLoad进行加密这样别人Base64URL解密后也不是明文73 String encrypPayLoad EncrypRSA.encrypt(payLoad.toString());74 75 jwtBuilder.setPayload(encrypPayLoad);76 77 //会自己生成签名组装78 return jwtBuilder.compact();79 }80 81 /**82 * 私钥解密token信息83 *84 * param token85 * return 存有之前定义的Key, value的Map解析失败则返回null86 */87 public static HashMap getMap(String token) {88 if (!Tool.isNull(token)) {89 try {90 String encrypPayLoad Jwts.parser()91 .setSigningKey(EncrypRSA.convertSecretKey)92 .parsePlaintextJws(token).getBody();93 94 String payLoad EncrypRSA.decrypt(encrypPayLoad);95 96 String[] payLoads payLoad.split(,);97 HashMapString, String map new HashMap();98 for (int i 0; i payLoads.length - 1; ii2) {99 map.put(payLoads[i], payLoads[i 1]); 100 } 101 return map; 102 } catch (Exception e) { 103 System.out.println(Token解析失败); 104 return null; 105 } 106 } else { 107 return null; 108 } 109 } 110 111 /** 112 * 判断token是否有效 113 * 114 * param map 已经解析过token的map 115 * return true 为有效 116 */ 117 public static boolean isAlive(HashMapString, String map) { 118 119 if (!Collections.isEmpty(map)) { 120 String tokenString map.get(EXPIRATION); 121 122 if (!Tool.isNull(tokenString)) { 123 long expiration Long.valueOf(tokenString) / 1000; 124 long now System.currentTimeMillis(); 125 if (expiration now) { 126 return true; 127 } else { 128 return false; 129 } 130 } 131 } 132 return false; 133 } 134 135 /** 136 * 判断token是否有效 137 * param token 还未被解析的token 138 * return 139 */ 140 public static boolean isAlive(String token) { 141 return JwtTool.isAlive(JwtTool.getMap(token)); 142 } 143 } 至此Token的生成和使用就介绍完了大家有没兴趣了解下重放攻击淦我也是在某个博文看到的又得花时间研究 Https防止半路被截和重放攻击 前面提到了Token就是身份令牌可以相当于已登录一样进入系统那么半路被人截了那就不好了 所以要用Https协议具体怎么设置大家自行百度吧直接在tomcat操作的不需要更改代码证书也有免费的~ 这里说下Https建立连接的过程来看看为什么就不会被人截获了 1.服务器先向CA证书颁布机构申请一个证书证书里有自己的ip等等消息然后在自己服务器设置好 2.浏览器向服务器发送HTTPS请求服务器将自己的证书发给浏览器 3.浏览器拿到证书后查看证书是否过期啊ip是不是跟服务器的一样啊跟检查身份证跟你长得像不像一样检查没问题后跟自己系统里的CA列表比对看看是谁发的找不到就报错说证书不可信比对成功后从列表里拿出对应的CA公钥解密证书具体方法跟JWT的很像浏览器用相同的算法和公钥对证书部分进行加密看得到的值和证书的签名是否一致得到服务器的公钥 4.然后生成一个传输私钥用服务器的公钥加密发给服务器 5.服务器用服务器的私钥解密得到了传输秘钥然后用传输秘钥进行加密要传送的信息发给浏览器 6.浏览器用秘钥解密然后用传输秘钥进行加密要传送的信息发给服务器对称加密 7.重复5,6步骤直到结束 以上哪个步骤黑客得到数据都看不懂 至于为什么能防重放攻击是因为Https通信自带序列号如果黑客截取了浏览器的请求重复发送一遍那么序列号会一样会被直接丢弃
http://www.w-s-a.com/news/483735/

相关文章:

  • 太原网站设计排名设计本装修效果图
  • 网站个人中心模板石家庄网站系统开发
  • 优秀的电子商务网站教育公司网站建设文案
  • 网站开发市场成本网站链接推广工具
  • 猪八戒做网站排名常州seo博客
  • wordpress 网站遭篡改如何优化公司的网站
  • 汉中公司做网站网站建设的风格设置
  • 网站建议怎么写怎么做网页连接
  • 站长工具seo综合查询下载安装软件平台搭建包括哪几个方面
  • 做网站怎么存放视频支付功能网站建设
  • 庆阳手机网站设计兰州网站的优化
  • 企业网站托管有必要吗项目管理资格证书
  • 检索类的网站建设个人博客网页模板图片
  • 贵阳网站建设搜q479185700做网站有什么语言好
  • 制作公司主页网站贵阳网站建设技术托管
  • 广西建设网站网址多少钱南京江北新区地图
  • 网站建设及优化 赣icp外包服务美剧
  • wordpress添加菜单深圳优化网站排名
  • 免费下载建设银行官方网站重点专业建设验收网站
  • 建行官方网站登录怎样制作悬浮的WordPress
  • 建设一个网站需要几个角色广告设计与制作就业前景
  • 侵入别人的网站怎么做怎么修改网站排版
  • 网站如何提交百度收录什么最便宜网站建设
  • 商丘网站建设想象力网络做公司网站需要准备什么
  • 滁州新手跨境电商建站哪家好网站推广运作怎么做
  • 烟台有没有做网站大连建设工程信息网专家库
  • 网站建设明确细节商贸有限公司的经营范围
  • 南宁微网站开发做的好的有哪些网站
  • 好的素材下载网站读书网网站建设策划书
  • 东莞南城网站建设wordpress用户投稿插件