WP Как проверить что получаемый объект SVG формата?

Есть необходимость в WordPress перед тем как записать в базу данных сделать проверку, на то является ли передаваемый с фронта элемент svg и не наделает ли он проблем. Нужна проверка на безопасный <svg> без сторонних вкладок. Как это можно сделать ? Мой код проверки.

add_action('wp_ajax_save_svg_content', 'save_svg_content_callback');
function save_svg_content_callback() {
    if (current_user_can('manage_options')) {
        $svg_content = isset($_POST['svg_content']) ? $_POST['svg_content'] : '';

        if (!empty($svg_content)) {
            $upload_dir = wp_upload_dir();
            $subdirectory = $upload_dir['subdir'];
            $filename = 'generated_svg_' . date('Y-m-d_H-i-s') . '.svg';
            $file_path = trailingslashit($upload_dir['basedir'] . $subdirectory) . $filename;
            $svg_content = stripslashes($svg_content);

            // Saving an SVG file
            file_put_contents($file_path, $svg_content);

            // Adding a file to the Media Library
            $attachment = array(
                'post_title' => sanitize_file_name($filename),
                'post_content' => '',
                'post_status' => 'inherit',
                'post_mime_type' => 'image/svg+xml',
            );

            $attachment_id = wp_insert_attachment($attachment, $file_path);
            require_once(ABSPATH . 'wp-admin/includes/image.php');
            $attachment_data = wp_generate_attachment_metadata($attachment_id, $file_path);
            wp_update_attachment_metadata($attachment_id, $attachment_data);

            _e('SVG file saved successfully!', 'generator-svg');
        } else {
            _e('Invalid SVG content!', 'generator-svg');
        }
    }
    wp_die();
}

Проверяемый элемент который скорее всего прийдет с фронта

$svg_content = '<svg class="svgCurve" xmlns="http://www.w3.org/2000/svg" width="120" height="60" viewBox="0 0 120 60">
            <style>.svgCurve path{fill:none;stroke:#fe6c3b;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}</style>
            <path d="M.8 41.8s14-21 28.3-14.3c14.4 6.7 7.2 20.3 1.7 18.5-5.9-1.9-7-20 9.4-21.8s23.6 5 32.7 8.5c9.1 3.5 33.8 6.6 44.3-10.2"/>
            <path d="m111.2 25.9 6.2-4-.8 6"/></svg>';

Может есть встроеные функции для проверки в WP ? Я находил что-то такое, но для моего примера svg оно не работает.

function is_valid_svg($content) {
    // Удаление XML-декларации
    $content = preg_replace('/<\?xml.*\?>/', '', $content);

    $dom = new DOMDocument;
    libxml_use_internal_errors(true);

    if (!$dom->loadXML($content, LIBXML_NOERROR)) {
        libxml_clear_errors();
        return false;
    }

    $xpath = new DOMXPath($dom);
    $svg = $xpath->query('//svg')->item(0);

    libxml_clear_errors();

    return $svg !== null;
}


Ответы (1 шт):

Автор решения: KAGG Design

Функция stripslahes удаляет слеши, экранирующие определённые символы в переданном с фронта контенте. Вместо неё надо использовать wp_unslash( $svg_content ).

Опасность во введённом контенте представлют скрипты. Их надо удалить с помощью стандартной PHP-функции [strip_tags()][1]. Вторым аргументом в ней надо указать разрешенные теги svg.

    $svg_content = strip_tags( $svg_content, '<svg><style><path>' );

Возможных тегов svg довольно много, поэтому, возможно, этот вариант будет ломать какой-то валидный svg контент. Тогда можно попробовать удалить только скрипты из контента.

    $svg_content = preg_replace( '@<(script)[^>]*?>.*?</\\1>@si', '', $svg_content );
→ Ссылка