W jaki sposób zabezpieczyć aplikację a jednocześnie umożliwić użytkowników wprowadzanie danych w HTML?
Mam model Article zawierający m.in. pole content:text. Chciałbym w formularzo wykorzystać tinymce do tego pola. Sam formularz i tinymce to nie problem ale co dalej? Jest kilka możliwości:
przyjmować całość danych i w widoku zastosować <%= raw @article.content %> - żadnej kontroli nad danymi pochodzącymi z inetu -> bardzo źle
przyjmować całość danych i w widoku zastosować <%= sanitize @article.content %>
sanityzację przeprowadzić jeszcze przed przyjęciem danych i wyświetlać dane jako zaufane ( raw ) np.
class ArticlesController < ApplicationController
(...)
private
# Never trust parameters from the scary internet, only allow the white list through.
def article_params
params[:article][:content] = ArticlesController.helpers.sanitize params[:article][:content]
params.require(:article).permit(:title, :content)
end
end
Może jakieś inne rozwiązania?
przyjmować całość danych i w widoku zastosować <%= sanitize @article.content %>
Bazie danych to nie zaszkodzi (jeśli oczywiście będziesz wystrzegał się SQL injection), a dostęp do rzeczywistych danych jest lepszy, niż do zmienionych. Być może Ci się przydadzą.
<%= form_for(@article) do |f| %>
(...)
<div class="field">
<%= f.label :content %><br/>
<%= f.text_area :content, class: 'tinymce' %>
</div>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
I gdzie jest zabezpieczenie? f.text_area dostaje dane wprost z bazy danych. Chyba, że o czymś nie wiem.
[quote=Tuptus]- przyjmować całość danych i w widoku zastosować <%= raw @article.content %> - żadnej kontroli nad danymi pochodzącymi z inetu -> bardzo źle
przyjmować całość danych i w widoku zastosować <%= sanitize @article.content %>
sanityzację przeprowadzić jeszcze przed przyjęciem danych i wyświetlać dane jako zaufane ( raw )[/quote]
Żadne z powyższych, jeśli korzystasz z Rails 3+. W Rails 3 wszystkie stringi są automatycznie eskejpowane przed wyświetleniem, więc nie potrzebujesz używać sanitize z ręki.