允许客户端提交jQuery选择器是否安全?
我会运行一个可能由巨魔提交的选择器字符串,并将其放入$('')
以选择页面上的元素。
答案 0 :(得分:0)
参考: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的输入,暗示您将#添加到选择器中。如果您愿意允许更复杂的选择器,则可以更新验证。