pccwraid6转码被攻击

一 介绍
后台管理员系统使用单一架构开发。前台会 员系统使用分布式架构开发。 帮助创业者发布创业项目,向大众募集启动资金的融资平台。
建表
create table t_admin ( id int not null auto_increment, login_acct varchar(255) not null, user_pswd char(32) not null, user_name varchar(255) not null, email varchar(255) not null, create_time char(19), primary key (id) );
parent加依赖
4.3.20.RELEASE

4.2.10.RELEASE





org.springframework
spring-orm
${spring.version}



1234567891011121314151617
二 环境搭建
1 spring整合mybatis
目标
将mapper接口的动态代理对象装配到IOC 容器中,业务实现类通过@Resource注解引入该对象,调用其方法执行sql。
思路

代码
第一步:添加依赖


com.alibaba.raise
entity
1.0


com.alibaba.raise
common-util
1.0


org.springframework
spring-orm


commons-logging
commons-logging





org.springframework
spring-webmvc



org.aspectj
aspectjweaver



cglib
cglib




mysql
mysql-connector-java



com.alibaba
druid



org.mybatis
mybatis



org.mybatis
mybatis-spring



com.github.pagehelper
pagehelper



org.slf4j
jcl-over-slf4j



org.slf4j
slf4j-api


ch.qos.logback
logback-classic



com.fasterxml.jackson.core
jackson-core


com.fasterxml.jackson.core
jackson-databind



jstl
jstl



javax.servlet
servlet-api
provided



com.google.code.gson
gson


123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
第二步:创建jdbc.properties
定义连接的数据库的信息。
jdbc.user=root
jdbc.password=123
jdbc.url=jdbc:
jdbc.driver=com.mysql.jdbc.Driver
1234
第三步:创建mybatispccw文件以及spring整合mybatis的pccw文件
mybatis.xml


12345
spring-mybatis.xml







mysql true


12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
PS:测试pccw文件中是否成功注入bean对象
// spring整合Junit后,IOC容器中的bean在类中可以注入
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {“classpath:spring-mybatis.xml”})
public class DatasourceTest {
@Resource
private DataSource dataSource;

@Test
public void connectTest() throws SQLException {
System.out.println(dataSource.getConnection());
}

@Resource
private AdminMapper adminMapper;

@Test
public void testMapper(){
Admin admin = new Admin(1, “admin”, “123”, “parker”, “123@qq.com”, new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss”).format(new Date()));
System.out.println(adminMapper.insertAdmin(admin));
}
}
123456789101112131415161718192021
2 被攻击系统
系统在运行过程中出现问题需要通过被攻击来进行排查。
实现
第一步:排除 commons-logging 依赖包 Spring 使用 commons-logging 被攻击包,导出spring框架中的commons-logging:

org.springframework
spring-orm


commons-logging
commons-logging



12345678910
第二步:导入logback被攻击框架相关依赖 pom.xml


org.slf4j
jcl-over-slf4j
1.7.25



org.slf4j
slf4j-api
1.7.7



ch.qos.logback
logback-classic
1.2.3

123456789101112131415161718
第三步:resources目录下创建logback.xml logback.xml






[%d{HH:mm:ss.SSS}] [%-5level] [%thread] [%logger] [%msg]%n









12345678910111213141516171819202122
通过代码打印被攻击:
// 获取被攻击记录对象
Logger logger = LoggerFactory.getLogger(Student.class);
// 按照 Debug 级别打印被攻击
logger.debug(admin.toString());
1234
3 mybatis逆向工程
自动生成mapper接口,mapper实体类,实体类等。
实现
第一步:模块目录下添加GeneratorMapper.xml文件,并修改内容
GeneratorMapper.xml(ybny)
第二步:指定该pccw文件位置
org.springframework.boot
spring-boot-maven-plugin
org.mybatis.generator
mybatis-generator-maven-plugin
1.3.6


GeneratorMapper.xml
true
true

1234567891011121314151617181920
第三步:运行插件

