Ruby on Rails | Screencasts | Download | Documentation | Weblog | Community | Source

Ticket #3352 (closed enhancement: fixed)

Opened 3 years ago

Last modified 1 year ago

[PATCH] Hardened scaffold generation that protects models from GWA and similar link-following agents

Reported by: nils@alumni.rice.edu Assigned to: David
Priority: normal Milestone: 1.x
Component: Railties Version: 1.0.0
Severity: normal Keywords: GWA scaffold HTTP GET POST controller action link_to button_to
Cc:

Description

This patch hardens scaffold-generated code against client-side caching issues introduced by Google Web Accelerator and the like. Although Rails scaffolding is not intended to be used in production, there is little doubt that a substantial number of Rails developers use scaffolding as production code, either wholesale or with stylesheet changes only. Even if we assume that scaffolding never ends up in production, it does have great value as a design guide for authors of Rails controllers and views. Wherever possible, Rails examples--including scaffolds--should encourage defensive coding against threats such as GWA.

Hardened scaffolding performs state-changing create, update and destroy logic only when those actions are invoked by HTTP POST requests. When HTTP methods other than POST are used, the results are as follows:

* The create action redirects to new with the notice "<%= model_name %> must be created using HTTP POST" * The update action redirects to edit with the notice "<%= model_name %> must be updated using HTTP POST" * The destroy action redirects to edit with the notice "Click Destroy to destroy <%= model_name %>"

In addition to controller code changes, there are associated view code changes:

* The link for destroying an item in the list view now sets to true the link_to() :post option * A button for destroying the item has been added to the edit view

The upshot of this is that no state changes occur when GWA follows the links to destroy items. If scripting is disabled in the client, the user's click on the Destroy link of a list will take him to the edit page, and a notice will inform him to click the Destroy button.

The test code generator functional_test.rb has been updated to reflect the hardened behavior of generated controllers.

There is one little cosmetic change to the list action of generated controllers. I inserted parentheses into the call to paginate() because it appears on the right side of an assignment statement.

Attachments

hardened_scaffold.diff (6.3 kB) - added by nils@alumni.rice.edu on 12/28/05 21:35:52.
hardened_scaffold.2.diff (8.5 kB) - added by nils@alumni.rice.edu on 12/29/05 03:31:38.
Updated patch

Change History

12/28/05 21:35:52 changed by nils@alumni.rice.edu

  • attachment hardened_scaffold.diff added.

12/29/05 03:31:38 changed by nils@alumni.rice.edu

  • attachment hardened_scaffold.2.diff added.

Updated patch

12/29/05 03:37:37 changed by nils@alumni.rice.edu

I've added a verify declaration to scaffold-generated controllers. It requires :id to be in the params hash for actions show, edit, update, and destroy. This ensures that requests to these actions that do not include an ID get redirected to list with a flash notice instead of bombing. This behavior is desirable because users can inadvertently load an URL that fails this verification, and this should result in a friendly message instead of a Rails exception.

07/23/06 02:24:55 changed by anonymous

forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja forsja