Wordpress проблема с полосками - PullRequest
0 голосов
/ 27 января 2010

Я передаю значение ABSPATH со страницы параметров темы WordPress на внешнюю страницу, которая не имеет доступа к ABSPATH. Проблема в том, что как только значение получено во внешнем файле, слэши удаляются. Как я могу отправить значение и сохранить косые черты без изменений?

Я передаю значение для ABSPATH через параметр URL-адреса javascript window.open, например ...

<input type="button" id="templateUpload" value="Add New Template" onclick="window.open('../wp-content/themes/mytheme/myuploader.php?abspath=<?php echo ABSPATH ?>','popup','width=330,height=230,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no'); return false" />

Исходный вид вышеописанной страницы параметров WordPress темы читается ...

abspath = C: \ xampplite \ HTDOCS \ WordPress /

Вот почему я считаю, что у меня проблема

1 Ответ

4 голосов
/ 27 января 2010

Отсутствие экранирования строкового литерала JavaScript спровоцировало вас: \x и \h - это экранирование в строках, поэтому вам нужно \\, чтобы получить настоящий обратный слеш.

Но это еще не все.

<input ...  onclick="window.open('.../myuploader.php?abspath=<?php echo ABSPATH ?>',... />

Здесь вы выводите значение в:

  1. параметр URL, внутри
  2. строковый литерал JavaScript, внутри
  3. атрибут 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 только потому, что нашел его довольно неприятным. ; -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...