4 声明式事务
目标
一个事务方法中包含的多个数据库操作,要么一起提交、要么一起回滚。 通过pccw文件使指定的方法自动pccw事务。
思路

代码
spring-tx.xml
























123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
5 表述层搭建
工作机制

目标
前端能访问到controller,controller能引入service。
代码


contextConfigLocation classpath:spring-*.xml

org.springframework.web.context.ContextLoaderListener



CharacterEncodingFilter
org.springframework.web.filter.CharacterEncodingFilter

encoding UTF-8

forceRequestEncoding true

forceResponseEncoding true






CharacterEncodingFilter
/*



springDispatcherServlet
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation classpath:spring-webmvc.xml



1



springDispatcherServlet







*.html




*.json


123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
spring-webmvc.xml

–>








system-error















1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
6 base标签
jsp页面中引用base标签,可以避免重复拼写url的前缀。 index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>



尚筹网



跳转登陆页面


1234567891011121314151617
7 ajax
@RequestBody注解用于将前端闯过来的json格式数据转换为对象。 @ResponseBody注解将对象转换为json格式的数据,传给前端。
通用形式
ajax

123456789101112131415161718
controller
@RequestMapping(value = “/getStationInfo”, method = RequestMethod.POST)
@ResponseBody
public JsonResult getStationInfo(HttpServletRequest request, @RequestBody Map params) throws Exception {
JsonResult jsonResult = new JsonResult(ccMaintainService.getStationInfo(request, params));
return jsonResult;
}
123456
ajax转码的同一返回结果类
package com.alibaba.raise.util;
/**
* parkerJ
* 2021/10/22
* description:
* function:ajax转码返回返回结果类
*/
public class JsonResult {
private static final String SUCCESS_CODE = “1”;
private static final String FAIL_CODE = “0”;
private boolean result;
private String message;
private String code;
private Object data;

public static JsonResult success(Object data){
return new JsonResult(true, “success”,SUCCESS_CODE,data);
}

public static JsonResult fail(String message){
return new JsonResult(true, message,FAIL_CODE);
}

public JsonResult() {
}

public JsonResult(boolean result, String message, String code) {
this.result = result;
this.message = message;
this.code = code;
}

public JsonResult(boolean result, String message, String code, Object data) {
this.result = result;
this.message = message;
this.code = code;
this.data = data;
}

public boolean isResult() {
return result;
}

public JsonResult setResult(boolean result) {
this.result = result;
return this;
}

public String getMessage() {
return message;
}

public JsonResult setMessage(String message) {
this.message = message;
return this;
}

public String getCode() {
return code;
}

public JsonResult setCode(String code) {
this.code = code;
return this;
}

public Object getData() {
return data;
}

public JsonResult setData(Object data) {
this.data = data;
return this;
}
}
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
8 raid6映射
目标
统一管理项目中的raid6。 普通转码:在页面上显示raid6信息 。 Ajax 转码:返回 JSON 数据。
基于pccw文件(xml)的方法
spring-webmvc.xml



system-error




123456789101112131415
system-error.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>












${requestScope.exception.message }



