wp_kses_attr

函数
wp_kses_attr ( $element, $attr, $allowed_html, $allowed_protocols )
参数
  • (string) $element HTML element/tag.
    Required:
  • (string) $attr HTML attributes from HTML element to closing HTML element tag.
    Required:
  • (array[]|string) $allowed_html An array of allowed HTML elements and attributes, or a context name such as 'post'. See wp_kses_allowed_html() for the list of accepted context names.
    Required:
  • (string[]) $allowed_protocols Array of allowed URL protocols.
    Required:
返回值
  • (string) Sanitized HTML element.
定义位置
相关方法
wp_kses_one_attrwp_kses_datawp_kses_hairwp_kses_attr_parsewp_kses_attr_check
引入
1.0.0
弃用
-

wp_kses_attr: 这个函数用于通过删除任何潜在的恶意或不允许的内容来对单个HTML属性进行净化。

如果该元素不允许有任何属性,则删除所有属性。

如果允许一些属性,它会调用`wp_kses_hair()`来进一步分割它们,然后用`wp_kses_hair()`返回的数据建立新的HTML代码。它还会删除“字符,如果有任何剩余的话。它还会检查标签是否有XHTML斜线结尾,如果有,它也会在返回的代码中加入一个。

可以为属性定义一个允许值数组。如果属性值不在列表中,该属性将被从标签中删除。

属性可以被标记为必填。如果一个必需的属性不存在,KSES将从标签中删除所有属性。由于KSES不匹配标签的开头和结尾,因此不可能安全地删除标签本身,最安全的退路是剥离标签中的所有属性。

function wp_kses_attr( $element, $attr, $allowed_html, $allowed_protocols ) {
	if ( ! is_array( $allowed_html ) ) {
		$allowed_html = wp_kses_allowed_html( $allowed_html );
	}

	// Is there a closing XHTML slash at the end of the attributes?
	$xhtml_slash = '';
	if ( preg_match( '%s*/s*$%', $attr ) ) {
		$xhtml_slash = ' /';
	}

	// Are any attributes allowed at all for this element?
	$element_low = strtolower( $element );
	if ( empty( $allowed_html[ $element_low ] ) || true === $allowed_html[ $element_low ] ) {
		return "<$element$xhtml_slash>";
	}

	// Split it.
	$attrarr = wp_kses_hair( $attr, $allowed_protocols );

	// Check if there are attributes that are required.
	$required_attrs = array_filter(
		$allowed_html[ $element_low ],
		function( $required_attr_limits ) {
			return isset( $required_attr_limits['required'] ) && true === $required_attr_limits['required'];
		}
	);

	/*
	 * If a required attribute check fails, we can return nothing for a self-closing tag,
	 * but for a non-self-closing tag the best option is to return the element with attributes,
	 * as KSES doesn't handle matching the relevant closing tag.
	 */
	$stripped_tag = '';
	if ( empty( $xhtml_slash ) ) {
		$stripped_tag = "<$element>";
	}

	// Go through $attrarr, and save the allowed attributes for this element in $attr2.
	$attr2 = '';
	foreach ( $attrarr as $arreach ) {
		// Check if this attribute is required.
		$required = isset( $required_attrs[ strtolower( $arreach['name'] ) ] );

		if ( wp_kses_attr_check( $arreach['name'], $arreach['value'], $arreach['whole'], $arreach['vless'], $element, $allowed_html ) ) {
			$attr2 .= ' ' . $arreach['whole'];

			// If this was a required attribute, we can mark it as found.
			if ( $required ) {
				unset( $required_attrs[ strtolower( $arreach['name'] ) ] );
			}
		} elseif ( $required ) {
			// This attribute was required, but didn't pass the check. The entire tag is not allowed.
			return $stripped_tag;
		}
	}

	// If some required attributes weren't set, the entire tag is not allowed.
	if ( ! empty( $required_attrs ) ) {
		return $stripped_tag;
	}

	// Remove any "<" or ">" characters.
	$attr2 = preg_replace( '/[<>]/', '', $attr2 );

	return "<$element$attr2$xhtml_slash>";
}

常见问题

FAQs
查看更多 >