Kilka pytań początkującego

Witam

Przymierzam się do stworzenia pierwszego serwisu w RoR. Zamierzałem zacząć od czegoś małego, ale akurat pojawił się większy temat i nie ma czasu na rozgrzewkę :wink:
W związku z tym chciałbym zapytać “czy te rzeczy są obecne w RoR (albo jak to zrobić)”? Z góry przepraszam za porównania do Php, ale tam orientuję się znacznie lepiej.

  1. Czy jest jakieś narzędzie jak phpowy HTML Purifier - czyści htmla otrzymanego od usera (np z CKedtora), zapobiega XSS, etc
  2. W Zend Frameworku do każdego formularza mogę dodać specjalny obiekt/pole Zend_Form_Element_Hash który chroni przed atakami CSRF
  3. Jak się ma sprawa z nice url? Przyglądając się niektórym stroną zauważyłem tylko ?a=b&sdgd=432 - mnie to strasznie razi
  4. Czy wysyłka maili z załącznikiem to katorga w stylu base64 get_file_contents czy proste .addFile?
  5. Istnieje jakiś session id przekazywany w urlu czy domyślnie id sesji jest trzymany w ciasteczku?
  6. Mógłby mi ktoś przedstawić kawałek kodu definiującego Acla z RoR :wink:

Z góry dziękuję za pomoc

pisząc duży projekt nie znając ror nie ma bata bys masy błędów nie popełnił, więc może to nie jest dobry pomysł?

dzięki za radę, a znasz może odpowiedzi na moje pytania?

[quote=mrok]Witam

Przymierzam się do stworzenia pierwszego serwisu w RoR. Zamierzałem zacząć od czegoś małego, ale akurat pojawił się większy temat i nie ma czasu na rozgrzewkę :wink:
W związku z tym chciałbym zapytać “czy te rzeczy są obecne w RoR (albo jak to zrobić)”? Z góry przepraszam za porównania do Php, ale tam orientuję się znacznie lepiej.

  1. Czy jest jakieś narzędzie jak phpowy HTML Purifier - czyści htmla otrzymanego od usera (np z CKedtora), zapobiega XSS, etc[/quote]
    Jeśli chodzi o zapobieganie XSS to przydatne mogą być 2 metody dostępne w Railsach:
    h (Od Rails 3 h jest używany domyślnie)

oraz

sanitize

Jeśli potrzebujesz czegoś bardziej wyrafinowanego to napisz czego (chodzi o wymagania) to poszukamy.

W Railsach to auth_token jest dodawany do formularzy automatycznie, nie musisz nic oddzielnie dodawać.
Więcej tutaj

Trzeba zaplanować sobie dobrze strukturę URL’i w aplikacji, napisać ładny routing
Poza tym jest sporo pluginów wspomagających SEO (szukaj friendly_urls), napisanie swojego też nie powinno sprawiać problemu.

Powiedziałbym, że proste
Poza tym jest jeszcze mail gem

Domyślnie w ciasteczku, sesja też jest domyślnie w ciasteczku.

ACL ACL’owi nierówny, kawałek kodu może być bardzo prosty, np:

access_control :DEFAULT => '(superuser | admin)'

albo bardziej skomplikowany, w zależności od potrzeb. Z reguły jeśli chodzi o ACL to najpierw definiujesz swoje potrzeby, a póżniej szukasz pluginu, pytasz na forum.

Ja nigdy czegoś takiego nie używałem, ale jest na pewno gem tidy, który korzysta z biblioteki html tidy.

Co do XSS:

  1. W railsach 2.x jest helper h(), który escape’uje htmla
  2. Jest metoda sanitize, która escape’uje z tym, że może zostawić wybrane przez Ciebie tagi
  3. W rails 3.0 wszystko co wyświetlasz jest domyślnie escape’owane. Jeżeli musisz wyświetlić htmla, to trzeba jawnie to zadeklarować.
  4. Do rails 2.x jest kilka pluginów, które dodatkowo zabezpieczają, zobacz np. safe erb, xss shield

W railsach to jest domyślnie dodawane i nazywa się authenticity token.

Poczytaj o routes. Polecam http://guides.rails.info/routing.html (w ogóle wszytkie guides warto przeczytać).

Zasadniczo najczęściej stosuje się REST, czyli w routes masz na przykład:

