Клиент представил селекторы jQuery, это безопасно? - PullRequest
0 голосов
/ 04 мая 2018

Безопасно ли в XSS разрешать клиентам отправлять селекторы jQuery?

Я бы запустил строку селектора, переданную потенциально троллями, и поместил бы ее в $('') для выбора элементов на странице.

1 Ответ

0 голосов
/ 04 мая 2018

Ссылка: https://html.spec.whatwg.org/multipage/dom.html#the-id-attribute

При указании в HTML-элементах значение атрибута id должно быть уникальным среди всех идентификаторов в дереве элемента и должен содержать как минимум один персонаж Значение не должно содержать пробелов ASCII.

В большинстве случаев идентификаторы - это буквы и цифры с дефисами или подчеркиванием. Этот код требует, чтобы первым символом идентификатора была буква, за которой следуют дополнительные буквы, цифры, подчеркивания и тире.

Если вы хотите таким образом ограничить идентификаторы доступных элементов, вы можете использовать следующую схему проверки для предотвращения XSS.

JavaScript (будет работать на сервере)

var i, l;
var submittedSelectors = ['<script>alert("ha");</script>','<img src="bogus.com?img=5">','geraniums','https://www.example.com','&lt;etc'];

l = submittedSelectors.length;
for (i = 0; i < l; i++) {
    validate(submittedSelectors[i]);
}

function validate(submitted) {
    if (!/^[a-z][\w-.]{1,62}$/i.test(submitted)) {
        console.log(submitted+' is not valid\n');
        return false;
    } else {
        console.log(submitted+' is okay\n');
        return true;
    }
}

PHP

<?php

$submittedSelectors = ['<script>alert("ha");</script>','<img src="bogus.com?img=5">','geraniums','https://www.example.com','&lt;etc'];

foreach ($submittedSelectors as $ss) {
        validate($ss);
}

function validate($submitted = '') {
        $selector = filter_var($submitted,
                        FILTER_VALIDATE_REGEXP,
                        ['options' => ['regexp' => '/^[a-z][\w-.]{1,64}$/i' ]]);

        if (empty($selector)) {
                echo htmlentities($submitted).' is not valid'.PHP_EOL;
                return false;
        } else {
                echo $selector.' is okay'.PHP_EOL;
                return true;
        }
}

Это ограничивает доступ к простым идентификаторам, и подразумевается, что вы добавите # в селектор. Если вы хотите разрешить более сложные селекторы, вы можете обновить проверку.

...