客户端提交了jQuery选择器,是否安全?

时间:2018-05-04 00:53:57

标签: javascript jquery security xss jquery-1.8

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

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

1 个答案:

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