一,php.ini中httponly了解
概念
httpOnly 是一个常见的 Cookie 属性,用于增加对于跨站点脚本攻击(XSS)的防护。将 Cookie 的 httpOnly 属性设置为 true 会限制浏览器端 JavaScript 对该 Cookie 的访问,只允许在 HTTP 请求中自动发送 Cookie,而禁止通过 javaScript 来读取或修改该 Cookie。
大概设置成了只读
接下来进行我们的模拟小实验
准备工作
create cookie.php
<?php session start(); ?>
create get_cookie.php
<?php $content =$_GET["content"]; echo $content; ?>
尝试获取cookie
生成cookie(通过访问页面,打开session生成)
实验前记得清一下浏览器cookie
http://192.168.159.128/cookie.php
在页面访问获取cookie
实际上就是利用xss漏洞来实现
http://192.168.7.87/get_cookie.php?name=<script>alert(document.cookie)</script>
禁止js使用cookie
方法一
在php.ini配置文件中进行cookie只读设置的开启(有效范围:全局) 搜索session.cookie_httponly session.cookie httponly = On
方法二
在php代码顶部设置(有效范围:当前页面)
<?php ini_set("session.cookie httponly",1); php>
另外的防御方案就是对用户的输入进行各种校验,过程非常繁琐,还容易出错或者遗漏,有没有一种方法可以想 cors那样快捷方便地通过响应头的约束,就可以让浏览器执行安全检查,杜绝XSS漏洞呢?
接下来我们就可以来了解csp内容安全策略了。
二,csp内容安全策略
什么是
csp是一种安全策略,其原理是当浏览器请求某一个网站时,告诉该浏览器申明文件可以执行,什么不可以执行。CSP的引入会使得我们的引入扩展程序更加安全,并且可以由开发者指定可以加载扩展程序的类型,避免恶意的脚本在浏览器中执行,造成信息泄露问题。(xss主要的防御手段)
主要可以理解成白名单,CSP 大大增强了网页的安全性。攻击者即使发现了漏洞,也没法注入脚本,除非还控制了一台列入了白名单的可信主机。
尝试使用
准备工作
csp.php
<?php header("Content-Security-Policy: script-src 'self'"); echo "用户信息<br>"; include "./fish/dbUtil.php"; $id=$_GET['id']; $sql = "select * from user where id=$id;"; $res = queryRow($sql); print_r($res); ?>
dbUtil.php
/** * 通用的数据库操作文件 */ //1.链接数据库 function getConnection(){ $conn = mysqli_connect("192.168.159.128","root","123456","xss"); mysqli_query($conn,"set names utf8"); return $conn; } //2.增删改 function update($sql){ //链接数据库 $conn = getConnection(); $res = mysqli_query($conn,$sql); return $res; } //3.查询单行数据 function queryRow($sql){ $conn = getConnection(); $res = mysqli_query($conn,$sql); $arr = mysqli_fetch_row($res); return $arr; } //4.查询多行数据 function queryAll($sql){ $conn = getConnection(); $res = mysqli_query($conn,$sql); $arr = mysqli_fetch_all($res); return $arr; } ?>
模拟xss漏洞(存储型)
常用的CSP指令(引用其它博主收集的,很详细)
-
default-src, “self” “cdn.guangzhul.com”, 默认加载策略
-
script-src, “self” “js.guangzhul.com” ,对javascript的加载策略
-
style-src, “self” “css.guangzhul.com” ,对样式的加载策略
-
img-src, “self” “img.guangzhul.com” ,对图片的加载策略
-
content-src ,“self” ,对ajax,websocket请求的加载策略。不允许的情况下浏览器会模拟一个状态为400的相应
-
font-src ,“font.cdn.guangzhul.com” ,针对webFont的加载策略
-
object-src, “self” ,指针或标签引入flash等插件的加载策略
-
media-src, media.cdn.guangzhul.com ,针对媒体引入的HTML多媒体的加载策略
-
frame-src ,“self” ,针对frame的加载策略
-
report-uri, /report-uri ,告诉浏览器如果请求的资源不被策略允许时,往哪个地址提交日志信息。 特别的:如果想让浏览器只汇报日志,不阻止任何内容,可以改用 Content-Security-Policy-Report-Only 头
其他的CSP指令
-
sandbox 设置沙盒环境
-
child-src 主要防御 frame,iframe
-
form-action 主要防御 form
-
frame-ancestors 主要防御 frame,iframe,object,embed,applet
-
plugin-types 主要防御 object,embed,applet
CSP指令值
以下按照 指令值 指令值示例(指令、指令值)进行编排:
-
* img-src * 允许任何内容
-
“none” img-src “none” 不允许任何内容
-
“self” img-src “self” 允许来自相同的来源的内容(相同的协议,域名和端口)
-
data: img-src data: 允许data协议(如base64编码的图片)
-
www.guangzhul.com img-src img.guangzhul.com 允许加载指定域名下的资源
-
*.guangzhulcom img-src: *.guangzhul.com 允许加载guangzhul.com任何子域下面的资源
-
“unsafe-inline” script-src “unsafe-inline” 允许加载inline的资源 例如常见的 style 属性,onclick,inline js 和 inline css 等等
-
“unsafe-eval” script-src “unsafe-eval” 允许加载动态js代码,例如eval()
-
'nonce'仅限一次的字符串
参考文章
https://blog.csdn.net/weixin_47450807/article/details/123224654