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 шт):
Функция 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 );