0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

DynamoDBのPartiQLでSQLインジェクションを防ぐ

Last updated at Posted at 2023-02-22

はじめに

DynamoDBのPartiQL、みなさん使ってますか?とても便利ですよね!
便利ではありますが、SQLを使う以上は「SQLインジェクション」に気をつけなければいけません。

例えば普通のRDBに対してプログラミング言語からSQLを発行する際、
こんな風に書くとSQLインジェクションの危険性があるので、

danger.js
await client.query(`INSERT INTO users(name, email) VALUES(${name}, ${email})`);

以下のようにParameterized Query(パラメータ化されたクエリ)を使いましょう
というのはセキュリティの定番ネタです。

safety.js
await client.query('INSERT INTO users(name, email) VALUES($1, $2)', [name, email]);

参考: node-postgres(pg)の場合

DynamoDBのPartiQLでもParameterized Queryを使うべきなのですが、
RDBに比べて情報が少なめなので、簡単ですが日本語記事として書いておきます。

やり方

悪い例。
ついこう書いてしまいそうですが、SQLインジェクションされる危険性があります!

danger.js
await ddbClient.executeStatement({
  Statement: `
  INSERT INTO "example"
    value {
      'pk': 'user:01231',
      'sk': 'profile',
      'sk1': ${Date.now()},
      'name': 'Marco'
    }
`,
})

良い例。
Statementのクエリ内に?を書いておいて、
Parametersというプロパティで変数を渡せばOK!

danger.js
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ライフを!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?