大きな質問です!
2番目の例では、このようなことを単純に行うことができます。
def html_append(attribute)
current_object[attribute]
end
注文方法の使用はもう少し複雑です。このようなことをするのは良い考えのように思えるかもしれないので注意してください。
def unsafe_method(attribute)
[...].order("#{attribute} ASC") [...]
end
上記の例は、SQLインジェクションに対して脆弱です。理想的な世界では、このようなことをすることができます。
Model.all.order("? ASC", attribute)
残念ながら、これはRails APIの一部ではありません。事実は、order
に入るものがデータベースに対して安全に実行できることを確認する必要があります。既にgreat answer about thisがあります。
単純なオプションの1つは、引数を検証できる安全な属性の配列を持つことです。しかし、if
ステートメントが削除された場合、このメソッドはSQLインジェクションに再度オープンされるため、この使用には注意が必要です。
def safe_method(attribute)
safe_order_options = ["name", "email", "phone"]
if attribute.in? safe_order_options
[...].order("#{attribute} ASC") [...]
end
end
これはさらに優れたオプションです。
def safer_method(attribute)
safe_order_options = ["name", "email", "phone"]
order_index = safe_order_options.index(attribute)
[...].order("#{safe_order_options[order_index]} ASC") [...]
end
希望するものがあります。何かタイプミスがあれば申し訳ありません。私はこのコードをテストしていませんが、原則的に動作するはずです。
これは、SQLインジェクションのための解決策です。他の答えを確認してください。 –
これは良い解決策ですが、属性を取得する場所を注意する必要があります。 –
奇妙なことに、ソートのそのフォームに対する攻撃の例がありますか? –