php 防止注入 xss,PHP 安全输入输出方式 「防止 XSS 注入」

XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。我在开发中使用严进严出的安全保障方式:

保证安全输入(严进)

添加中间件,对所有参数进行过滤转换:

htmlspecialchars() 函数把一些预定义的字符转换为 HTML 实体

strip_tags() 函数剥去字符串中的 HTML、XML 以及 PHP 的标签

class XSSFilter

{

public function handle($request, Closure $next)

{

// 配置不执行过滤转换参数项,如 env 配置: XSS_EXCEPT=article_contents,html_contents

$param_except_string = config('const.xss_filter_param_except');

$param_except = [];

if (!empty($param_except_string)) {

$param_except = explode(',', $param_except_string);

}

$input = $request->except($param_except);

array_walk_recursive($input, function (&$input) {

// $input = strip_tags($input); // 清除标签内容

$input = htmlspecialchars($input, ENT_NOQUOTES, 'UTF-8', false); // 过滤转换预定符号

});

$request->merge($input);

return $next($request);

}

}

使用安全输出(严出)

Laravel 安全输出方式

Blade 模板中使用转义输出:{{ }}

直接输出时,使用 e() 函数进行过滤

Bad:

$nickname = "x测试昵称";

{!! $nickname !!}

@php

echo $nickname

@endphp

Good:

$nickname = "x测试昵称";

{{ $nickname }}

@php

echo e($nickname);

@endphp

等同于:

使用 htmlspecialchars 进行过滤转换

Bad:

$nickname = "x测试昵称";

echo $nickname;

Good:

function p($value) {

return htmlspecialchars($value, ENT_QUOTES, 'UTF-8', false);

}

$nickname = "x测试昵称";

echo p($nickname);

开启 httpOnly

开启 httpOnly 后,禁止 JavaScript 脚本直接读取该 Cookie 内容

Laravel Session

创建 Cookie 时,调用

cookie($name = null, $value = null, $minutes = 0, $path = null, $domain = null, $secure = false, $httpOnly = true)

最后一个参数 $httpOnly = true

PHP 原生 Session

如果是 PHP 原生 Session 对应 Cookie 键值默认为: PHPSESSID

需要手工修改 php.ini 配置开启 httpOnly: Session.cookie_httponly = On

本作品采用《CC 协议》,转载必须注明作者和本文链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值