允许客户端提交 jQuery 选择器是否是 XSS 安全的?
我会运行一个可能由巨魔提交的选择器字符串,并将其放入$('')
页面上的选择元素中。
允许客户端提交 jQuery 选择器是否是 XSS 安全的?
我会运行一个可能由巨魔提交的选择器字符串,并将其放入$('')
页面上的选择元素中。
参考:https ://html.spec.whatwg.org/multipage/dom.html#the-id-attribute
当在 HTML 元素上指定时,id 属性值在元素树中的所有 ID 中必须是唯一的,并且必须包含至少一个字符。该值不得包含任何 ASCII 空格。
大多数时候,id 是字母和数字,带有连字符或下划线。此代码要求 id 的第一个字符是字母,后跟更多的字母、数字、下划线和破折号。
如果您愿意以这种方式限制可访问的元素 id,则可以使用以下验证方案来防止 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;
}
}
这将条目限制为简单的 id,并且暗示您会将#添加到选择器中。如果您愿意允许更复杂的选择器,您可以更新验证。