map.resources :articles do |articles| articles.resources :comments end
Przy takim ustawieniu możesz na przykład napisać:

# article i comment to obiekty activerecord (ewentualnie jakiekolwiek inne obiekty, które odpowiadają na to_param) article_comment_path(article, comment) # => /articles/10/comments/666
Jak widać domyślnie generuje się id, ale wystarczy, że w modelu zmienisz metodę to_param i już będzie ładniej:

class Article < ActiveRecord::Base def to_param "#{id}-#{title}" end end
Przy takim ustawieniu wygeneruje się route: /articles/10-tytuł artykułu/comments/666.

Kiedyś o tym pisałem na blogu: http://blog.drogomir.com/articles/2008/01/12/przyjazne-adresy-w-ruby-on-rails
Jak poszukasz w sieci, to znajdziesz pewnie 100 innych artyjułów :wink:

Prose .addFile, a dokładniej:
http://guides.rails.info/action_mailer_basics.html#sending-emails-with-attachments

W ciasteczku, nie słyszałem, żeby w railsach ktoś używał tego jako parametru. W praktyce id sesji Cię właściwie nie obchodzi, bo jest do tego proste API:

session[:costam] = "bla" session[:costam] # => "bla"

Do tego jest pińcset pluginów, poszukaj jakichś konkretnych i zobacz w README jak się ich używa.

jak bedziesz programowal w Rails way to o bezpieczenstwo nie musisz sie martwic. FCKeditora nie uzywalem, no ale na pewno mozna dowolny string na rozne sposoby. Maile wysyla sie latwo, jak? Zobacz np na screencast.com czy jak tam ten adres jest do filmow o Rails.

Jest SanitizeHelper z Railsów i kilka zewnętrznych narzędzi.

Jest RequestForgeryProtection - włączony domyślnie w każdej Railsowej aplikacji.

Tak niestety przesyła się parametry w URL - to kwestia samego standardu, a nie frameworka. Stosowanie REST-a i zagnieżdżonych zasobów dość mocno ogranicza krzaczki w URL-ach.

ActionMailer udostępnia prosty sposób dodawania załączników do wysyłanych maili.

Sesja zwykle jest przechowywana w podpisanym ciachu po stronie użytkownika. Możesz także przechowywać powiązane z użytkownikiem informacje w innym miejscu, wtedy w ciachu wyląduje tylko jakiś identyfikator.

Jest dużo gemów, które udostępniają tego typu funkcje.

Na wszystkie zadane przez Ciebie pytania najlepiej odpowiedzą Google. Polecam przyjrzeć się najpierw dokumentacji, przewodnikom i darmowym screencastom.

Chyba jednak za wolno piszę ;-).

Ale wszyscy zgodni, jak jeden mąż :slight_smile:

I chętni do pomocy :wink:

W sprawie ataków XSS to jeśli masz zamiar używać Rails 2.3 jest plugin http://www.blog.bridgeutopiaweb.com/post/rails-2-dot-3-xss-plugin/ natomiast w 3.0 jest to już część Framework’a

Wow ale mnie zaskoczyliście zarówno prędkością jak i objętością wypowiedzi - dziękuję wszystkim za wyczerpujące odpowiedzi.

Pierwszy problem :wink: instalacja railsów

  1. Próba pierwsza - na windowsie - zarzuciłem po przeczytaniu tutoriala z informacją ze nie jest to najlepszy pomysł
  2. Ubuntu 9.04 - Manager pakietów (Ruby1.8) - wszystko szło fajnie do czasu ‘bundle install’ - system nie mógł odnaleźć takiego gema pomimo tego ze linia wyżej to ‘bundle install -> install successfuly’
  3. Ponieważ lubię pracować na najnowszych wersjach softu to ściągnąłem Ruby1.9 i skompilowałem ze źródeł - wszystko działa fajnie ruby, irb, gem install, ale niestety nie działa

[code]ruby -v
ruby 1.9.1p376 (2009-12-07 revision 26041) [i686-linux]

gem -v
1.3.5

rails blog
The program ‘rails’ is currently not installed. You can install it by typing:
sudo apt-get install rails
bash: rails: command not found[/code]
i tu pytanie gdzie może być rails żebym mógłs stworzyć symlinka

[code]gem list

*** LOCAL GEMS ***

