1

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

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

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

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

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

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

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

4

2 回答 2

1

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

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

//一些技术性的东西

javascript regexp 删除所有特殊字符

这组正则表达式是否完全防止跨站点脚本?

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

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

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

于 2011-02-21T05:49:02.113 回答
0

这实际上取决于您通常如何进行验证(我喜欢将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 进行验证,您都必须检查和清理服务器端的输入。

于 2011-02-21T06:08:50.603 回答