esc_url 在 WordPress ACF oEmbed 上

esc_url on WordPress ACF oEmbed

我正在使用 ACF WordPress 插件创建 oEmbed 字段。该字段接受来自 Vimeo 的 URL,并在前端输出一个 iframe。

我通常像这样在我的主题中转义 url 和属性:

<a href="<?= esc_url( get_field('link') ); ?>" title="<?= esc_attr( get_field('title') ); ?>">

当我尝试退出 oEmbed 时,没有任何显示:

<?= esc_url( get_field('video') ); ?>

如果我使用以下脚本测试 XSS,ACF 字段会因 JS 错误而完全中断。

<script>alert('hello')</script>

我需要转义这个字段吗?我假设 WordPress 负责通过 oEmbed 函数进行转义?

您是否尝试过使用 the_field() 而不是 get_field()?

<?= esc_url( the_field('video') ); ?>

oEmbed 实际上 returns 不仅仅是 url,所以这也可能是问题所在。我过去并没有使用 esc_url() 太多,但它可能会被打破,因为通过的不仅仅是 url。

如此处所述,https://www.advancedcustomfields.com/resources/oembed/、"The oEmbed field will return a string containing the embed HTML"。

来自官方documentation:

The oEmbed field will return a string containing the embed HTML.

即使输入的类型为 URL,在获取值时,ACF 也会将其转换为完整的 HTML 嵌入代码。总之,在这个HTML上调用esc_url是错误的,你只需要使用the_field('video')echo get_field('video')

至于 ACF 在 oEmbed 类型输入中接受无效(非 URL)数据,您可以编写一个自定义验证器来引发错误,如果需要的话,可以实现一个过滤器:acf/validate_value.