2012-09-04 136 views
13

我正在使用Brakeman來識別安全問題。它會標記任何使用params.merge作爲跨站點腳本漏洞的鏈接。我該如何清理類似以下的東西?params.merge和跨站點腳本

- @archives.each do |archive| 
    = link_to "FTP", params.merge(:action => :ftp, :archive => archive, :recipient => "company") 

回答

15

你應該創建一個基於你期望並希望允許在FTP鏈接的一部分,並使用該合併您的附加參數params僅元素的新哈希值。

你有什麼可以讓我通過修改查詢字符串來添加任何我想要的信息FTP,打開安全漏洞的大門。通過構建一個散列來代替params.merge(...中的params,您可以將預期的查詢字符串組件有效地列入白名單,以便在您要呈現的模板中使用。


作爲GET例如,如果你希望像

/some/path?opt1=val1&opt2=val2 

您的控制器操作的URL可能會做

@cleaned_params = { opt1: params[:opt1], opt2: params[:opt2] } 
@cleaned_params.merge! action: :ftp, archive: archive, recipient: :company 

再經過@cleaned_pa​​rams到link_to

= link_to "FTP", @cleaned_params 

這樣,如果我手動輸入像

/some/path?opt1=val1&opt2=val2&maliciousopt=somexss 

params[:maliciousopt]將永遠不會成爲一個網址到您的FTPlink_to在您的視圖。

同樣的行爲適用於POST請求,僅是惡意我可能會在提交

<input type="hidden" name="maliciousopt" value="somexss" /> 
+0

由於之前添加幾個字段的形式...你可以給我一個例子嗎?我真的不明白。 – snowangel

+0

爲我更新了我的答案。 – deefour

+0

完全感激 - 謝謝。 – snowangel