Отсутствие экранирования строкового литерала JavaScript спровоцировало вас: \x
и \h
- это экранирование в строках, поэтому вам нужно \\
, чтобы получить настоящий обратный слеш.
Но это еще не все.
<input ... onclick="window.open('.../myuploader.php?abspath=<?php echo ABSPATH ?>',... />
Здесь вы выводите значение в:
- параметр URL, внутри
- строковый литерал JavaScript, внутри
- атрибут HTML
Это означает, что вам нужно три уровня побега:
$uri= '../wp-content/themes/mytheme/myuploader.php?abspath='.urlencode(ABSPATH);
$jsuri= json_encode($uri);
$htmljsuri= htmlspecialchars($jsuri);
<input ... onclick="window.open(<?php echo $htmljsuri; ?>, 'popup', 'features...')" />
Вы можете уменьшить это, используя параметры HEX_ в json_encode, чтобы гарантировать, что специальные символы HTML уже экранированы, в PHP 5.3 +:
$uri= '../wp-content/themes/mytheme/myuploader.php?abspath='.urlencode(ABSPATH);
$jsuri= json_encode($uri, JSON_HEX_QUOT|JSON_HEX_TAG|JSON_HEX_AMP);
<input ... onclick="window.open(<?php echo $jsuri; ?>, 'popup', 'features...')" />
Однако все, что связано с несколькими уровнями побега, как это, сбивает с толку и, как правило, его следует избегать. Вместо этого уберите JavaScript и переменную из разметки, и у вас есть только один уровень перехода, о котором вам следует беспокоиться:
<input type="button" id="templateUpload" value="Add New Template" />
<script type="text/javascript">
var ABSPATH= <?php echo json_encode(ABSPATH, JSON_HEX_TAG|JSON_HEX_AMP); ?>;
document.getElementById('templateUpload').onclick= function() {
var uri= '../wp-content/themes/mytheme/myuploader.php?abspath='+encodeURIComponent(ABSPATH);
window.open(uri, 'popup', 'width=330, height=230');
};
</script>
Я опустил return false
, так как он не нужен для button
, который не имеет действия по умолчанию для предотвращения. Я также удалил материал об удалении браузера Chrome только потому, что нашел его довольно неприятным. ; -)