标签: node-mysql

阻止Node.js中的SQL注入

是否有可能阻止Node.js中的SQL注入(最好使用模块),就像PHP具有保护它们的Prepared Statements一样.

如果是这样,怎么样?如果没有,有哪些例子可能会绕过我提供的代码(见下文).


一些背景:

我正在使用node-mysql模块制作一个带有Node.js + MySql的后端堆栈的Web应用程序.从可用性的角度来看,该模块很棒,但它还没有实现类似于PHP的Prepared Statements(虽然我知道它是在todo上).

根据我的理解,PHP的预处理语句的实现,尤其有助于防止SQL注入.但我担心,我的node.js应用程序可能会受到类似的攻击,即使默认情况下提供了字符串转义(如下面的代码片段).

node-mysql似乎是node.js最受欢迎的mysql连接器,所以我想知道其他人可能正在做什么(如果有的话)来解决这个问题 - 或者甚至是node.js开头的问题(不确定这是怎么回事,因为涉及用户/客户端输入).

我应该暂时切换到node-mysql-native,因为它确实提供了准备语句吗?我对此犹豫不决,因为它似乎不像node-mysql那样活跃(尽管这可能只是意味着它已经完成).

这是一个用户注册代码片段,它使用sanitizer模块,以及node-mysql准备的类似语句的语法(如上所述,它可以进行字符转义),分别防止跨站点脚本和sql注入:

// Prevent xss
var clean_user = sanitizer.sanitize(username);

// assume password is hashed already
var post = {Username: clean_user, Password: hash};

// This just uses connection.escape() underneath
var query = connection.query('INSERT INTO users SET ?', post,
   function(err, results)
   {
       // Can a Sql injection happen here?
   });
Run Code Online (Sandbox Code Playgroud)

javascript mysql sql-injection node.js node-mysql

80
推荐指数
4
解决办法
12万
查看次数

Node.js MySQL需要持久连接

我的Node Web应用程序需要持久的MySQL连接.问题是这种情况每天发生几次:

Error: Connection lost: The server closed the connection.
at Protocol.end (/var/www/n/node_modules/mysql/lib/protocol/Protocol.js:73:13)
at Socket.onend (stream.js:79:10)
at Socket.EventEmitter.emit (events.js:117:20)
at _stream_readable.js:895:16
at process._tickCallback (node.js:415:13)
error: Forever detected script exited with code: 8
error: Forever restarting script for 2 time
info: socket.io started
Run Code Online (Sandbox Code Playgroud)

这是我的连接代码:

// Yes I know multipleStatements can be dangerous in the wrong hands.
var sql = mysql.createConnection({
    host: 'localhost',
    user: 'my_username',
    password: 'my_password',
    database: 'my_database',
    multipleStatements: true
});

sql.connect();

