滑雪板实用程序
Introduction
默认情况下,Snowboard 框架包含几个有助于简化开发的小实用程序。
Cookie
Cookie 实用程序是围绕js-cookie 提供简单、轻量级 JS API 的包,用于与浏览器 cookie 交互。
基本用法
创建一个 cookie,在整个站点有效:
Snowboard.cookie().set('name', 'value')
创建一个从现在起 7 天后过期的 cookie,在整个网站上有效:
Snowboard.cookie().set('name', 'value', { expires: 7 })
创建一个过期cookie,对当前页面的路径有效:
Snowboard.cookie().set('name', 'value', { expires: 7, path: '' })
读取 cookie:
Snowboard.cookie().get('name') // => 'value'
Snowboard.cookie().get('nothing') // => undefined
读取所有可见的 cookie:
Snowboard.cookie().get() // => { name: 'value' }
NOTE: 只有在读取 cookie 的地方有权根据浏览器读取 cookie,才能读取 cookie。
删除 cookie:
Snowboard.cookie().remove('name')
删除一个对当前页面路径有效的cookie:
Snowboard.cookie().set('name', 'value', { path: '' })
Snowboard.cookie().remove('name') // fail!
Snowboard.cookie().remove('name', { path: '' }) // removed!
IMPORTANT! 当删除一个 cookie 而你不依赖于默认属性,您必须传递用于设置 cookie 的完全相同的路径和域属性
Snowboard.cookie().remove('name', { path: '', domain: '.yourdomain.com' })
NOTE: 删除不存在的 cookie 既不会引发任何异常也不会返回任何值。
Encoding
包裹是RFC 6265 合规。 cookie-name 或 cookie-value 中不允许的所有特殊字符都使用每个人的 UTF-8 十六进制等效字符进行编码percent-encoding.
cookie-name 或 cookie-value 中唯一允许且仍被编码的字符是百分比%
字符,它被转义以将百分比输入解释为文字。
请注意,默认的编码/解码策略是可以互操作的仅在 js-cookie 读取/写入的 cookie 之间.要覆盖默认的编码/解码策略,您需要使用converter.
NOTE: 根据RFC 6265,如果您的 cookie 太大或同一域中的 cookie 太多,您的 cookie 可能会被删除,更多细节在这里.
饼干属性
可以通过以下方式创建 API 实例来全局设置 Cookie 属性withAttributes()
,或单独为每次调用Snowboard.cookie().set(...)
通过传递一个普通对象作为最后一个参数。每次调用属性覆盖默认属性。
NOTE: 您永远不应允许不受信任的输入来设置 cookie 属性,否则您可能会暴露于跨站脚本攻击.
expires
定义何时删除 cookie。值必须是Number
这将被解释为从创建时间开始的天数或Date
实例。如果省略,cookie 将成为会话 cookie。
要创建一个在一天内过期的 cookie,您可以检查维基上的常见问题解答.
Default: 当用户关闭浏览器时,Cookie 将被删除。
Examples:
Snowboard.cookie().set('name', 'value', { expires: 365 })
Snowboard.cookie().get('name') // => 'value'
Snowboard.cookie().remove('name')
path
AString
指示 cookie 可见的路径。
Default: /
Examples:
Snowboard.cookie().set('name', 'value', { path: '' })
Snowboard.cookie().get('name') // => 'value'
Snowboard.cookie().remove('name', { path: '' })
domain
AString
指示 cookie 应该可见的有效域。该 cookie 也将对所有子域可见。
Default: Cookie 仅对创建 Cookie 的页面的域或子域可见
Examples:
假设正在创建一个 cookieexample.com
:
Snowboard.cookie().set('name', 'value', { domain: 'subdomain.example.com' })
Snowboard.cookie().get('name') // => undefined (need to read at 'subdomain.example.com')
secure
任何一个true
或者false
,指示 cookie 传输是否需要安全协议 (https)。
Default: 无安全协议要求。
Examples:
Snowboard.cookie().set('name', 'value', { secure: true })
Snowboard.cookie().get('name') // => 'value'
Snowboard.cookie().remove('name')
sameSite
AString
,允许控制浏览器是否发送 cookie 以及跨站点请求。
默认值:未设置。
NOTE: 更新的浏览器正在使“Lax”成为默认值,即使没有在此处指定任何内容。
Examples:
Snowboard.cookie().set('name', 'value', { sameSite: 'strict' })
Snowboard.cookie().get('name') // => 'value'
Snowboard.cookie().remove('name')
设置默认值
为了设置用于使用创建的每个 cookie 的全局默认值Snowboard.cookie().set('name', 'value')
您可以调用的方法setDefaults(options)
Cookie 插件上的方法,它将提供的选项设置为全局默认值。
如果要获取当前默认值,请调用Snowboard.cookie().getDefaults()
.
Snowboard.cookie().setDefaults({ path: '/', domain: '.example.com' });
Snowboard.cookie().set('example', 'value');
Events
Cookie 插件提供了与 cookie 交互并在访问或创建期间修改其值的能力。
cookie.get
此事件运行期间Snowboard.cookie().get()
并提供(string) name
&(string) value
参数,以及一个回调方法,插件可以使用该回调方法以编程方式覆盖 cookie 值。这可用于操纵或解码 cookie 值。
class CookieDecryptor extends Singleton
{
listens() {
return {
'cookie.get': 'decryptCookie',
};
}
decryptCookie(name, value, setValue) {
if (name === 'secureCookie') {
setValue(decrypt(value));
}
}
}
cookie.set
此事件运行期间Snowboard.cookie().set()
并提供(string) name
&(string) value
参数,以及一个回调方法,插件可以使用该回调方法以编程方式覆盖保存到 cookie 的值。这将允许您在将 cookie 值存储到浏览器之前对其进行操作或加密。
class CookieEncryptor extends Singleton
{
listens() {
return {
'cookie.set': 'encryptCookie',
};
}
encryptCookie(name, value, setValue) {
if (name === 'secureCookie') {
setValue(encrypt(value));
}
}
}
JSON 解析器
JSON Parser 实用程序用于安全地解析不严格符合 JSON 规范的类 JSON(JS 对象字符串)数据。它对于解析中提供的值特别有用data-request-data
所使用的属性数据属性 功能。
这有点类似于JSON5 或者RJSON,但不完全是。关键方面是它允许以字符串形式表示为 JavaScript 对象的数据,就好像它正在积极运行 JS 一样,无需使用eval()
这可能会导致阻止使用的内容安全策略出现问题eval()
.
NOTE: 尽管此功能已记录在案,但普通开发人员不太可能需要与此功能进行交互。
Usage:
let data = "key: value, otherKey: 'other value';
let object = Snowboard.jsonParser().parse(`{${data}}`);
Sanitizer
Sanitizer 实用程序是一种客户端 HTML 清理程序,主要用于防止自我 XSS 攻击。这种攻击可能看起来像用户从使用剪贴板注入劫持实际存储在剪贴板中的值的网站复制内容,然后让用户将内容粘贴到内容将被视为 HTML 的环境中,通常在 richeditor /所见即所得的领域。
sanitizer 实用程序将删除以开头的所有属性on
(通常 JS 事件处理程序作为属性,即onload
或者onerror
) 或包含javascript:
它们的值中的伪协议。
它既可以作为全局函数使用(wnSanitize(html)
) 并作为滑雪板插件。
以下示例显示了如何连接 Froala 所见即所得编辑器以防止剪贴板注入/自 XSS 攻击。
$froalaEditor.on('froalaEditor.paste.beforeCleanup', function (ev, editor, clipboard_html) {
return Snowboard.sanitizer().sanitize(clipboard_html);
});
网址处理
Snowboard 包含一些有用的 URL 处理功能,以确保 Snowboard 功能中的 URL 是正确的。这是由Snowboard.url()
插入。
基本 URL 检测
加载 URL 插件时,它会自动检测当前项目的基本 URL,顺序基于三个来源:
- 如果滑雪板是通过
{% snowboard %}
Twig标签,这是加载Snowboard的推荐方式,然后是data-base-url
属性被添加到脚本标签中,并将作为基本 URL 传递给 Snowboard。 - 如果手动加载 Snowboard,它将尝试查找
<base>
HTML 中的标记。如果找到一个,则href
此标记的一部分将用作基本 URL。 - 如果以上选项均无效,则将根据当前 URL 将基本 URL 确定为站点的主机名。这会不行 如果您在子目录中托管 Winter,那么在这种情况下请使用上述任一选项。
您可以通过调用检索基本 URLSnowboard.url().baseUrl()
在你的 JavaScript 中的任何地方。
网址生成
您可以生成一个正确基于通过to
URL 插件中的方法。这将确保您在 JavaScript 中使用的任何 URL 都指向正确的 URL。
如果向此帮助程序提供了绝对 URL,它将原封不动地返回:
Snowboard.url().baseUrl();
// returns "https://mysite.com/"
Snowboard.url().to('/');
// returns "https://mysite.com/"
Snowboard.url().to('my-page/my-sub-page');
// returns "https://mysite.com/my-page/my-sub-page"
Snowboard.url().to('https://google.com');
// returns "https://google.com"