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

我正在使用sockets.io插入用户生成的消息到MySQL,但我遇到插入logging撇号的问题。 我一直试图在客户端脚本上使用replace()方法,但是input文本正在传递撇号。

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

上面的尝试将提醒没有特殊字符的任何string,但是当它存在时不会提醒。 我相信在邮件发送到套接字 ,我实际上正在发出警报。

所以,我试着修改这个代码,注意input按键,也注意撇号,也没有运气。

  $('#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; } }); 

我研究了如何使用javascriptreplaceMySQL的特殊字符,但发现过时的栈解释了为什么客户端validation这不是一个好主意。

没关系。 如果我不应该做这个客户端,那么我需要知道如何在我的server.js节点脚本中执行它。 它仍然是JavaScript,所以任何一方的解决scheme,只要它是安全的将是伟大的。

服务器端代码:

 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; }); }); } 

谢谢!

不要这样做

你在问这个问题的错误解决scheme。

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

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

但是你不应该这样做 。 我只是提供这个信息,因为这是你的问题,但阅读下面。

为什么这是一个糟糕的主意

你不应该在客户端做,而且你也不应该在服务器端做。 如果避免SQL注入漏洞是用反斜杠撇号replace撇号的简单问题,那么它不会是一个问题。 不幸的是它更复杂。

有了你提供的信息,甚至不可能知道反斜杠撇号甚至可以做你所期望的,而不会看到你的代码实际上做了数据库查询。 但这并不重要,因为你永远不应该这样做。 决不。 看到这些答案,看看为什么 – 这些问题不是关于SQL注入,但代码示例包括SQL注入漏洞,答案解释:

  • 使用nodejs 7.3.0时不能使用反引号
  • 节点js – 处理大量数据时的Promise拒绝警告
  • 是否有可能在Node.js中侦听对象实例?

强制漫画

在这里输入图像说明

你应该做什么呢

之前已经说过,你没有告诉你用什么模块来查询数据库,但是不pipe你使用的是mysql模块还是Sequelize或者任何值得用它的东西,都应该有一个插入variables的机制安全的方式,而无需手动转义和连接string。

例子

你甚至没有显示一行代码,这是相关的,所以我不能告诉你如何解决它,但考虑这个例子:

不安全:

 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) { // ... } ); 

更多信息

欲了解更多信息,请参阅文档: