注文時にSQLインジェクションを回避しようとしていますが、NULLが最後であることも確認する必要があります。
query = books.order(@vals['order'] + ' NULLS LAST')
しかし、@vals['order'] を API パラメーターとして使用すると、SQL インジェクションの影響を受けやすくなります。これを回避するために注文を形成するより良い方法はありますか?
注文時にSQLインジェクションを回避しようとしていますが、NULLが最後であることも確認する必要があります。
query = books.order(@vals['order'] + ' NULLS LAST')
しかし、@vals['order'] を API パラメーターとして使用すると、SQL インジェクションの影響を受けやすくなります。これを回避するために注文を形成するより良い方法はありますか?
これが実際に単なる API である場合は、API コンシューマに特定の種類の順序付けのみを提供し、順序基準をコードで前もって把握します (ホワイトリスト アプローチなど)。
if @evals['order'] == 'title'
ordering = 'title'
elsif @evals['order'] == 'published'
ordering = 'created_at'
else
ordering = 'id'
end
query = books.order(ordering + ' NULLS LAST')
これは最も美しいコードではありませんが、少なくともパラメーターを解析する必要がなくても安全です。