客户端提交了 jQuery 个选择器,安全吗?

Client submitted jQuery selectors, is it safe?

允许客户端提交 jQuery select 或 XSS 安全吗?

我会 运行 可能由喷子提交的 select 或字符串,并将其放入页面上的 $('') 到 select 元素中。

参考:https://html.spec.whatwg.org/multipage/dom.html#the-id-attribute

When specified on HTML elements, the id attribute value must be unique amongst all the IDs in the element's tree and must contain at least one character. The value must not contain any ASCII whitespace.

大多数情况下,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','&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;
        }
}

这将条目限制为简单的 ID,这意味着您可以将 # 添加到选择器中。如果你愿意允许更复杂的选择器,你可以更新验证。