HTML z formularza

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?

Wybierz opcję

  • 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ą.

Początkowo tak właśnie podszedłem do tego ale …

<%= 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.

<%=  f.text_area :content, class: 'tinymce', value: "#{sanitize f.object.content}" %>

:wink:

[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.

Sanitizowane czy escapowane? To jednak jest różnica.
A korzystam z RoR 4.0.0beta1 na Ruby 2.0

Mój błąd, założyłem że chodzi o eskejpowanie po prostu. Z punktu widzenia bezpieczeństwa te dwie wersje są okej:

<%= @article.content %> <%= sanitize @article.content %>
W zależności od potrzeb biznesowych (pożądanego UX) wybierasz co wolisz.

A do formularza chyba nic nie wstrzykniesz w ten sposób…