电子邮件地址作为表名,如何使用准备/"安全"声明?

时间:2016-08-08 17:09:23

标签: sql node.js postgresql

(通常插入"我没有太多关于SQL经验的人和#34;这里。)

我有一个负责发送大量电子邮件的系统,并且我添加了保存每封电子邮件记录的功能,并由收件人隔离。

现在我正在对其进行设置,以便这些电子邮件日志会将表格中的电子邮件作为表格名称。但是现在,看起来Node.js的pg库不允许使用表名作为预准备语句的一部分。

我的问题有两个问题,a)如果能够根据电子邮件地址提供姓名,我应该关注注射吗?并且b)如果是这样,我如何解决安全问题呢?

我目前如何处理此问题的示例:

function _upsertTable(email, cb) {
  // Normalize email address.
  var tableName = 'email."' + email.toLowerCase() + '"';

  client.query([
    ("CREATE TABLE IF NOT EXISTS " + tableName),
      "(",
        "htmlMessage text,",
        "textMessage text,",
        "templateId character(24),",
        "files oid",
      ")"
  ].join(' '), cb);
}

// Insert email record into table
function _recordEmail(email, cb) {
  var tableName = 'email."' + email.toLowerCase() + '"';

  client.query([
    'INSERT INTO ' + tableName,
    'VALUES (',
      '$1,',
      '$2,',
      '$3,',
      'null',
    ')'
  ].join(' '), [html, text, templateId], cb);
}

编辑:

我想指出,回想起来这是一个可怕的想法,并敦促其他人如果考虑这样做,就不要采取这种做法。请阅读评论,看看为什么这是一个坏主意。

1 个答案:

答案 0 :(得分:1)

预准备语句参数替换通常仅适用于语句的数据部分,而不适用于引用SQL模式对象的位置。

你可以通过足够的逃避和引用自己构建,但我建议你不要。

恢复您描述的数据的更好方法是在一个表上,电子邮件地址为列。可能将电子邮件地址分成单独的表并通过整数ID指向它们以节省一些空间。