【问题标题】:How do I blacklist characters on a utf-8 string?如何将 utf-8 字符串中的字符列入黑名单?
【发布时间】:2011-07-01 01:37:29
【问题描述】:

我有一个 HTML 文本输入,用户可以在其中为自己写一个名字。该名称只是一个用户友好的显示名称,它不用于识别数据库中的用户或后端的任何内容。

我想允许 utf-8 字符,这样人们就可以输入他们母语的字符,无论是中文还是瑞典语等等。

但是,我想将某些字符(如 、[、]、?、* 等)列入黑名单,以阻止任何潜在的脚本小子试图利用输入进行 SQL 注入或其他操作。

我认为这将是一个简单的代码,在网络上会有很多示例,但如果有的话,答案就隐藏在如何使用白名单验证电子邮件地址的示例中(仅限英文字母数字字符) ,没有亚洲或其他语言特定字符),或者,奇怪的是,如何完全停止某些字符的按键。

我不想完全停止按键操作,因为我认为这可能会让我的用户感到困惑。相反,我会输出一个错误,说如果他们输入了一个列入黑名单的字符,他们就不能使用字符 X。

那么,对于像我这样完全不擅长正则表达式的人来说,有没有一种直接的方法可以将 Javascript 中的字符列入黑名单?

如果它不妨碍用户输入他们使用的任何语言的时髦字符,我也会选择白名单解决方案。

【问题讨论】:

  • 如果只是“阻止任何潜在的脚本小子试图利用输入”,那么为什么还要将任何东西列入黑名单呢?如果您已经知道如何清理您的输入,那么为什么不让某人输入任何旧的东西作为他们的显示名称呢?
  • 您会发现使用正则表达式验证将其仅列入白名单而不是黑名单会更快。

标签: javascript html regex whitelist blacklist


【解决方案1】:

首先,您需要清理客户端和服务器端的输入数据。任何聪明到可以制造攻击的人都会足够聪明地禁用javascript足够长的时间以将他们想要的数据放入您的表单中。

现在就防止进入的 javascript 正则表达式而言 - 有很多关于 SO 的问题都在讨论这个问题。

//一些技术性的东西

javascript regexp remove all special characters

Does this set of regular expressions FULLY protect against cross site scripting?

//简单的js例子来阻止不需要的字符的输入。

http://www.sitepoint.com/forums/showthread.php?t=142118

从我读到的共识似乎是您需要列入白名单而不是列入黑名单。也许来自 SO 的有更多经验的人可以为您指出处理用例的最佳方式。

【讨论】:

    【解决方案2】:

    这实际上取决于您通常如何进行验证(我喜欢 jQuery validate 作为一个框架),但基本检查可能类似于:

    // set up a handler function
    function checkBlacklist() {
        // check against a regex of bad chars
        // many ([]*? etc) may need to be escaped to work in regex
        if (/[\[\]<>\*\?]/.test(this.value)) {
            // take evasive action of some kind
        }
    }
    // assign it to your input
    document.getElementById('mynameinput').onchange = checkBlacklist;
    

    但是,正如 Mike Daniels 所说,如果您主要关心的是脚本小子,不要这样做。任何想弄乱您的输入表单的人都可以轻松绕过 Javascript 验证。将 Javascript 验证视为一个不错的 UI 功能 - 它为您的用户提供有用的反馈,而无需让他们重新加载页面。但这不是任何形式的安全性 - 无论您使用什么 Javascript 进行验证,您都必须检查和清理服务器端的输入。

    【讨论】:

    • 感谢您的代码!是的,我知道 Javascript 验证对用户来说只是一个好处。我在 PHP 端做了更多的验证,这更严格。我将尝试此代码并报告成功。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-14
    • 2023-03-18
    • 1970-01-01
    • 2011-04-11
    • 2010-09-21
    • 2015-11-14
    • 2020-10-04
    相关资源
    最近更新 更多