TP6封装使用步骤:
① 使用composer执行命令,安装 ezyang/htmlpurifier 扩展类库
项目目录下
composer require ezyang/htmlpurifier
② 在app/common.php中定义remove_xss函数
if (!function_exists('remove_xss')) {
//使用htmlpurifier防范xss攻击
function remove_xss($string){
//相对index.php入口文件,引入HTMLPurifier.auto.php核心文件
//require_once './plugins/htmlpurifier/HTMLPurifier.auto.php';
// 生成配置对象
$cfg = HTMLPurifier_Config::createDefault();
// 以下就是配置:
$cfg -> set('Core.Encoding', 'UTF-8');
// 设置允许使用的HTML标签
$cfg -> set('HTML.Allowed','div,b,strong,i,em,a[href|title],ul,ol,li,br,p[style],span[style],img[width|height|alt|src]');
// 设置允许出现的CSS样式属性
$cfg -> set('CSS.AllowedProperties', 'font,font-size,font-weight,font-style,font-family,text-decoration,padding-left,color,background-color,text-align');
// 设置a标签上是否允许使用target="_blank"
$cfg -> set('HTML.TargetBlank', TRUE);
// 使用配置生成过滤用的对象
$obj = new HTMLPurifier($cfg);
// 过滤字符串
return $obj -> purify($string);
}
}
说明:htmlpurifier插件,会过滤掉script标签以及标签包含的js代码。
中间件处理数据
class Safe
{
/**
* 处理请求
*
* @param \think\Request $request
* @param \Closure $next
* @return Response
*/
public function handle($request, \Closure $next)
{
try {
//
# 验证token 、可以直接加在路由后面
# 验证时间戳
$this->checkTime();
# 验证签名
$this->checkSign();
return $next($request);
}catch (Exception $exception) {
return json($exception->getMessage());
}
}
/**
* 验证时间戳
* @throws Exception
*/
public function checkTime(){
$client_time = request()->get('timestamp') ?: request()->post('timestamp');
if (!is_numeric($client_time)) {
throw new Exception('时间戳格式不正确');
}
if (time() - $client_time > 120) {
throw new Exception('请求超时');
}
}
/**
* 检查签名
*/
public function checkSign(){
$client_sign = request()->get('sign') ?: request()->post('sign');
# 判断是否有签名
if (!$client_sign) {
throw new Exception('签名不正确');
}
# 判断签名是否正确
$server_sign = $this->getSign();
if ($client_sign != $server_sign) {
throw new Exception('签名不正确');
}
}
/**
* 获取服务端签名
* @return string
*/
public function getSign(){
# 获取所有请求的参数
$params = request()->all();
# 签名规则
# 第一步 参与签名的参数不包括签名本身、不包括token
unset($params['sign']);
unset($params['token']);
# 第二步 按照ASCII排序
ksort($params);
$wait_sign = '';
foreach ($params as $key=> $value) {
$wait_sign .= $key.'='.$value.'&';
}
# 去除多余的& 符号
$wait_sign = rtrim($wait_sign,'&');
return md5($wait_sign);
}
}
前端生成sign
<script src="../javaScript-MD5/js/md5.js"></script>
<script>
// # 获取所有请求的参数
// # 签名规则
// # 第一步 参与签名的参数不包括签名本身、不包括token
// # 第二步 按照ASCII排序
// # 去除多余的& 符号
var params = new Array();
params['id'] = 1;
params['name'] = '张三';
var sign = createSign(params);
params['sign'] = sign;
var url = 'http://pyg.com/list?'
for (var i in params) {
url += i + '=' + params[i] + '&';
}
$.ajax({
url:url,
dataType:'json',
success:function (result) {
console.log(result);
}
})
function createSign(params) {
var timestamp = Math.ceil((new Date()).getTime()/1000);
params['timestamp'] = timestamp;
params.sort();
var wait_sign = ''
for (var i in params) {
wait_sign += i + '=' + params[i] + '&';
}
wait_sign = wait_sign.substr(0,wait_sign.length-1);
console.log(wait_sign)
sign = hex_md5(wait_sign)
return sign;
}
</script>
第二种:封装全局过滤方法
设置全局过滤方法为htmlspecialchars
[该方法会导致初始版的支付功能无法使用]
框架默认没有设置任何全局过滤规则,你可以在app\Request对象中设置filter全局过滤属性: |
namespace app;
class Request extends \think\Request
{
protected $filter = ['htmlspecialchars'];
}
————————————————
版权声明:本文为优快云博主「Doc_ACwhite」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/Doc_ACwhite/article/details/122924504