gpt4 book ai didi

php - 如何在 PHP 中替换/转义 U+2028 或 U+2029 字符以阻止我的 JSONP API 中断

转载 作者:IT王子 更新时间:2023-10-28 23:58:04 28 4
gpt4 key购买 nike

好的,我正在运行一个公共(public) JSONP API,数据由我的 PHP 服务器提供。我刚读了这篇文章:

基本上,如果我的 JSON 字符串包含 U+2028 字符(Unicode 行分隔符)或 U+2029 字符(Unicode 段落分隔符),那么这是完全有效的 JSON。但是,当使用 JSONP 时,JSON 将作为 JavaScript 执行,并且 JavaScript 中的任何字符串都不能包含文字 U+2028 或 U+2029,因为它会破坏 JavaScript。显然,只要您使用正确的 JSON 解析器,这通常不是问题,但在 JSONP 的情况下,浏览器 就是 JSON 解析器。

基本上,如果这些字符在我发送到客户端的 JSONP 数据的字符串中,这将在字符串中抛出一个行或段落中断,这会破坏 JavaScript 并停止它的执行。这是一种可能性,因为 API 正在发回一些客户端输入的数据。有人可能会在数据库中输入 U+2028 或 U+2029,因此当我将其作为 JSONP 发回时,它会破坏使用我的 API 的任何实现。

所以我的问题是,在 PHP 中如何清理/输出转义 JSON 数据以删除或转义 U+2028 和 U+2029 字符,然后再将其发送到客户端?

目前我的进程正在执行 json_encode在一组数据上并将该数据发送到客户端。我应该通过遍历数组并对其进行过滤来转义数据,还是一次转义所有 JSON 编码的字符串?

另一件事是我不确定如何在 PHP 中转义 U+2028 和 U+2029 字符。我可以做一个 str_replace 吗?我不确定 str_replace 是否是多字节安全的并且有 no mb_str_replace功能,除非我使用一些定制的。那么如何删除/转义那些 unicode 字符呢?

非常感谢。

最佳答案

您可以将U+2028U+2029替换为"\u2028""\u2029" 无论是在 PHP 端还是在 JavaScript 端,或者两者都无关紧要,只要它至少发生一次(它是幂等的)。

您可以只使用普通的字符串替换函数。它们不需要是“多字节安全的”,您可以在任何 Unicode 编码中轻松做到这一点(UTF-8、UTF-16、UTF-32 都一样好)。上次我检查时 PHP 没有 Unicode 转义序列,这只是 PHP 是个笑话的另一个原因,但您可以使用 \x 转义和 UTF-8...

(简而言之,没有多字节字符串替换函数的原因是它是多余的——它与非多字节字符串替换函数完全相同。)

// Javascript
data = data.replace("\u2028", "\\u2028").replace("\u2029", "\\u2029");

// PHP
$data = str_replace("\xe2\x80\xa8", '\\u2028', $data);
$data = str_replace("\xe2\x80\xa9", '\\u2029', $data);

或者您什么都不做,因为 PHP 在 json_encode() 中默认转义非 Unicode 字符:

// Safe
echo json_encode("\xe2\x80\xa9");
--> "\u2029"

// Correct JSON, but invalid Javascript...
// (Well, technically, JSON root must be array or object)
echo json_encode("\xe2\x80\xa9", JSON_UNESCAPED_UNICODE);
--> "
"

关于php - 如何在 PHP 中替换/转义 U+2028 或 U+2029 字符以阻止我的 JSONP API 中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14179377/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com