gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 07:55:51 25 4
gpt4 key购买 nike

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

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

上面的尝试将警告任何没有特殊字符的字符串,但当它存在时不警告。我相信我实际上是在消息发送到套接字后 发出警报。

因此,我尝试修改这段代码,它监视回车键的按下以同时监视撇号,但也没有成功。

  $('#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 Node 脚本中做。它仍然是 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;
});
});
}

谢谢!

最佳答案

不要这样做

你问的是问题的错误解决方案。

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

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

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

为什么这是个坏主意

您不应该在客户端这样做,也不应该在服务器端这样做。如果避免 SQL 注入(inject)漏洞是用反斜杠-撇号替换撇号的简单问题,那么它就不是问题。不幸的是,它更复杂。

有了您提供的信息,如果没有看到实际进行数据库查询的代码,甚至无法判断反斜杠-撇号是否会做您期望的事情。但这没关系,因为你永远不应该那样做。绝不。查看这些答案以了解原因 - 这些问题与 SQL 注入(inject)无关,但代码示例包含 SQL 注入(inject)漏洞,答案对此进行了解释:

必修漫画

enter image description here

你应该怎么做

话虽如此,您并没有告诉您正在使用哪个模块来查询数据库,但无论您使用的是 mysql 模块还是 Sequelize 或任何有值(value)的东西,都有应该始终是一种以安全方式插入变量的机制,无需手动转义和连接字符串。

例子

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

不安全:

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

更多信息

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

关于javascript - 如何使用 sockets.io/node.js/javascript 转义 mysql 特殊字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43312239/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com