function handleDisconnect(connection) {
    connection.on('error', function(err) {
        if (!err.fatal) { …
Run Code Online (Sandbox Code Playgroud)

mysql node.js node-mysql

36
推荐指数
3
解决办法
3万
查看次数

如何正确地将mysql连接传递给express.js的路由

我试图找出在我的express.js路由之间传递mysql连接(使用node-mysql)的最佳方法.我正在动态添加每个路由(在路由中使用for each文件循环),这意味着我不能只将连接传递给需要它的路由.我要么将它传递给每条路线,要么根本不传递.我不喜欢将它传递给那些不需要它的想法所以我创建了一个dbConnection.js,路由可以根据需要单独导入.问题是我不认为我正确地做到了.截至目前,我的dbConnection.js包含:

var mysql = require('mysql');
var db = null;
module.exports = function () {
    if(!db) {
            db = mysql.createConnection({
                socketPath: '/tmp/mysql.sock',
            user: '*********',
            password: '*********',
            database: '**********'
        });
    }
    return db;
};
Run Code Online (Sandbox Code Playgroud)

我使用以下方法将其导入每条路线:

var db = require('../dbConnection.js');
var connection = new db();
Run Code Online (Sandbox Code Playgroud)

但我想这样做:

var connection = require('../dbConnection.js');
Run Code Online (Sandbox Code Playgroud)

然而,当我这样尝试时,我得到一个错误,当我尝试进行查询时,连接没有方法'查询'.

node.js express node-mysql

25
推荐指数
1
解决办法
2万
查看次数

节点MySQL转义LIKE语句

如何在node-mysql中转义MySQL LIKE语句?

有点像

"SELECT * FROM card WHERE name LIKE '%" + connection.escape(req.body.search) + "%'"
Run Code Online (Sandbox Code Playgroud)

结果是

'SELECT * FROM card WHERE name LIKE \'%\'hello\'%\''
Run Code Online (Sandbox Code Playgroud)

这是语法错误.如果我使用替代语法

connection.query("SELECT * FROM card WHERE name LIKE '%?%'", req.body.search, function () {});
Run Code Online (Sandbox Code Playgroud)

导致类似的语法错误.我也试过了

connection.query("SELECT * FROM card WHERE name LIKE ?", '%' + req.body.search + '%', function () {});
Run Code Online (Sandbox Code Playgroud)

这最终会逃脱'%'的标志.

javascript mysql node.js node-mysql

25
推荐指数
3
解决办法
2万
查看次数

如何使用ExpressJS以XML格式进行响应?

我有一个简单的代码,为特定路由提供JSON响应.这是我目前的代码:

var express = require('express')
  , async = require('async')
  , http = require('http')
  , mysql = require('mysql');

var app = express();

var connection = mysql.createConnection({
    host: 'localhost',
    user: '****',
    password: "****",
    database: 'restaurants'
});

connection.connect();

// all environments
app.set('port', process.env.PORT || 1235);
app.use(express.static(__dirname + '/public/images'));


app.get('/DescriptionSortedRating/',function(request,response){
    var name_of_restaurants;

    async.series( [
        // Get the first table contents
        function ( callback ) {
            connection.query('SELECT * FROM restaurants ORDER BY restaurantRATING', function(err, rows, fields)
                {
                        console.log('Connection result error '+err);
                        name_of_restaurants = rows;
                        callback(); …
Run Code Online (Sandbox Code Playgroud)

node.js express node-mysql

25
推荐指数
2
解决办法
5万
查看次数

使用promise在node.js中处理MySQL返回值

我有一个python背景,目前正在迁移到node.js. 由于其异步性质,我有问题调整到node.js.

例如,我试图从MySQL函数返回一个值.

function getLastRecord(name)
{
    var connection = getMySQL_connection();

    var query_str =
    "SELECT name, " +
    "FROM records " +   
    "WHERE (name = ?) " +
    "LIMIT 1 ";

    var query_var = [name];

    var query = connection.query(query_str, query_var, function (err, rows, fields) {
        //if (err) throw err;
        if (err) {
            //throw err;
            console.log(err);
            logger.info(err);
        }
        else {
            //console.log(rows);
            return rows;
        }
    }); //var query = connection.query(query_str, function (err, rows, fields) {
}

var rows = getLastRecord('name_record');

console.log(rows);
Run Code Online (Sandbox Code Playgroud)

经过一些阅读,我意识到上面的代码无法工作,我需要返回一个由于node.js异步性质的承诺.我不能像python一样编写node.js代码.如何转换getLastRecord() …

mysql asynchronous node.js promise node-mysql

25
推荐指数
4
解决办法
4万
查看次数

带有getter和setter的JavaScript类导致RangeError:超出了最大调用堆栈大小

我目前正在试验ECMA6课程.我目前的课程如下所示

class Player {
  constructor(id) {
    this.id = id;
    this.cash = 350;
  }

  get cash() {
    return this.cash;
  }

  set cash(value) { // line 19
    this.cash = value; // line 20
  }
};
Run Code Online (Sandbox Code Playgroud)

当我现在通过调用创建一个新的对象时,let playerObject = new Player(1);我收到以下错误

...\node_modules\mysql\lib\protocol\Parser.js:82
        throw err;
              ^
RangeError: Maximum call stack size exceeded
    at Player.cash (player.js:19:11)
    at Player.cash (player.js:20:15)
    at Player.cash (player.js:20:15)
    at Player.cash (player.js:20:15)
    at Player.cash (player.js:20:15)
    at Player.cash (player.js:20:15)
    at Player.cash (player.js:20:15)
    at Player.cash (player.js:20:15)
    at Player.cash (player.js:20:15)
    at Player.cash (player.js:20:15) …
Run Code Online (Sandbox Code Playgroud)

javascript node.js node-mysql

23
推荐指数
3
解决办法
1万
查看次数

INSERT INTO因node-mysql而失败

我试图用node.js插入一些数据.我已经编写了以下代码并通过npm安装了MySQL支持,但我未能成功INSERT INTO.

这是我的代码:

var mysql = require('mysql');

function BD() {
    var connection = mysql.createConnection({
        user: 'root',
        password: '',
        host: 'localhost',
        port: 3306,
        database: 'nodejs'
    });
    return connection;
}

app.post("/user/create", function(req, res) {
    var objBD = BD();

    var post = {
        username: req.body.username,
        password: req.body.password
    };

    objBD.query('INSERT INTO users VALUES ?', post, function(error) {
        if (error) {
            console.log(error.message);
        } else {
            console.log('success');    
        }
    });
});
Run Code Online (Sandbox Code Playgroud)

HTML代码:

<form action="/user/create" method="POST" class="form-horizontal">
     <input type="text" id="username_input" name="username">
     <input type="text" id="password_input" name="password">
     <input …
Run Code Online (Sandbox Code Playgroud)

mysql node.js sql-insert node-mysql

19
推荐指数
2
解决办法
7万
查看次数

错误:Node.js MYSQL模块中的握手不活动超时

我正在使用node-mysql和大多数查询.工作.一些查询不起作用.我尝试了每个版本的Node(从0.5 ......)到(5.6.0),我也尝试过(4.0)和(4.1),没有任何帮助.

我试图改变,并没有奏效.我试图将sequence文件更改为:this._idleTimeout = -1;并没有帮助.

我读了这些问题和GitHub,没有任何帮助.

我可以尝试自己修复它,但我需要更多信息.超时在哪里,为什么?什么时候?什么是这种消息?超时来自哪里?

MYSQL_ERROR     { [Error: Handshake inactivity timeout]  
code: 'PROTOCOL_SEQUENCE_TIMEOUT',   fatal: true,   
timeout: 10000 }  
Run Code Online (Sandbox Code Playgroud)

mysql node.js node-mysql

18
推荐指数
3
解决办法
2万
查看次数

重现MySQL错误:服务器关闭连接(node.js)

我正在尝试使用节点mysql库重现我在EC2上的node.js应用程序中看到的MySQL错误:

连接丢失:服务器关闭了连接.

我无法在本地重现错误 - 我的代码处理数据库的处理很好 - 它只需每隔几秒重新检查一次,并在重新启动后重新连接到数据库.在EC2上,它发生在太平洋时间凌晨4点左右,但数据库仍然运行正常.

我想

  1. 用我的本地mysql重现崩溃
  2. 在我的mysql帮助器模块中添加我需要的任何逻辑来处理这个问题

这是我的node.js应用程序中的错误:

2012-10-22T08:45:40.518Z - 错误:uncaughtException date = Mon Oct 22 2012 08:45:40 GMT + 0000(UTC),pid = 14184,uid = 0,gid = 0,cwd =/home/ec2 -user/my-app,execPath =/usr/bin/nodejs,version = v0.6.18,argv = [/ usr/local/bin/node,/ home/ec2-user/my-app/app.js, - -my-app],rss = 15310848,heapTotal = 6311392,heapUsed = 5123292,loadavg = [0.0029296875,0.0146484375,0.04541015625],正常运行时间= 3238343.511107486,trace = [column = 13,file =/home/ec2-user/my- app/node_modules/mysql/lib/protocol/Protocol.js,function = Protocol.end,line = 63,method = end,native = false,column = 10,file = stream.js,function = Socket.onend,line = 80,method = onend,native = false,column = 20,file …

mysql node.js node-mysql

16
推荐指数
3
解决办法
2万
查看次数