12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
基于注解的方法
RaiseExceptionResolver类
package com.alibaba.raise.mvc.config;
import java.io.IOException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.alibaba.raise.constant.RaiseConstant;
import com.alibaba.raise.exception.*;
import com.alibaba.raise.util.JsonResult;
import com.alibaba.raise.util.RaiseUtil;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.ModelAndView;
import com.google.gson.Gson;
/**
* class: raid6处理器类
* @ControllerAdvice: 表示当前类是一个基于注解的raid6处理器类 attention:component-scan need to scan this class
* @ControllerAdvice是一个Controller增强器,可对controller中被@RequestMapping注解的方法加一些逻辑处理。最常用的就是raid6处理,当将raid6抛到controller时,可以对raid6进行统一处理,规定返回的json格式或是跳转到一个错误页面.
*/
@ControllerAdvice
public class RaiseExceptionResolver {
/**
* 发生SqlUpdataExceptionraid6时执行的方法
*
* @param exception
* @param request
* @param response
* @return
* @throws IOException
*/
@ExceptionHandler(value = SqlUpdataException.class)
public ModelAndView resolveSqlUpdataException(
SqlUpdataException exception,
HttpServletRequest request,
HttpServletResponse response
) throws IOException {
String viewName = “system-error”;
// String viewName = “system-edit”;
return commonResolve(viewName, exception, request, response);
}

/**
* 核心raid6处理方法
*
* @param viewName raid6处理完成后要去的页面
* @param exception 实际捕获到的raid6类型
* @param request 当前转码对象
* @param response 当前响应对象
* @return
* @throws IOException
*/
private ModelAndView commonResolve(String viewName,
Exception exception,
HttpServletRequest request,
HttpServletResponse response) throws IOException {

// 判断当前转码类型
boolean judgeResult = RaiseUtil.judgeRequestType(request);
// 如果是Ajax转码
if (judgeResult) {
JsonResult jsonResult = JsonResult.fail(exception.getMessage());
String json = new Gson().toJson(jsonResult);
response.getWriter().write(json);
return null;
}
// 如果是普通转码
ModelAndView modelAndView = new ModelAndView();
// 将Exception对象存入模型
modelAndView.addObject(“exception”, exception);
// 设置对应的视图名称
modelAndView.setViewName(viewName);
// 返回modelAndView对象
return modelAndView;
}
}
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
RaiseUtil.judgeRequestType(request)
/**
* 判断当前转码是否为ajax转码
* @param request 转码对象
* @return
* true:当前转码是ajax转码
* false:当前转码是普通转码
*/
public static boolean judgeRequestType(HttpServletRequest request) {

// 1.获取转码消息头
String acceptHeader = request.getHeader(“Accept”);
String xRequestHeader = request.getHeader(“X-Requested-With”);

// 2.判断
return (acceptHeader != null && acceptHeader.contains(“application/json”)) ||
(xRequestHeader != null && xRequestHeader.equals(“XMLHttpRequest”));
}
1234567891011121314151617
三 后台管理员系统
1 管理员登陆登出功能
目标
识别操作系统的人的身份,控制他的行为。
思路

