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

(在这里插入通常的“我没有太多的SQL经验”)。

我有一个负责发送大量电子邮件的系统,而且我添加了保存每个电子邮件logging的function,由收件人隔离。

现在我正在设置它,以便这些电子邮件日志将插入一张表,其电子邮件是表名。 然而现在,它看起来像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); } 

编辑:

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

准备好的语句参数replace通常只适用于语句的数据部分,而不适用于SQL模式对象被引用的地方。

你可以自己build立一个足够数量的逃避和引用,但我build议你不要。

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