普通视图
上帝视角看 GPU 学习笔记
React Native DApp 开发全栈实战·从 0 到 1 系列(兑换-合约部分)
🚀🚀🚀 RichLab - 花呗前端团队招贤纳士 - 【转岗/内推/社招】
Oxc 和 Rolldown Q4 更新计划速览!🚀🚀🚀
Web安全必备:关键 HTTP 标头解析
-
建议处理敏感用户数据的网站添加以下安全标头:
-
建议所有网站添加的安全标头:
-
具有高级功能的网站的安全标头:
保护您的网站免受注入漏洞的侵害
内容安全政策 (CSP)
跨站脚本攻击 (XSS) 是一种攻击,攻击者会利用网站上的漏洞注入和执行恶意脚本。
Content-Security-Policy
通过限制网页可以执行哪些脚本,提供了额外的层级来缓解 XSS 攻击。
Content-Security-Policy:
script-src 'nonce-{RANDOM1}' 'strict-dynamic' https: 'unsafe-inline';
object-src 'none';
base-uri 'none';
可信类型
基于 DOM 的 XSS 是一种攻击,攻击者会将恶意数据传递到支持动态代码执行的接收器(例如 eval()
或 .innerHTML
)。
Content-Security-Policy: require-trusted-types-for 'script'
// Feature detection
if (window.trustedTypes && trustedTypes.createPolicy) {
// Name and create a policy
const policy = trustedTypes.createPolicy('escapePolicy', {
createHTML: str => {
return str.replace(/</g, '<').replace(/>/g, '>');
}
});
}
// Assignment of raw strings is blocked by Trusted Types.
el.innerHTML = 'some string'; // This throws an exception.
// Assignment of Trusted Types is accepted safely.
const escaped = policy.createHTML('<img src=x onerror=alert(1)>');
el.innerHTML = escaped; // '&lt;img src=x onerror=alert(1)&gt;'
X-Content-Type-Options
如果恶意 HTML 文档是从您的网域中提交的(例如,上传到照片服务中的图片包含有效的 HTML 标记),某些浏览器会将其视为有效文档,并允许其在应用上下文中执行脚本,从而导致跨网站脚本漏洞。
X-Content-Type-Options: nosniff
通过指示浏览器为给定响应在 Content-Type
标头中设置的 MIME 类型正确无误来防止此类问题。
X-Content-Type-Options: nosniff
将您的网站与其他网站隔离
X-Frame-Options
如果恶意网站可以将您的网站嵌入为 iframe,攻击者就可能会通过点击欺骗来诱导用户执行意外操作。此外,在某些情况下,Spectre 类型的攻击会让恶意网站有机会了解嵌入式文档的内容。
X-Frame-Options
用于指示是否应允许浏览器在 <frame>
、<iframe>
、<embed>
或 <object>
中渲染网页。
X-Frame-Options: DENY
跨源资源政策 (CORP)
攻击者可以嵌入来自其他来源(例如您的网站)的资源,以利用基于网络的跨网站数据泄露来了解这些资源。
Cross-Origin-Resource-Policy
通过指明可由哪些网站加载来缓解此风险。标头采用以下三个值之一:same-origin
、same-site
和 cross-origin
。建议所有资源发送此标头,以指明它们是否允许由其他网站加载。
Cross-Origin-Resource-Policy: same-origin
跨源打开者政策 (COOP)
攻击者的网站可以利用基于网页的跨网站数据泄露,在弹出式窗口中打开另一个网站,以了解该网站的相关信息。在某些情况下,这可能还会允许利用基于 Spectre 的旁道攻击。
Cross-Origin-Opener-Policy
标头提供了一种方法,可让文档与通过 window.open()
打开的跨源窗口或不带 rel="noopener"
的 target="_blank"
链接隔离。因此,文档的任何跨源打开器都不会引用该文档,也无法与其互动。
Cross-Origin-Opener-Policy: same-origin-allow-popups
跨源资源共享 (CORS)
与本文中的其他内容不同,跨源资源共享 (CORS) 不是标头,而是一种用于请求和允许访问跨源资源的浏览器机制。
默认情况下,浏览器会强制执行同源政策,以防止网页访问跨源资源。例如,在加载跨源图片时,即使该图片在网页上以可视方式显示,网页上的 JavaScript 也无法访问该图片的数据。资源提供方可以通过选择启用 CORS 来放宽限制,并允许其他网站读取资源。
Access-Control-Allow-Origin: https://example.com
Access-Control-Allow-Credentials: true
安全地构建强大的网站
跨源嵌入器政策 (COEP)
为了降低基于 Spectre 的攻击窃取跨源资源的能力,SharedArrayBuffer
或 performance.measureUserAgentSpecificMemory()
等功能默认处于停用状态。
Cross-Origin-Embedder-Policy: require-corp
会阻止文档和工作器加载跨源资源(例如图片、脚本、样式表、iframe 等),除非这些资源明确选择通过 CORS 或 CORP 标头加载。COEP 可与 Cross-Origin-Opener-Policy
结合使用,以选择将文档纳入跨源隔离。
如需为文档启用跨源隔离,请使用 Cross-Origin-Embedder-Policy: require-corp
。
Cross-Origin-Embedder-Policy: require-corp
加密指向您网站的流量
HTTP 严格传输安全协议 (HSTS)
通过普通 HTTP 连接进行的通信不会加密,因此网络级窃听者可以访问传输的数据。
Strict-Transport-Security
标头会告知浏览器绝不应使用 HTTP 加载网站,而应改用 HTTPS。设置完毕后,在标头中定义的时间段内,浏览器将使用 HTTPS(而非 HTTP)访问网域,且不会重定向。
Strict-Transport-Security: max-age=31536000
优雅表格设计:CSS 美化技巧详解
网页深色模式完整实现:从响应式设计到系统主题联动
内容安全策略(CSP)深度指南:从基础配置到高级防护
在 create-react-app (CRA) 创建的应用中使用 react-router-dom v7以及懒加载的使用方法
Electron38-Winchat聊天系统|vite7+electron38+vue3电脑端聊天Exe
JavaScript中的dispatchEvent方法详解
F2C-PTD工具将需求快速转换为代码实践
HarmonyOS 5.0应用开发——V2装饰器@local的使用
后端转全栈之Next.js文件约定
JS-SDK开发企微侧边栏
可可图片编辑 HarmonyOS(6)水印效果
可可图片编辑 HarmonyOS(6)水印效果
前言
可可图片编辑 也实现了水印效果,这个功能的实现比较取巧。
在预览阶段,直接通过层叠布局来实现水印效果。
在保存图片时,使用组件截图 componentSnapshot 的知识实现保存图片。
componentSnapshot
介绍
componentSnapshot
是 HarmonyOS提供的一个强大功能,允许开发者获取应用中组件的截图,生成 PixelMap 格式的图片数据。这对于实现分享功能、内容保存、动态生成图片等场景非常有用。
基本使用步骤
1. 准备工作:添加组件标识
首先需要为想要截图的组件添加唯一标识:
// 在build方法中为组件添加id
build() {
Column() {
// 需要截图的组件
Column() {
Text('这是要截图的内容')
.fontSize(20)
Image($r('app.media.icon'))
.width(100)
.height(100)
}
.id('targetComponent') // 添加唯一标识
// 其他UI组件...
}
}
2. 获取截图的基本方法
方法一:异步获取(推荐)
import { image } from '@kit.ImageKit';
// 在按钮点击或其他事件中
async takeScreenshot() {
try {
// 获取UIContext
const uiContext = this.getUIContext();
// 使用componentSnapshot获取截图
const pixelMap = await uiContext.getComponentSnapshot()
.get('targetComponent', {
scale: 1.0, // 缩放比例
waitUntilRenderFinished: true // 等待渲染完成
});
// 处理截图结果
this.handleScreenshotResult(pixelMap);
} catch (error) {
console.error('截图失败:', error);
}
}
// 处理截图结果
handleScreenshotResult(pixelMap: image.PixelMap) {
// 可以显示在Image组件中
this.screenshotImage = pixelMap;
// 或者保存到文件
// this.saveToFile(pixelMap);
}
方法二:同步获取
takeScreenshotSync() {
try {
const uiContext = this.getUIContext();
const pixelMap = uiContext.getComponentSnapshot()
.getSync('targetComponent', {
scale: 0.8,
waitUntilRenderFinished: true
});
this.handleScreenshotResult(pixelMap);
} catch (error) {
console.error('同步截图失败:', error);
}
}
3. 显示截图结果
// 在build方法中显示截图
build() {
Column() {
// 原始内容
Column() {
// ...原有内容
}
.id('targetComponent')
// 截图结果显示
Image(this.screenshotImage)
.width(200)
.height(200)
.margin(10)
.visibility(this.screenshotImage ? Visibility.Visible : Visibility.None)
// 截图按钮
Button('截图')
.onClick(() => this.takeScreenshot())
.margin(10)
}
}
4. 完整示例代码
import { image } from '@kit.ImageKit';
@Entry
@Component
struct ScreenshotExample {
@State screenshotImage: image.PixelMap | undefined = undefined;
// 异步截图方法
async takeScreenshot() {
try {
const uiContext = this.getUIContext();
const pixelMap = await uiContext.getComponentSnapshot()
.get('contentToCapture', {
scale: 1.0,
waitUntilRenderFinished: true
});
this.screenshotImage = pixelMap;
} catch (error) {
console.error('截图失败:', error);
}
}
build() {
Column({ space: 20 }) {
// 目标截图区域
Column() {
Text('欢迎使用组件截图功能')
.fontSize(24)
.fontColor(Color.Blue)
Text('这是可以截图的内容区域')
.fontSize(16)
.margin({ top: 10 })
Image($r('app.media.logo'))
.width(120)
.height(120)
.margin({ top: 20 })
}
.id('contentToCapture')
.padding(20)
.border({ width: 2, color: Color.Gray })
// 截图结果显示
if (this.screenshotImage) {
Image(this.screenshotImage)
.width(300)
.height(200)
.border({ width: 1, color: Color.Black })
}
// 操作按钮
Button('截图')
.width(120)
.onClick(() => this.takeScreenshot())
}
.width('100%')
.padding(20)
}
}
5. SnapshotOptions 重要参数说明
配置选项:
- scale: number - 缩放比例(0.1-1.0),默认1.0
- waitUntilRenderFinished: boolean - 是否等待渲染完成(推荐设为true)
- region: Object - 指定截图区域
- start: number - 起始x坐标
- top: number - 起始y坐标
- end: number - 结束x坐标
- bottom: number - 结束y坐标
以往文章
-
我的iMaHarmonyOS 知识库接入 鸿蒙6 API20 新特性了
-
鸿蒙创新赛 HarmonyOS 6.0.0(20) 关键特性汇总
-
可可图片编辑 HarmonyOS(4)图片裁剪-canvas
-
可可图片编辑 HarmonyOS(3)应用间分享图片