Prosta validacja

No wlasnie. Mam formularz ktory w polach tekstowych wysyła rozne dane. Zastanawiam sie jak mozna łatwo zabezpieczyć sie przed zapisywaniem htmlowych i inny ch znaczników. Tak zeby nie dało sie “wpisywać kodu”. Probowalem pluginu white_list ale cos nie działało mi :confused:

Szczerze mówiąc to zawsze jest problem (Ci którzy twierdzą, że tak nie jest mylą się ;)). Najprostsze rozwiązanie to traktować to co wpisze user jako tekst, a w szablonie używać metody h(), która wyeskejpuje dane:

<%=h "<h1>Nagłówek</h1>" %>

Kojarzę też, że railsy dostarczają jakiś helper do usuwania niechcianych tagów, ale wiem że do wersji 2.x nie była to w 100% bezpieczna metoda.

Najbezpieczniejsza metoda to użycie jakiegoś parsera (x)html/xml.
Możesz przyglądnąć się jak to robią w instiki: http://instiki.rubyforge.org/svn/instiki/trunk/lib/sanitize.rb (metoda sanitize_html).

to tak mam z tymi ‘h’ myślałem moze, ze jest cos konkretnieszego ale prostego w implementacji

a będac przy tematyce bezpieczeństwa , bo nie chce zakladac nowego wątku, mama pytanie odnosnie adresu. bo jezeli mam cos takiego:

railsapp/fotki/list

to widomo poki zamiast ‘list’ wpisujemy nazwy istniejacych akcji to wlaczają sie odpowiednio. Gdy jednak wpiszemy cos co nieistnieje otrzymujemy biała strone “Unknown action…” . Da sie jakoś zrobić żeby zamiast białej strony wlaczala sie np. jakas istnirjaca wybrana akcja?

btw: w jednym z kontrolerow, który wygenerowalem scafoldem utworzyło mi sie cos takiego:

# GETs should be safe (see http://www.w3.org/2001/tag/doc/whenToUseGet.html) verify :method => :post, :only => [ :destroy, :create, :update ], :redirect_to => { :action => :list }
nie wiem do czego to jest… i zastanawiam sie czyczasem nie jest to powiazane z tym moim pytaniem ??

W railsach >2.0 jest dużo lepiej niż kiedyś. Ogólnie używasz wspomnianej wyżej metody h(), która zamieni <> i inne znaki htmla na encje.

Jeżeli chcesz dać użytkownikom możliwość wpisania części tagów możesz użyć metody sanitize. W railsach 2.0 jest używana biała lista, czyli wpisujesz tylko te tagi i atrybuty, które dopuszczasz - jest to dużo prostsze od wypisania wcześniej w railsach czarnej listy. W environment.rb można ustawić dopuszczane tagi:

config.action_view.sanitized_allowed_tags = 'strong', 'b', 'i', 'table', 'tr', 'div' config.action_view.sanitized_allowed_attributes = 'id', 'class', 'style', 'href' config.action_view.sanitized_allowed_css_properties = 'align', 'color', 'font-face'
Dodatkowo warto używać pluginu safe_erb.

[quote=fredman]btw: w jednym z kontrolerow, który wygenerowalem scafoldem utworzyło mi sie cos takiego:

# GETs should be safe (see http://www.w3.org/2001/tag/doc/whenToUseGet.html) verify :method => :post, :only => [ :destroy, :create, :update ], :redirect_to => { :action => :list }
nie wiem do czego to jest… i zastanawiam sie czyczasem nie jest to powiazane z tym moim pytaniem ??[/quote]
Oznacza to że żądanie http post może wywołać tylko metody wymienione w nawiasach []. W tych nawiasach wymienione są metody, które zmieniają stan zasobów na serwerze(w uproszczeniu tworzą, zmieniają i kasują dane). Związane jest to z dobrą praktyką programistyczną, a przede wszystkim intencjami twórców HTTP. Dodatkową zaletą jest to, że próbując wrócić do poprzedniej strony po wysłaniu formularza metodą post dostajemy ostrzeżenie i w konkretnym przypadku np. nie zapłacimy 2X za tą samą rzecz wysyłając ten sam formularz.

Ogólna zasada:
GET- pobieranie
POST- tworzenie, modyfikacja, usuwanie

Ideologia REST idzie jeszcze dalej dodając dodatkowe metody(PUT,DELETE), ale to już zupełnie inna historia :slight_smile:

Odwrotnie: dla podanych akcji w tablicy można użyć tylko podanej metody (tu POST).

[code=ruby]class TestController < ApplicationController
verify :method => :post, :only => :action1

def action1
render :text => “action1”
end

def action2
render :text => “action2”
end
end[/code]
Akcję “action2” możesz wywołać sobie zarówno GET jak i POST.

[quote]a będac przy tematyce bezpieczeństwa , bo nie chce zakladac nowego wątku, mama pytanie odnosnie adresu. bo jezeli mam cos takiego:

railsapp/fotki/list

to widomo poki zamiast ‘list’ wpisujemy nazwy istniejacych akcji to wlaczają sie odpowiednio. Gdy jednak wpiszemy cos co nieistnieje otrzymujemy biała strone “Unknown action…” . Da sie jakoś zrobić żeby zamiast białej strony wlaczala sie np. jakas istnirjaca wybrana akcja?[/quote]
Wyjątek możesz przechwycić i zrobić co tam chcesz (np. wyświetlić stronę 404).
Możesz też spróbować taki trick:

class TestController < ApplicationController def method_missing(name, *args) render :text => "missing" end end
Możesz też pobawić się z routes. Możliwości jest wiele.

[quote]btw: w jednym z kontrolerow, który wygenerowalem scafoldem utworzyło mi sie cos takiego:

# GETs should be safe (see http://www.w3.org/2001/tag/doc/whenToUseGet.html) verify :method => :post, :only => [ :destroy, :create, :update ], :redirect_to => { :action => :list }
nie wiem do czego to jest… i zastanawiam sie czyczasem nie jest to powiazane z tym moim pytaniem ??[/quote]
Nie jest. Piachoo Ci już wytłumaczył.

[quote=radarek]class TestController < ApplicationController def method_missing(name, *args) render :text => "missing" end end
Możesz też pobawić się z routes. Możliwości jest wiele.[/quote]
O! to jest super! wsadzilem sobie to do application.rb i dodalem jeszcze wyswietlanie w layoucie tylko jest mały problem jeszcze:

działa jesli jesli w adresie jest wpisany controler, czyli tak jak tu:

railsapp/fotki/list

ale jeśli nie ma kontrolera czyli tak:

railsapp/

to po wpisaniu głupot w dalszej czesci, wypluwa error, tylko ze tym razem “Routing error” :expressionless:

EDIT: oko udało sie załtwić tez to pierwsze przez dodanie do routes.rb czegos takiego:

map.connect "*anything" , :controller => "kontroler", :action => "akcja"