Переменные и параметры должны быть экранированы при отображении. Во многом это связано с
очисткой всего, всех переменных. которые отображаются, должны быть
экранированы при их отображении, чтобы они не могли перехватить пользователей или (что еще хуже) экраны администратора
. Существует множество функций esc_*(), которые вы можете использовать, чтобы убедиться, что вы
не показываете людям неправильные данные, а также некоторые, которые позволят вам
безопасно отображать HTML.В настоящее время мы просим вас избегать всех $-переменных, параметров и любых
сгенерированных данных при их отображении. Это означает, что вам следует
экранировать не при создании переменной, а при выводе ее в
конце. Мы называем это «побегом поздно».
Вопрос:
Что такое правильный способ экранирования этих переменных для использования во встроенном скрипте, добавленном с помощью wp_add_inline_script()? Как я могу изменить свой код, чтобы обеспечить его соответствие стандартам безопасности WordPress и предотвратить дальнейшие отклонения?
Код
Код: Выделить всё
private function add_iframe_inline_script($iframe_data) {
// Prepare the redirect URL for after verification
$redirectUrl = esc_url_raw(get_site_url() . '/verification/?order_id=' . $iframe_data['order_id']);
// Escape dynamic values for inclusion in the script
$url = esc_url_raw($iframe_data['url']); // Escaping URL for use in form action
$bin = esc_js($iframe_data['bin']); // Escaping JS value for the 'Bin' field
$jwt = esc_js($iframe_data['jwt']); // Escaping JS value for the 'JWT' field
$token = esc_js($iframe_data['token']); // Escaping JS value for 'token'
$reference = esc_js($iframe_data['reference']); // Escaping JS value for 'reference'
// The inline JavaScript, ensuring all dynamic values are properly escaped
$inline_script = "
const Iframe3ds = document.getElementById('3DSFrame');
var form = document.createElement('form');
form.setAttribute('id', 'collectionForm');
form.setAttribute('name', 'devicedata');
form.setAttribute('method', 'post');
form.setAttribute('action', '{$url}');
var binInput = document.createElement('input');
binInput.setAttribute('type', 'text');
binInput.setAttribute('name', 'Bin');
binInput.setAttribute('value', '{$bin}');
var jwInput = document.createElement('input');
jwInput.setAttribute('type', 'text');
jwInput.setAttribute('name', 'JWT');
jwInput.setAttribute('value', '{$jwt}');
form.append(binInput);
form.append(jwInput);
Iframe3ds.contentWindow.document.body.appendChild(form);
document.addEventListener('DOMContentLoaded', function(event) {
form.submit();
window.addEventListener('message', function(event) {
var SessionId = JSON.parse(event.data).SessionId;
window.location.href = '{$redirectUrl}&SessionId=' + SessionId + '&token={$token}&reference={$reference}';
});
});
";
// Add the inline script to the enqueued script
wp_add_inline_script('iframe-inline-script', $inline_script);
}
Подробнее здесь: https://stackoverflow.com/questions/791 ... -rejection