-1

允许客户端提交 jQuery 选择器是否是 XSS 安全的?

我会运行一个可能由巨魔提交的选择器字符串,并将其放入$('')页面上的选择元素中。

4

1 回答 1

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','&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,并且暗示您会将#添加到选择器中。如果您愿意允许更复杂的选择器,您可以更新验证。

于 2018-05-04T01:37:22.520 回答