In Rails, if you assume params[:key] is always a string, you might be making your app insecure
Today I came across an interesting issue in a Rails app. A simple params[:key]
was throwing an error.
It turns out that while params[:something]
is often assumed to be either a string or nil, but that isn’t always the case. It can also become arrays or hashes.
?page[]
or ?page[string]
will automatically turn parameters to either arrays or hashes.Whenever using params[:key]
, it would be wise to think “what if an array/hash is passed here?“. In this hypothetical example, the intention might be to delete one record, but it might unintentionally allow multiple deletions.
#destroy_all
for collections rather than #destroy
.Rails 5’s new Strong Parameters feature prevents from issues like this. Using #permit
will prevent arrays and hashes from coming through.
Using params.permit
will reject hashes and arrays.
In contrast, using params.require
will only let hashes and arrays through. Using both permit
and require
can be used to define the shape of the expected input.
I am a web developer helping make the world a better place through JavaScript, Ruby, and UI design. I write articles like these often. If you'd like to stay in touch, subscribe to my list.