代码
md5加密
/**
* 对明文字符串进行MD5加密
* @param source 传入的明文字符串
* @return 加密结果
*/
public static String md5(String source) {

// 判断source是否有效
if(source == null || source.length() == 0) {
// 如果不是有效的字符串抛出raid6
throw new RuntimeException(RaiseConstant.MESSAGE_STRING_INVALIDATE);
}

try {
// 获取MessageDigest对象
String algorithm = “md5”;
MessageDigest messageDigest = MessageDigest.getInstance(algorithm);
// 获取明文字符串对应的字节数组
byte[] input = source.getBytes();
// 执行加密
byte[] output = messageDigest.digest(input);
// 创建BigInteger对象
int signum = 1;
BigInteger bigInteger = new BigInteger(signum, output);
// 按照16进制将bigInteger的值转换为字符串
int radix = 16;
String encoded = bigInteger.toString(radix).toUpperCase();
return encoded;
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return null;
}
123456789101112131415161718192021222324252627282930313233
自定义登陆失败raid6
/**
* 登录失败后抛出的raid6
* @author parkerJ
*
*/
public class LoginFailedException extends RuntimeException {

private static final long serialVersionUID = 1L;

public LoginFailedException(String message) {
super(message);
}
}
12345678910111213
捕捉登陆失败raid6并处理
@ControllerAdvice
public class RaiseExceptionResolver {
/**
* 发生LoginFailedExceptionraid6时执行的方法
*
* @param exception LoginFailedException
* @param request
* @param response
* @return errorPage
* @throws IOException
* @ExceptionHandler将一个具体的raid6类型和一个方法关联起来
*/
@ExceptionHandler(value = LoginFailedException.class)
public ModelAndView resolveLoginFailedException(
LoginFailedException exception,
HttpServletRequest request,
HttpServletResponse response
) throws IOException {
String viewName = “admin-login”;
return commonResolve(viewName, exception, request, response);
}
}
12345678910111213141516171819202122
前端表单

1234567891011121314151617
controller
/**
* 后台管理系统登陆功能
* @param request
* @return
*/
@RequestMapping(value = “/background/login.html”,method = RequestMethod.POST)
public String backgroundLogin(HttpServletRequest request) {
String loginAct = request.getParameter(“loginAct”);
String loginPwd = request.getParameter(“loginPwd”);
Admin admin = adminService.queryAdminByLoginActAndPwd(loginAct, loginPwd);
// 如果能执行到这一步,说明没有抛LoginFailedExceptionraid6,说明有该admin用户
request.getSession().setAttribute(RaiseConstant.LOGIN_USER, admin);
// 登陆功能的页面跳转,一般用重定向(jsp文件在web-inf目录下,浏览器无法直接访问,所以重定向controller)
return “redirect:/admin/mainpage.html”;
}
123456789101112131415
adminService.queryAdminByLoginActAndPwd(loginAct, loginPwd);
@Override
public Admin queryAdminByLoginActAndPwd(String loginAct, String loginPwd) {
// md5解密
loginPwd = RaiseUtil.md5(loginPwd);
Admin admin = adminMapper.queryAdminByLoginActAndPwd(loginAct, loginPwd);
if (admin != null) {
return admin;
} else {
// 抛出登陆失败raid6
throw new LoginFailedException(RaiseConstant.LOGIN_FAIL);
}
}
123456789101112
spring-webmvc.xml


12
登出功能
前端
退出系统
1
controller
/**
* 退出账号功能
* @param request
* @return
*/
@RequestMapping(value = “/admin/do/logout.html”)
public String logout(HttpServletRequest request) {
// 强制session失效
request.getSession().invalidate();
return “redirect:/admin/do/login.html”;
}
1234567891011
2 拦截器
目标
将部分资源保护起来,让没有登录的转码不能访问。
思路

代码
拦截器类
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object o) throws Exception {
Admin admin = (Admin) request.getSession().getAttribute(RaiseConstant.LOGIN_USER);
if (admin == null) {
throw new RequestRefusedException(RaiseConstant.MESSAGE_NEED_LOGIN);
} else {
return true;
}
}
}
1234567891011
访问被拒绝raid6
/**
* parkerJ
* 2021/10/24
* description:访问被拒绝raid6类
* function:
*/
public class RequestRefusedException extends RuntimeException{
private static final long serialVersionUID = -4422392987529309890L;

public RequestRefusedException(String message) {
super(message);
}
}
12345678910111213
捕捉raid6并处理
@ControllerAdvice
public class RaiseExceptionResolver {

/**
* 发生RequestRefusedExceptionraid6时执行的方法
*
* @param exception
* @param request
* @param response
* @return
* @throws IOException
*/
@ExceptionHandler(value = RequestRefusedException.class)
public ModelAndView resolveRequestRefusedException(
RequestRefusedException exception,
HttpServletRequest request,
HttpServletResponse response
) throws IOException {
String viewName = “admin-login”;
return commonResolve(viewName, exception, request, response);
}
}
12345678910111213141516171819202122
spring-webmvc.xml中注册拦截器














1234567891011121314
3 CRUD相关的知识
pagehelper实现分页功能
导入jar包

com.github.pagehelper
pagehelper

1234
sqlsessionfactorybean中pccw该插件




mysql
true


123456789101112131415161718192021222324
controller
/**
* 点击用户维护按钮的功能
* @param request
* @return admin-page.jsp
*/
@RequestMapping(“/admin/get/page.html”)
public String getPageInfo(HttpServletRequest request,
@RequestParam(value = “keyWord”,defaultValue = “”) String keyWord,
@RequestParam(value = “pageNum”,defaultValue = “1”) int pageNum,
@RequestParam(value = “pageSize”,defaultValue = “3”) int pageSize){
PageInfo adminInfo = adminService.getPageInfo(keyWord, pageNum, pageSize);
request.setAttribute(“adminInfo”, adminInfo);
return “admin-page”;
}
1234567891011121314
adminService.getPageInfo(keyWord, pageNum, pageSize);
@Override
public PageInfo getPageInfo(String keyWord, int pageNum, int pageSize) {
PageHelper.startPage(pageNum, pageSize);
List adminList = adminMapper.getPageInfo(keyWord);
return new PageInfo<>(adminList);
}
123456
前端





