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

Dsh*_*hiz 3 javascript mysql sockets node.js

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

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

上述尝试将在没有特殊字符的情况下警告任何字符串,但在存在时不会发出警报.我相信在消息发送到套接字之后我实际上是发出警报.

因此,我尝试调整此代码,该代码监视输入键按下以查看撇号,也没有运气.

  $('#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;  
    }
    });
Run Code Online (Sandbox Code Playgroud)

我研究了如何使用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;
        });
    });
}
Run Code Online (Sandbox Code Playgroud)

谢谢!

rsp*_*rsp 6

不要这样做

您在问这个问题的错误解决方案.

要用反斜杠撇号替换撇号,您可以使用:

str = msg.replace(/'/g, '\\\'');
Run Code Online (Sandbox Code Playgroud)

但你不应该这样做.我只提供该信息,因为这是您的问题所要求的,但请阅读以下内容.

为什么这是一个坏主意

您不应该在客户端执行此操作,也不应该在服务器端执行此操作.如果避免SQL注入漏洞是一个简单的问题,用反斜杠撇号替换撇号,那么这不会是一个问题.不幸的是,它更复杂.

拥有你提供的信息,甚至无法判断反斜杠撇号是否会在没有看到实际产生数据库查询的代码的情况下首先执行您期望的操作.但这并不重要,因为你永远不应该这样做.决不.查看这些答案以了解原因 - 这些问题与SQL注入无关,但代码示例包含SQL注入漏洞,答案解释如下:

强制性漫画

在此输入图像描述

你应该做什么

话虽如此,你没有告诉你用什么模块来查询数据库,但无论你是使用mysql模块还是Sequelize还是任何有价值的东西,都应该有一个在安全中插入变量的机制没有手动转义和连接字符串的方式.

例子

您甚至没有显示与此相关的单行代码,因此我无法告诉您如何修复它,但请考虑以下示例:

不安全:

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

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

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

安全简单:

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

更多信息

有关更多信息,请参阅文档:

  • 谢谢你——这很有帮助! (2认同)