actionmailer (2.3.5)
actionpack (2.3.5)
activerecord (2.3.5)
activeresource (2.3.5)
activesupport (2.3.5)
rack (1.0.1)
rails (2.3.5)
rake (0.8.7)
rubygems-update (1.3.5)[/code]
a wiec railsy są, ale

[code]gem which rack
(checking gem rack-1.0.1 for rack)
/opt/ruby1.9/lib/ruby1.9/gems/1.9.1/gems/rack-1.0.1/lib/rack.rb

gem which rails
Can’t find ruby library file or shared library rails[/code]
katalog z railsami tez istnieje

/opt/ruby1.9/lib/ruby1.9/gems/1.9.1/gems$ ls actionmailer-2.3.5 activeresource-2.3.5 [b]rails-2.3.5[/b] actionpack-2.3.5 activesupport-2.3.5 rake-0.8.7 activerecord-2.3.5 rack-1.0.1 rubygems-update-1.3.5
tylko nie moge w nim znalezc pliku rails?
Ma ktoś jakiś pomysł co mogę robić źle?

Nic nie robisz źle. Nie masz tylko katalogu, w którym zainstaowały się railsy w PATHie. W Twoim przypadku jest to chyba /opt/bin, ale głowy nie dam.

Wpisz:

gem env

i będziesz miał właściwą ścieżkę.

mrok: jeśli dopiero zaczynasz z Railsami to zapomnij póki co o Rails 3 i Ruby 1.9 - dopóki nie poznasz dobrze Ruby 1.8 oraz Rails 2.3.5

Zainstaluj Ruby 1.8.7 i Rails 2.3.5, bundlera nie potrzebujesz, skąd wziąłeś te instrukcje ? Czytałeś oficjalne Rails Guides (wersja polska) ?

[quote=apohllo]Nic nie robisz źle. Nie masz tylko katalogu, w którym zainstaowały się railsy w PATHie. W Twoim przypadku jest to chyba /opt/bin, ale głowy nie dam.

Wpisz:

gem env

i będziesz miał właściwą ścieżkę.[/quote]
Dzięki - faktycznie dodanie ścieżki pomogło

Czy powodem dla ktorego tak doradzasz jest to częściowo zmieniona skladnia miedzy 1.8 i 1.9 i część niedziałających gemów - czy jest też inny powód?

Instrukcję wziąlem z tej strony http://guides.rails.info/getting_started.html - wiem na górze jest napis, że to do Railsów 3, ale jakoś nie wpadłem na pomysł ze to to może powodować ten bundler error - mea culpa.

Po prostu Ruby 1.9 i Rails 3.0 to jeszcze dość wczesna wersja, żeby nie mówić beta ;]

Tak, jest trochę zmian pomiędzy 1.8 a 1.9. Niektóre rzeczy jeszcze nie do końca działają w Rails 3 pod 1.9 albo działają ale musisz patchować tu i ówdzie kod Poza tym sporo pluginów nie jest kompatybilnych z Rails 3, możesz oczywiście zacząć korzystać już z Rails 3 i ludzie tak robią ale musisz wiedzieć dokładnie jakich pluginów potrzebujesz i jak przystosować je do pracy z Rails 3. Poza tym większość tutoriali, podręczników opisuje głównie wersję 2.x więc będzie Ci łatwiej.

Po prostu jeśli chcesz doświadczyć tego przyjemnego uczucia programowania z którego Rails słynie :slight_smile: i dopiero zaczynasz to zostań przy 2.3.5 i Ruby 1.8.7 przynajmniej przez pierwszych kilka projektów.

Ja nigdy czegoś takiego nie używałem, ale jest na pewno gem tidy, który korzysta z biblioteki html tidy.[/quote]
Gema Tidy szczerze odradzam. Przynajmniej niesforkowanego. A jak już znajdziesz ten dobry fork na githubie to i tak okaże się, że raz na kilka requestów będziesz miał segfaulta. Chciałem go wykorzystać w http://bitbucket.org/sensei/rack-html-validator/changeset/6fe77a7593f0/ , ale po tym odpuściłem.

Ale z powodzeniem możesz przepychać html pipe’m do binarki tidy.

Inna możliwość to http://coderack.org/users/nerdEd/entries/95-rackvalidate , ale niezupełnie ci o to chodzi.