Ссылка: 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','<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','<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;
}
}
Это ограничивает доступ к простым идентификаторам, и подразумевается, что вы добавите # в селектор. Если вы хотите разрешить более сложные селекторы, вы можете обновить проверку.