Ошибка использования mysql в AWS лямбда-функции - PullRequest
0 голосов
/ 01 мая 2020

Я создал AWS лямбда-функцию для извлечения информации из базы данных AWS RDS. Я также создал API в AWS API Gateway, который запускает функцию Lambda. API работает нормально, когда мой оператор SQL "select * from user". Однако, когда я пытаюсь что-то вроде «выбрать * от пользователя с тегом = люди», я получаю эту ошибку:

{"errorType":"Error","errorMessage":"You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'tag = 'people'' at line 1","trace":["Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'tag = 'people'' at line 1","    at PromisePool.query (/var/task/node_modules/mysql2/promise.js:330:22)","    at Runtime.module.exports.handler (/var/task/index.js:19:38)","    at Runtime.handleOnce (/var/runtime/Runtime.js:66:25)"]}

Моя AWS Лямбда-функция, определенная как (Node.js 12.x):

const mysql = require('mysql2');

const pool = mysql.createPool({
    host: process.env.LAMBDA_HOSTNAME,
    user: process.env.LAMBDA_USERNAME,
    password: process.env.LAMBDA_PASSWORD,
    database: process.env.LAMBDA_DATABASE,
    waitForConnections: true,
    connectionLimit: 10,
    queueLimit: 0
});

module.exports.handler = async (event, context, callback) => {
    context.callbackWaitsForEmptyLoop = false;
    const tag = event["params"]["querystring"]["tag"]
    const sql = "select * from user with tag = " + tag;

    const promisePool = pool.promise();
    const [rows] = await promisePool.query(sql);
    const lambdaProxyResponse = {
        statusCode: 200,
        body: JSON.stringify([rows])
    };
    return lambdaProxyResponse;
};

Может кто-нибудь помочь мне с этой проблемой? Также, когда я запускаю команду в mysql верстаке, она выполняется правильно.

1 Ответ

0 голосов
/ 01 мая 2020

Я не уверен, как выглядит ваша среда в целом, но, во-первых, не очень хорошая идея составить вашу собственную SQL таким образом. Этот код может потенциально подвергаться атаке SQL.

Но, если вы доверяете вводу, это довольно простое решение. Вам нужны кавычки:

const sql = "select * from user with tag = '" + tag + "'";

Обратите внимание, что это верно, когда столбец является строковым типом. Для числового типа c вам не нужны кавычки.

Если вы не доверяете входным данным, вам нужно посмотреть на использование подготовленных операторов какого-либо рода.

...