はじめに
DynamoDBのPartiQL、みなさん使ってますか?とても便利ですよね!
便利ではありますが、SQLを使う以上は「SQLインジェクション」に気をつけなければいけません。
例えば普通のRDBに対してプログラミング言語からSQLを発行する際、
こんな風に書くとSQLインジェクションの危険性があるので、
await client.query(`INSERT INTO users(name, email) VALUES(${name}, ${email})`);
以下のようにParameterized Query(パラメータ化されたクエリ)を使いましょう
というのはセキュリティの定番ネタです。
await client.query('INSERT INTO users(name, email) VALUES($1, $2)', [name, email]);
参考: node-postgres(pg)の場合
DynamoDBのPartiQLでもParameterized Queryを使うべきなのですが、
RDBに比べて情報が少なめなので、簡単ですが日本語記事として書いておきます。
やり方
悪い例。
ついこう書いてしまいそうですが、SQLインジェクションされる危険性があります!
await ddbClient.executeStatement({
Statement: `
INSERT INTO "example"
value {
'pk': 'user:01231',
'sk': 'profile',
'sk1': ${Date.now()},
'name': 'Marco'
}
`,
})
良い例。
Statement
のクエリ内に?
を書いておいて、
Parameters
というプロパティで変数を渡せばOK!
await ddbClient.executeStatement({
Statement: `
INSERT INTO "example"
value {
'pk': ?,
'sk': ?,
'sk1': ?,
'name': ?
}
`,
Parameters: [{ S: 'user:1234' }, { S: 'profile' }, { N: Date.now().toString() }, { S: 'Marco' }],
})
DynamoDB特有のAttributeValueというフォーマットで、
文字列ならS
、数値ならN
みたいに型情報を含める必要があります。
参考サイト
この英語サイトのコードを一部そのまま使わせてもらいました。感謝!
他にもいろんな例が載ってるので、ぜひ読んでみてください。
自分でQiita記事を書いたあとに改めて探したら、公式ドキュメントにもちゃんと載っていましたw
ではみなさま、安全で素敵なDynamoDBライフを!