【问题标题】:Best way to forbid quotation marks on input禁止输入引号的最佳方法
【发布时间】:2023-12-08 10:40:01
【问题描述】:

假设我有一个<input> 标签。此标签的值用于更改。问题是如果用户输入单引号或双引号 - 它会破坏代码。 现在解决起来很简单:

  1. 覆盖这些键的按键;
  2. 禁止粘贴输入。

这里是示例代码:

HTML

<input id="TestInput"></input>

Javascript

$("#TestInput").keypress(function (e) { // override keypress of " or '
    if (e.which == 13 || e.which == 34 || e.which == 39) {
        return false;
    }
})

.bind("paste", function (e) {// forbid paste
    e.preventDefault();
})

.change(function(){
 var value = $(this).val();
    //and then I use this value for my operations
});

Sample Fiddle

问题:有没有更好的方法可以去掉所有引号而不禁止粘贴?

注意:我认为它可以用 RegExp 解决,但我对它们不好,所以如果你能提供一个 Regexp - 这可以工作。

提前感谢大家。

更新 1

在更改时,将对调用 DB 的方法执行 ajax 调用,并且引号会以某种方式中断查询,如下所示: 查询:

var query = "SELECT Column FROM table WHERE somecolumn LIKE '" + inputVal+ "'%";

如果inputVal 类似于"foo,则生成的刺将如下所示:

var query = "SELECT Column FROM table WHERE somecolumn LIKE '" + "foo+ "'%";

这显然会破坏查询。 + 数据库中没有包含引号的项目。

【问题讨论】:

  • 不要阻止用户输入任何内容——这对用户体验不利。只要确保您的代码可以处理引号。要么逃避它们,要么替换它们。
  • 更重要的问题是为什么引号会破坏你的代码?
  • 使用 SQLParams 而不是直接获取 unsanitised 用户输入
  • 它确实有一些影响,因为根据您用于服务器端方法的语言,您的语法将会改变。这是 MSDN article for SQL params in C#
  • 您仍然应该首先对用户输入进行过滤。使用 SQL 参数是朝着正确方向迈出的良好一步

标签: javascript jquery html quotes double-quotes


【解决方案1】:

只处理文本框中的数据:

$("#TestInput").on('input', function () {
    var value = $(this).val().replace(/'/g, '').replace(/"/g, '');
    // go on with processing data
});

【讨论】:

  • 谢谢@Rudy,这正是我所要求的。
  • 甜蜜,禁用 JS 和验证消失。不是一个好计划,嗯?
  • @webnoob 这也可以在服务器端完成,没什么大不了的。无论如何,如果禁用 js 破坏了整个事情,那么这里的答案可以处理的问题更多。
  • @Rudy - 然后应该向用户提及。看着 OP,他认为这是他问题的最终解决方案,但远非如此。这就是所有 cmets 都指向需要清理的数据而不是替换前端文本的原因。
  • @webnoob 你所说的不是 OP 所要求的。如果你愿意,我们可以讨论这个问题,但我认为聊天更好:)