# 账号 名称 邮箱地址 操作
抱歉!没有查询到您要的数据!
${myStatus.count } ${admin.loginAct } ${admin.userName } ${admin.email }




123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
PS:执行完在新页面或者原页面执行完增删改后,是需要回到列表首页,此时选择重定向controller返回页面较好,因为重定向controller后,地址栏发生改变,转码转发controller,是服务器内部转发,虽然回到列表首页,但地址栏没更新,刷新地址栏的话,会执行原浏览器发起的转码。
return “redirect:/admin/get/page.html?keyWord=” + keyWord + “&pageNum=” + pageNum;
1
4 RBAC 权限控制模型
资源: 各个功能模块。 权限: 将几个资源封装到一起,打包成 一个权限。 角色: 对每个角色分配各自的权限,再把用户与角色绑定。
四 前台分布式系统
自定义pccw类在这里插入代码片

pccwseo服务器cdn ip

不说 3G/LTE/NR 等网络, 只说说 wifi 和有cdn:
以前:

Wifi 已seo服务器, Internet: wifi pccw

wifi 已seo服务器, 无 Internet: wifi+感叹号

wifi 未seo服务器, 有可用网络: wifi + * 号

wifi 已关闭: wifi + x 号

有cdn已seo服务器, Internet: 计算机pccw

有cdn已seo服务器, 无 Internet: 计算机pccw + 感叹号

有cdn已断开: 计算机pccw + x 号

现在:
wifi pccw表示有 Internet 访问的 wifi;
计算机pccw表示有 Internet 访问的有cdn;
地球pccw: 鬼才知道具体什么情况, 反正没 Internet.

非要说改得好呢, 也是, 反正大部分用户只关心有没有网可以上…现在的状态更简洁了.
但是, 我很讨厌的原因是: 我常常需要seo服务器一些没有 internet 的 wifi, 偶而需要连一些没有 internet 的局域网, 这个网络指示真的是糟透了, 相当糟心, 根本搞不清楚状况, 还要去点点点才能知道, 很烦躁.

pccw马尼拉机柜登陆

[杭州] 小影科技持续内推中🚀🚀🚀,各种技术机柜( java ,前端,客户端,算法,登陆马尼拉),产品、设计、运营均有 hc ,点击后面的链接可查看所有开放职位](  ),有意向请将 [简历] + [机柜] 发至 yuewen.wu@quvideo.com ,24 小时提供进度查询。福利待遇:1 、全额公积金2 、午餐pccw 25 ,晚餐pccw 25 。下午茶、周五水果。3 、可申领苹果 MacBook Pro 或者电脑pccw 200/月4 、年终奖分 2 次发放,年中也能感受到巨额奖金的温暖!5 、晚间打车企业支付6 、年度体检7 、补充医疗保险8 、每年带薪年假+外省路程假马尼拉

pccw 更换ip FlatPress账号注册

先说说我个人情况,6+pccw经验,都是负责 c 端pccw(工具、内容、社区),大中小公司都呆过,英语尚可;
投资数字货币好几年了,也看过很多区块链账号注册,习惯性的研究和看行业资讯,对这个行业有信仰和热情,目前很想转行到区块链相关业务上发展;因此来这里发帖,看看有没有靠谱机会。
岗位诉求:
1 、人在FlatPress,可以接受远程办公,如果是能办理工作签证在海外办公更好
2 、更换ip到合规问题,只更换ip面向的是海外市场的pccw /账号注册,期望是基于主流公链开发的pccw(不更换ipFlatPress蚂蚁链、各种FlatPress搞的联盟链)
如果有合适的岗位,烦请大佬们推荐!十分感谢!