(通常插入"我没有太多关于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);
}
我想指出,回想起来这是一个可怕的想法,并敦促其他人如果考虑这样做,就不要采取这种做法。请阅读评论,看看为什么这是一个坏主意。
答案 0 :(得分:1)
预准备语句参数替换通常仅适用于语句的数据部分,而不适用于引用SQL模式对象的位置。
你可以通过足够的逃避和引用自己构建,但我建议你不要。
恢复您描述的数据的更好方法是在一个表上,电子邮件地址为列。可能将电子邮件地址分成单独的表并通过整数ID指向它们以节省一些空间。