如何使用sockets.io/node.js/javascript转义mysql特殊字符

4

我正在使用 sockets.io 将用户生成的消息插入到 MySQL 中,但是我在插入带有撇号的记录时遇到了问题。我一直在尝试在客户端脚本上使用 replace() 方法,但输入文本仍然带有撇号。

  socket.on('refresh feed',function(msg){
        str=msg.replace("'", "\'");
        alert(str);
    $("#chtxt").append(str + '<br />');
  });

以上尝试将警报任何不带特殊字符的字符串,但在存在特殊字符时不会发出警报。 我相信我实际上是在消息已经发送到套接字之后才进行警报。

因此,我尝试使此代码适应监视按Enter键的方式来监视撇号,但也没有成功。

  $('#omnibox').keypress(function (e) {
    var key = e.which;
    if(key == 13)  // the enter key code
    {
      $('input[name = "clicky"]').click();
      return false;  
    }
    if(key == 222)  // the apostrophe key code
    {
            alert('Apostrophe!')
      return false;  
    }
    });

我研究了如何使用javascript为MySQL替换特殊字符的问题,但发现旧的堆栈解释了为什么客户端验证不是一个好主意。

没关系。如果我不应该在客户端进行此操作,那么我需要知道如何在我的server.js节点脚本中进行操作。它仍然是javascript,因此提供在任一方面(客户端或服务器端)的解决方案,只要它是安全的,都将非常好。

服务器端代码:

var add_status = function (status,callback) {
    pool.getConnection(function(err,connection){
        if (err) {
          callback(false);
          return;
        }
    connection.query("INSERT INTO `videosub` (`url`) VALUES ('"+status+"')",function(err,rows){
            connection.release();
            if(!err) {
              callback(true);
            }
        });
     connection.on('error', function(err) {
              callback(false);
              return;
        });
    });
}

谢谢!

1个回答

9

不要这样做

你正在询问问题的错误解决方案。

为了用反斜杠-撇号替换撇号,你可以使用以下方法:

str = msg.replace(/'/g, '\\\'');

但你不应该这样做。我提供这些信息只是因为你的问题问到了这个,但请看下面的内容。

为什么这是个坏主意

你既不应该在客户端这样做,也不应该在服务器端这样做。如果避免 SQL 注入漏洞只是简单地用反斜杠 - 单引号替换单引号,那就不是问题了。不幸的是,它更加复杂。

有了你提供的信息,甚至无法确定反斜杠 - 单引号是否会按照你的预期进行操作,而不看实际执行数据库查询的代码。但这并不重要,因为你永远都不应该这样做。绝对不行。请查看这些答案以了解原因 - 这些问题不涉及 SQL 注入,但是代码示例包括 SQL 注入漏洞,答案进行了解释:

义不容辞的漫画

enter image description here

你应该做什么

话虽如此,你没有告诉我你正在使用哪个模块来查询数据库,但是无论你使用的是 mysql 模块还是 Sequelize 或任何值得一试的东西,都应该有一种安全地插入变量的机制,而不是手动转义和连接字符串。

示例

你没有展示出与此相关的任何一行代码,所以我无法告诉你如何修复它,但请考虑以下示例:

不安全的:

connection.query(
  "SELECT * FROM player WHERE nick = '"
  + data.login + "' AND pass = '" + data.pass + "'",
  function (err, rows) {
    //...
  }
);

依然不安全、复杂、难以理解、难以维护和不可靠:

connection.query(
  "SELECT * FROM player WHERE nick = '"
  + data.login.replace(/'/g, '\\\'') + "' AND pass = '" + data.pass.replace(/'/g, '\\\'') + "'",
  function (err, rows) {
    //...
  }
);

安全简单:

connection.query(
  "SELECT * FROM player WHERE nick = ? AND pass = ?", [data.login, data.pass],
  function (err, rows) {
    // ...
  }
);

更多信息

欲了解更多信息,请参见以下文档:


1
谢谢您的回复 - 我正在查看您提供的参考资料。我还在我的帖子中添加了服务器端代码。 - Dshiz
2
谢谢 - 这非常有帮助! - Dshiz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接