rezumat
Acest document ofera o lista nu neaparat cuprinzatoare a masurilor de securitate care trebuie implementate atunci cand se dezvolta o aplicatie Ruby on Rails. Este conceput pentru a servi ca o referinta rapida si pentru a minimiza vulnerabilitatile cauzate de uitarea dezvoltatorului. Nu inlocuieste instruirea dezvoltatorilor cu privire la principiile de codificare sigura si modul in care acestea pot fi aplicate.
Descrierea modului in care functioneaza fiecare vulnerabilitate de securitate nu intra in sfera acestui document. Linkurile catre resurse externe care contin informatii suplimentare sunt furnizate in sectiunile corespunzatoare ale listei de verificare. Va rugam sa aplicati doar sugestiile pe care le intelegeti cu atentie.
Retineti ca securitatea este o tinta in miscare. Noi vulnerabilitati si vectori de atac sunt descoperiti in fiecare zi. Va sugeram sa incercati sa fiti la curent, de exemplu, abonandu-va la listele de corespondenta de securitate legate de software-ul si bibliotecile pe care le utilizati.
Aceasta lista de verificare este menita sa fie o resursa bazata pe comunitate. Contributiile dvs. sunt binevenite!
Declinare de responsabilitate : Acest document nu acopera toate vulnerabilitatile de securitate posibile. Autorii nu isi asuma nicio responsabilitate legala pentru acuratetea sau exhaustivitatea informatiilor din acest document.
Versiuni suportate de sine
Acest document se concentreaza pe Rails 4 si 5. Vulnerabilitatile prezente in versiunile anterioare si remediate in Rails 4 nu sunt incluse.
Cuprins
- Lista de verificare
- Injectie
- Autentificare
- Sesiuni si cookie-uri
- Cross-Site Scripting (XSS)
- Gestionarea datelor introduse de utilizator
- Iesire de iesire si igienizare
- Protectie XSS in sabloanele HAML
- Politica de securitate a continutului (CSP)
- Referinta nesigura a obiectelor directe
- HTTP si TLS
- Anteturi legate de securitate
- Securitate memorata
- Autorizare (Pundit)
- Dosare
- Incarcari de fisiere
- Descarcari de fisiere
- Falsificare de cereri intre site-uri (CSRF)
- Partajarea resurselor pe mai multe origini (CORS)
- Expunere la date sensibile
- Acreditari
- Rutare, selectare sablon si redirectionare
- Software terta parte
- Instrumente de securitate
- Testarea
- Altii
- Detalii si mostre de cod
- Exemplu de injectie comanda
- Validare parola regex
- Pundit: asigurati-va ca toate actiunile sunt autorizate
- Pundit: afiseaza numai inregistrarile corespunzatoare in casetele selectate
- configurare rack-cors
- Convertiti filter_parameters intr-o lista alba
- Cereri de strangulare
- HAML: protectie XSS
- Autori
- Contribuind
- A FACE
- Referinte si lecturi suplimentare
- Licenta
Cuprins generat de DocToc.
Lista de verificare
Injectie
Atacurile prin injectie sunt numarul 1 la Top 10 OWASP.
- Nu utilizati interpolare standard Ruby (# {foo}) pentru a insera siruri introduse de utilizator in ActiveRecord sau interogari SQL brute. Foloseste ? caracter, numit variabile de legare sau metode ActiveRecord :: Sanitization pentru a igieniza intrarile utilizatorului utilizate in interogarile DB. Atenueaza atacurile de injectie SQL.
- Nu treceti sirurile introduse de utilizator catre metode capabile sa evalueze codul sau sa ruleze comenzi ale sistemului de operare precum eval, system, syscall,% x (), open, popen <n>, File.read, File.write si exec. Utilizarea expresiilor regulate este o modalitate buna de igienizare (esantion de cod). Atenueaza atacurile de injectie de comanda.
Resurse:
- Ghid de securitate Ruby on Rails – Injectie SQL
- Exemple de injectie SQL Rails
- Intensificati securitatea aplicatiei dvs. Rails | Partea 1
Autentificare
Autentificarea intrerupta si gestionarea sesiunii sunt numarul 2 in Top 10 OWASP.
- Evitati sa va rulati propria autentificare, cu exceptia cazului in care stiti exact ce faceti. Luati in considerare utilizarea unei bijuterii precum Devise, Authlogic sau Clearance. Atenueaza zeci de vulnerabilitati potentiale.
- Aplica o parola de minimum 8 caractere sau mai mult. Atenueaza atacurile cu forta bruta.
- Concepere: setati config.password_length = 8..128 in config / initializers / devis.rb.
- Luati in considerare validarea parolelor impotriva:
- Cuvinte de dictionar. Deoarece parolele au o lungime minima ceruta, dictionarul trebuie sa includa numai cuvinte care indeplinesc aceasta cerinta.
- O lista de parole utilizate in mod obisnuit, cum ar fi acestea. Bijuteria StrongPassword ofera o astfel de caracteristica.
- O baza de date cu parole scursa, cum ar fi PasswordPing.
- Cuvinte specifice contextului, cum ar fi numele aplicatiei, numele de utilizator si derivatele acesteia.
- Luati in considerare avantajele si dezavantajele aplicarii regulilor de complexitate a parolei, cum ar fi amestecuri de diferite tipuri de caractere. Majoritatea aplicatiilor il folosesc. Cu toate acestea, cele mai recente linii directoare NIST recomanda acest lucru. O alternativa este cresterea cerintei de lungime minima si incurajarea utilizarii frazelor de acces. Atenueaza atacurile cu forta bruta.
- Devise: utilizati o bijuterie specifica pentru Devise, cum ar fi devise-securitate, devise_zxcvbn sau una dintre urmatoarele solutii de autentificare-agnostic.
- Bijuteria StrongPassword sau o validare regex (esantion de cod) ar trebui sa functioneze cu majoritatea configurarilor de autentificare.
- Blocati contul dupa mai multe incercari esuate de conectare. Atenueaza atacurile cu forta bruta.
- Proiectare: activati modulul blocabil.
- Solicitati utilizatorilor sa-si confirme adresele de e-mail la inscriere si cand se schimba adresa de e-mail. Atenueaza crearea de conturi false cu e-mailuri inexistente sau terte.
- Proiectare: utilizati modulul confirmabil si setati config.reconfirmable = true in config / initializers / devis.rb.
- Solicitati utilizatorilor sa introduca vechea lor parola la schimbarea parolei. Atenueaza modificarile neautorizate ale parolei la deturnarea sesiunii, CSRF sau cand un utilizator uita sa se deconecteze si lasa PC-ul sau dispozitivul mobil nesupravegheat.
- Elaborati: face asta in mod implicit
- Expira sesiunea la deconectare si expira sesiunile vechi la fiecare conectare reusita. Atenueaza atacurile CSRF, deturnarea sesiunii si atacurile de fixare a sesiunii prin reducerea intervalului lor de timp.
- Elaborati: face asta in mod implicit.
- Expirati sesiunile dupa o perioada de inactivitate (de exemplu, 30 de minute). Atenueaza atacurile CSRF, deturnarea sesiunilor si fixarea sesiunilor prin reducerea intervalului lor de timp.
- Concepere: utilizati modulul care poate fi expirat.
- Notificati utilizatorul prin e-mail la schimbarea parolei. Nu impiedica un atacator sa schimbe parola victimei, dar avertizeaza victima astfel incat sa poata contacta administratorul de sistem pentru a revoca accesul atacatorului.
- Creati: setati config.send_password_change_notification = adevarat in config / initializers / devis.rb.
- Utilizati mesaje de eroare generice, cum ar fi „E-mail sau parola nevalida”, in loc sa specificati ce parte (e-mail sau parola) este nevalida. Atenueaza enumerarea utilizatorilor si atacurile cu forta bruta.
- Devise: setarea config.paranoid = true in config / initializers / devis.rb va proteja modulele confirmabile, recuperabile si deblocabile impotriva enumerarii utilizatorilor. Pentru a proteja modulul inregistrabil, adaugati un captcha la pagina de inregistrare (consultati instructiunile din Devise Wiki).
- Asigurati-va ca toti controlorii / actiunile non-publice necesita autentificare. Evitati accesul neautorizat din cauza uitarii dezvoltatorului.
- Elaborati: adaugati before_action: authenticate_user! la ApplicationController si skip_before_action: authenticate_user! catre controlori / actiuni accesibile publicului.
- Luati in considerare utilizarea autentificarii cu doi factori (2FA), asa cum este furnizat de Authy. Ofera un strat suplimentar extrem de eficient de securitate de autentificare.
- Intelegeti: vedeti pietrele pretioase concepute cu doi factori si auto-concepute.
- Luati in considerare necesitatea autentificarii in config / routes.rb. Este posibil ca solicitarea autentificarii atat in controlere, cat si in rute sa nu fie DRY, dar o astfel de redundanta ofera o securitate suplimentara (consultati Apararea in profunzime).
- Devise: Plasati resurse non-publice intr-un bloc autentificat: faceti utilizator (consultati Wise Devise).
- Luati in considerare limitarea numarului de sesiuni simultane pe cont. Poate reduce expunerea aplicatiei la compromiterea contului (de exemplu, parole scurse).
- Intelegeti: utilizati bijuteria de securitate.
- Evitati sa puneti in aplicare „intrebari de securitate” precum „Care este numele de fata al mamei dumneavoastra?” deoarece raspunsurile lor pot fi reutilizate pe mai multe site-uri si usor de gasit prin intermediul ingineriei sociale. Vezi acest articol.
- Daca utilizati controlul accesului bazat pe roluri (RBAC), nu includeti atributul rol in parametrii puternici ai controlerelor utilizate pentru inregistrarea utilizatorilor si editarea profilului. Impiedicati utilizatorii rau intentionati sa isi atribuie rolul de administrator.
- Elaborare: nu treceti cheia parametrului rolului la devise_parameter_sanitizer.permit.
- Luati in considerare restrictionarea accesului administratorului prin IP. Daca IP-ul clientului este dinamic, restrictionati-l in functie de blocul IP / ASN sau de tara prin geolocalizare IP.
Sesiuni si cookie-uri
Autentificarea intrerupta si gestionarea sesiunii sunt numarul 2 in Top 10 OWASP.
- Nu stocati date precum solduri de bani / puncte sau privilegii de utilizator intr-un cookie sau intr-o sesiune CookieStore. Stocati-l in baza de date. Atenueaza atacurile de reluare.
- Luati in considerare intotdeauna utilizarea cookie-urilor criptate. Acesta este comportamentul implicit in
Rails 4+ cand este setat secret_key_base. Consolideaza criptarea cookie-urilor si atenueaza atacurile multiple care implica manipularea cookie-urilor.
- Cu exceptia cazului in care frontend-ul dvs. JavaScript trebuie sa citeasca cookie-urile generate de serverul Rails, setati toate cookie-urile imediat. Cautati in proiect accesorii cookie si adaugati optiunea: true. Exemplu: cookie-uri [: login] = {value: ‘user’, httponly: true}. Restrictioneaza accesul cookie la serverul Rails. Atenueaza atacatorii sa nu foloseasca JavaScript-ul browserului victimei pentru a fura cookie-uri dupa un atac XSS reusit.
Resurse:
- Ghid de securitate Ruby on Rails – Sesiuni
Cross-Site Scripting (XSS)
XSS este numarul 3 in Top 10 OWASP.
Gestionarea datelor introduse de utilizator
- Validati intotdeauna datele introduse de utilizator care pot fi afisate in cele din urma altor utilizatori. Incercarea de a inscrie pe lista neagra caractere, siruri de caractere sau igieniza intrarea tinde sa fie ineficienta (vezi exemple despre cum sa ocolesti astfel de liste negre). O abordare pe lista alba este de obicei mai sigura. Atenueaza mai multe atacuri XSS.
- Luati in considerare utilizarea bijuteriei loofah-activerecord pentru a curata valorile atributelor modelului. Atenueaza mai multe atacuri XSS .
- Daca trebuie sa creati linkuri de la adresele URL introduse de utilizator, asigurati-va ca le validati. In special, ar trebui sa fie posibil sa se limiteze schemele URL la http / https in aproape toate cazurile. Adresa URL transmisa catre link_to (al doilea argument) va fi scapata de HTML. Cu toate acestea, link_to permite orice schema pentru adresa URL. Daca utilizati regex, asigurati-va ca sirul incepe cu protocolul (protocolurile) asteptat (e), ca in \ Ahttps ?. Atenueaza atacurile XSS, cum ar fi introducerea javascript: dangerous_stuff () //http://www.some-legit-url.com ca adresa URL a unui site web sau ca date periculoase: sarcina utila care este afisata altor utilizatori (de exemplu, intr-o pagina de profil de utilizator) ).
- Cand utilizati regex pentru validarea intrarii, utilizati \ A si \ z pentru a potrivi inceputul si sfarsitul sirului. Nu Nu utilizati ^ si $ ca ancore. Atenueaza atacurile XSS care implica alunecarea codului JS dupa intreruperi de linie, cum ar fi [email protected] \ n <script> stuff_stuff (); </script>.
- Nu aveti incredere in validarile implementate la client (frontend) deoarece majoritatea implementarilor pot fi ocolite. (Re) validati intotdeauna la server.
Iesire de iesire si igienizare
- Evitati toate iesirile HTML Rails face asta in mod implicit, dar apelarea html_safe sau raw la vizualizare elimina scaparea. Cautati apeluri catre aceste metode in intregul proiect, verificati daca generati HTML din siruri introduse de utilizator si daca acele siruri sunt validate efectiv. Retineti ca exista zeci de moduri de a se sustrage validarii. Daca este posibil, evitati sa chemati cu totul html_safe si raw. Majoritatea bibliotecilor de modelare ofera, de asemenea, o modalitate de a sari peste evadare. ERB foloseste dublul ==: <% == params [: interogare]%>. Pentru spalarea personalizata, consultati ActionView :: Helpers :: SanitizeHelper Mitigates atacurile XSS.
- Includeti intotdeauna valorile atributelor cu ghilimele duble. Chiar si fara html_safe, este posibil sa se introduca scripturi intre site-uri in sabloane cu atribute necotate. In urmatorul cod <p class = <% = params [: style]%> … </p>, un atacator poate introduce un spatiu in parametrul de stil si dintr-o data sarcina utila este in afara valorii atributului si pot introduce sarcina utila proprie. Si cand o victima trece peste paragraf, sarcina utila XSS se va declansa. Atenueaza atacurile XSS.
- Redarea JSON in interiorul sabloanelor HTML este dificila. Nu puteti sa scapati doar de HTML JSON, mai ales atunci cand il inserati intr-un context de script, deoarece ghilimelele duble vor fi evadate si vor rupe codul. Dar nu este sigur sa nu scapati de el, deoarece browserele vor trata o eticheta </script> ca HTML, indiferent unde se afla. Documentatia Rails recomanda intotdeauna utilizarea json_escape doar in cazul in care to_json este suprascris sau valoarea nu este valida JSON. Atenueaza atacurile XSS.
- Aveti grija cand utilizati render inline: …. Valoarea transmisa va fi tratata ca un sablon ERB in mod implicit. Aruncati o privire la acest cod: render inline: „Multumesc #{@user.name}!”. Presupunand ca utilizatorii isi pot seta propriul nume, un atacator ar putea seta numele lor la <% = rm -rf /%>, care va executa rm -rf / pe server! Aceasta se numeste Server Side Template Injection si permite executarea arbitrara a codului (RCE) pe server. Daca trebuie sa utilizati un sablon inline, tratati toate intrarile la fel ca intr-un sablon ERB obisnuit: redati inline: „Multumesc <% = @ user.name%>”. Atenueaza atacurile XSS.
- Evitati sa trimiteti siruri introduse de utilizator in e-mailuri catre alti utilizatori. Atacatorii pot introduce un URL rau intentionat intr-un camp de text liber care nu este destinat sa contina URL-uri si nu ofera validare URL. Majoritatea clientilor de e-mail afiseaza adresele URL ca linkuri. Atenueaza XSS, phishing, infectii malware si alte atacuri.
- Daca o cheie I18n se termina cu _html, aceasta va fi marcata automat ca html safe in timp ce interpolarile cheii vor fi evitate! A se vedea (exemplu de cod).
Protectie XSS in sabloanele HAML
- Aveti grija cand utilizati! = In Haml si ar trebui sa va asigurati ca nu exista date de utilizator care sa nu fie reduse. Notarea! = In Haml functioneaza asa cum functioneaza <% = raw (…)%> in ERB. Vezi (exemplu de cod).
Resurse:
- Ghid de securitate Ruby on Rails – XSS
- Foaie de trisare a filtrului OWASP XSS
- OWASP Ruby on Rails Cheatsheet – Cross-site Scripting (XSS)
- Blog Plataformatec – Noul dezinfectant HTML din Rails 4.2
- Brakeman Pro – Cross-Site Scripting in Rails
- Prevenirea problemelor de securitate in Rails
- Sfaturi de securitate pentru aplicatiile cu sine
Politica de securitate a continutului (CSP)
- Politica de securitate a continutului (CSP) este un strat suplimentar de securitate care ajuta la detectarea si atenuarea diferitelor tipuri de atacuri pe aplicatiile noastre web, inclusiv Cross Site Scripting (XSS) si atacuri de injectare de date.
Resurse:
- Rails 5.2 DSL pentru configurarea politicii de securitate a continutului
Referinta nesigura a obiectelor directe
- O problema IDOR apare atunci cand utilizatorul ar trebui sa aiba acces la adresa URL “/ get / post / 6”, de exemplu, dar nu “/ get / post / 9”, dar sistemul nu verifica corect aceste permisiuni. Si daca schimbam „6” in adresa URL, ce se intampla? Putem vedea datele tuturor utilizatorilor. Acest lucru se poate datora faptului ca datele au fost generate dupa cum urmeaza: @user = User.find_by (id: params [: user_id]) – care obtine practic ID-ul din parametrul GET din URL. In schimb, un mod mai sigur de a face acest lucru este setarea parametrului @user pe baza variabilei de sesiune “current_user” astfel: @user = current_user.
Resurse:
- Vulnerabilitati pe sine si unde sa le gasim – Partea 1
HTTP si TLS
- Fortati HTTPS peste TLS (cunoscut anterior ca SSL). Setati config.force_ssl = true in config / settings / production.rb. Poate fi realizat si intr-un punct de terminare TLS, cum ar fi un echilibru de sarcina, Nginx sau Passenger Standalone. Atenueaza atacurile om-la-mijloc si alte atacuri.
- Utilizati instrumentul de testare a serverului SSL de la Qualys SSL Lab pentru a verifica gradul certificatului dvs. TLS. Asigurati-va ca utilizati cele mai puternice (dar compatibile pe scara larga) protocoale si suite de cifrare, de preferinta cu suport Ephemeral Diffie-Hellman.
Mozilla SSL Configuration Generator va poate da unele sugestii.
xxx gratis en español follando rico
mamadas por dinero pornoxxxxx
follando a mi hija porno español jovencitas
se folla a su cuñada comic porno español
hombres pajeandose videos porno abuelas
folladoras cincuentonas follando
porno español años 70 xxx abuelas
todoporno pono gay
suegras peludas danna paola desnuda
copilacion de mamadas culos porno
porno gay españoles corridas en la garganta
madres haciendo pajas a sus hijos chochitos jovencitos
penes enormes orgias caseras
randy dave intercambio parejas amateur
comiendo tetas el video porno mas visto en internet
masajes eroticos chinos follando en el campo
maduras gordas desnudas pajas caseras
porno casero colombiano cachondas españolas
porno muy duro me hace una paja
super maduras videos porno caseros españolesAtenueaza mai multe atacuri legate de SSL / TLS, cum ar fi BEAST si POODLE.
- Luati in considerare solicitarile HTTP primite care limiteaza rata, asa cum sunt implementate de pietrele de atac rack si de accelerare rack. A se vedea exemplul de cod. Atenueaza razuirea web, inundatiile HTTP si alte atacuri.
Anteturi legate de securitate
- Luati in considerare utilizarea bijuteriei Secure Headers. Atenueaza mai multe atacuri.
- Luati in considerare obscuritatea sirului de bannere ale serverului web. Cu alte cuvinte, ascundeti numele si versiunea serverului dvs. web. Atenueaza amprentarea HTTP, ceea ce face mai dificil pentru atacatori sa determine ce exploatari pot functiona pe serverul dvs. web.
Securitate memorata
- Folositi un firewall. Memcached trebuie sa fie accesibil de pe celelalte servere, dar nu exista niciun motiv sa il expuneti la internet. Pe scurt, numai celelalte servere de productie au acces la serverele de memcached de productie. Numai acest lucru ar impiedica utilizarea serverului dvs. intr-un atac. Memcached din cutie nu foloseste autentificarea, astfel incat oricine se poate conecta la serverul dvs. va putea sa va citeasca datele.
- Ascultati pe o interfata privata. Daca rulati un server pentru aplicatia dvs. Rails si memcached, ar trebui sa ascultati pe 127.0.0.1. Din motive de disponibilitate, oricum nu ar trebui sa aveti 1 server in productie. Pentru medii de testare si de testare, urmati aceasta regula. Pentru setarile de productie in care aveti mai multe servere Rails care trebuie sa se conecteze la memcached, utilizati IP-ul privat al serverului. Acesta este ceva de genul 192.168.0.1, 172.16.0.1 sau 10.0.0.1. Cand porniti memcached, utilizati –listen 127.0.0.1 sau –listen 192.168.0.1.
- Dezactivati UDP. Este activat in mod implicit. Pentru a dezactiva UDP, utilizati -U 0 cand porniti memcached.
Resurse:
- Securitate Memcached aka Don’t Attack GitHub
Autorizare (Pundit)
- Implementati autorizatia in partea din spate. Ascunderea linkurilor / controalelor in interfata de utilizare nu este suficienta pentru a proteja resursele impotriva accesului neautorizat. Atenueaza atacurile fortate de navigare.
- Asigurati-va ca toate controlerele / actiunile care necesita autorizare apeleaza metoda authorize sau policy_scope (cod de esantion). Atenueaza atacurile fortate de navigare datorita faptului ca dezvoltatorii au uitat sa solicite autorizare in unele actiuni ale controlerului.
- Atunci cand utilizati inregistrari DB asociate utilizatorilor pentru a completa casete de selectare, butoane radio sau casete de selectare, in loc sa interogati prin asociere (user.posts), luati in considerare utilizarea policy_scope. Vedeti detalii suplimentare si codul exemplar. Imbunatateste lizibilitatea si mentinerea politicilor de autorizare.
Resurse:
- Pundit: asigurarea utilizarii politicilor si domeniilor
- Pundit: Domenii de aplicare
Dosare
Incarcari de fisiere
- Evitati sa folositi nume de fisiere controlate de utilizator. Daca este posibil, atribuiti nume „aleatorii” fisierelor incarcate atunci cand le stocati in sistemul de operare. Daca nu este posibil, introduceti pe lista alba caractere acceptabile. Este mai sigur sa refuzati incarcarile cu caractere nevalide in numele fisierelor decat sa incercati sa le igienizati. Atenueaza atacurile de traversare a directorului, cum ar fi incercarea de a suprascrie fisierele de sistem, incarcand fisiere cu nume precum ../../passwd.
- Evitati sa utilizati biblioteci precum ImageMagick pentru a procesa imagini si videoclipuri pe serverul dvs. Daca este posibil, utilizati un serviciu de procesare de imagini / video, cum ar fi Transloadit, Cloudinary sau imgix. Atenueaza mai multe vulnerabilitati legate de procesarea imaginilor / videoclipurilor, cum ar fi acestea.
- Daca utilizati bijuterie pentru paperclip cu imagemagick pentru incarcarea si procesarea fisierelor, asigurati-va:
- Politicile Imagemagick sunt potrivite pentru mediul dvs., pentru a evita exploatari precum atacul de inundatii de pixeli.
- Parodizarea continutului este gestionata manual, deoarece nu reuseste in scenarii precum # 2426.
- Procesati fisierele incarcate in mod asincron. Daca nu este posibil, implementati limitarea ratei per client. Atenueaza atacurile DoS care implica supraincarcarea procesorului serverului prin inundarea acestuia cu incarcari care necesita procesare.
- Nu aveti incredere in validarile implementate la client (frontend) deoarece majoritatea implementarilor pot fi ocolite. (Re) validati intotdeauna la server.
- Validati fisierele inainte de procesare. Atenueaza atacurile DoS, cum ar fi bombele de imagine.
- Afisati pe lista alba extensii de fisiere acceptabile si tipuri media acceptabile (cunoscute anterior ca tipuri MIME). Validarea extensiilor de fisiere fara verificarea tipurilor de media nu este suficienta, deoarece atacatorii pot masca fisierele rau intentionate schimbandu-le extensiile. Atenueaza incarcarea formatelor de fisiere periculoase, cum ar fi scripturile shell sau Ruby.
- Limitati dimensiunea fisierului. Atenueaza impotriva atacurilor DoS care implica incarcarea de fisiere foarte mari.
- Luati in considerare incarcarea direct de la client (browser) pe S3 sau un serviciu similar de stocare in cloud. Atenueaza mai multe probleme de securitate pastrand fisierele incarcate pe un server separat decat aplicatia dvs. Rails.
- Daca permiteti incarcarea de fisiere predispuse la malware (de ex., Exe, msi, zip, rar, pdf), scanati-le pentru a detecta virusi / malware. Daca este posibil, utilizati un serviciu terta parte pentru a le scana in afara serverului dvs. Atenueaza infectia serverului (mai ales pe serverele Windows) si serveste fisierele infectate altor utilizatori.
- Daca permiteti incarcarea arhivelor precum zip, rar si gz, validati calea tinta, dimensiunea estimata de dezarhivare si tipurile de fisiere comprimate inainte de dezarhivare. Atenueaza atacurile DoS, cum ar fi bombele zip, fixarea fisierelor rau intentionate in incercarea de a ocoli validarile si suprascrierea fisierelor de sistem, cum ar fi / etc / passwd.
Descarcari de fisiere
- Nu permiteti descarcarea numelor de fisiere si a cailor trimise de utilizator. Daca nu este posibil, utilizati o lista alba de nume de fisiere si cai permise. Atenueaza exploatarea vulnerabilitatilor de traversare a directorului pentru a descarca fisiere sensibile.
Resurse:
- Ghid de securitate Ruby on Rails – Incarcari si descarcari de fisiere
Falsificare de cereri intre site-uri (CSRF)
- Aplica protectia CSRF setand protect_from_forgery cu:: exceptie in toate controlerele utilizate de vizualizarile web sau in ApplicationController.
- Utilizati verbele HTTP intr-un mod RESTful. Nu utilizati cereri GET pentru a modifica starea resurselor. Atenueaza atacurile CSRF.
- Pana la Rails 4, a existat un singur simbol CSRF pentru toate formele, actiunile si metodele. Rails 5 implementeaza jetoane CSRF per forma, care sunt valabile numai pentru un singur formular si actiune / metoda. Activati-l setand config.action_controller.per_form_csrf_tokens = true.
Resurse:
- Ghid de securitate Ruby on Rails – CSRF
- Big Binary Blog – Fiecare formular primeste propriul simbol CSRF in Rails 5
Partajarea resurselor pe mai multe origini (CORS)
- Ocazional apare nevoia de a partaja unele resurse pe mai multe domenii. De exemplu, doriti sa incarcati un fisier utilizand cererea AJAX si sa il trimiteti la cealalta aplicatie. Partea destinatara ar trebui sa specifice o lista alba de domenii carora li se permite sa faca aceste cereri. Exista putine antete HTTP care controleaza acest lucru.
Puteti utiliza rack-cors gem si in config / application.rb specificati configuratia dvs. (esantion de cod).
Resurse:
- Solutii pentru probleme de securitate in RoR
Expunere la date sensibile
- Daca este posibil, evitati stocarea datelor sensibile, cum ar fi cardurile de credit, ID-urile fiscale si acreditarile de autentificare ale tertilor in aplicatia dvs. Daca nu este posibil, asigurati-va ca toate datele sensibile sunt criptate in repaus (in DB) si in tranzit (utilizati HTTPS peste TLS). Atenuati furtul / scurgerea datelor sensibile.
- Nu inregistrati date sensibile precum parole si numere de card de credit. Puteti include parametri care contin date sensibile in config.filter_parameters la initializatoare / filter_parameter_logging.rb. Pentru o securitate suplimentara, luati in considerare transformarea filter_parameters intr-o lista alba. A se vedea exemplul de cod. Previne stocarea textului simplu a datelor sensibile in fisierele jurnal.
- Comentariile HTML sunt vizibile pentru clienti si nu trebuie sa contina detalii care pot fi utile atacatorilor. Luati in considerare utilizarea comentariilor de la server, cum ar fi <% # Aceasta sintaxa a comentariilor cu ERB%> in loc de comentarii HTML. Evita expunerea detaliilor de implementare.
- Evitati expunerea ID-urilor de inregistrare numerice / secventiale in adrese URL, din sursa HTML si API-uri. Luati in considerare utilizarea slug-urilor (ID-uri prietenoase AKA, URL-uri vanity) pentru a identifica inregistrari in loc de ID-uri numerice, asa cum este implementat de bijuteria friendly_id. Avantajele suplimentare includ SEO si adrese URL mai bine aratate. Atenueaza atacurile fortate de navigare si expunerea valorilor despre afacerea dvs., cum ar fi numarul de utilizatori inregistrati, numarul de produse pe stoc sau numarul de chitante / achizitii.
- Daca utilizati slug-uri in loc de ID-uri numerice pentru URL-uri, luati in considerare returnarea unui cod de stare 404 Not Found in loc de 403 Interzis pentru erori de autorizare. Previne scurgerea valorilor atributelor utilizate pentru a genera slugs. De exemplu, vizitarea www.myapp.com/users/john-doe si obtinerea unei stari de returnare 403 indica faptul ca aplicatia are un utilizator numit John Doe. *
- Nu setati config.consider_all_requests_local = true in mediul de productie. Daca trebuie sa setati config.consider_all_requests_local = true pentru a utiliza bijuteria better_errors, faceti-o pe config / settings / development.rb. Previne scurgerea exceptiilor si a altor informatii care ar trebui sa fie accesibile doar dezvoltatorilor.
- Nu instalati nestemate legate de dezvoltare / test, cum ar fi better_errors si web-console in mediul de productie. Plasati-le intr-un grup: dezvoltare,: testati blocul in Fisierul Gem. Previne scurgerea exceptiilor si chiar accesul REPL daca se utilizeaza better_errors + web-console.
Acreditari
- Cheia de criptare, situata pe config / master.key, este creata atunci cand rulati rails noi. De asemenea, este adaugat la .gitignore, astfel incat sa nu se angajeze in depozitul dvs. Atenueaza scurgerile / furtul de acreditari.
- Nu editati direct fisierul config / credentials.yml.enc. Pentru a adauga acreditari, rulati acreditarile bin / rails: editati. Utilizati un format plat, ceea ce inseamna ca nu mai trebuie sa puneti dezvoltarea sau productia. Atenueaza scurgerile / furtul de acreditari.
- Daca doriti sa generati o noua baza de cheie secreta, bin / rails secret si adaugati-o la acreditari executand acreditarile bin / rails: editati.
- Incarcati master.key in siguranta. Puteti scp sau sftp fisierul. Incarcati cheia intr-un director partajat. Partajat aici inseamna partajat intre versiuni, nu un sistem de fisiere partajat. La fiecare implementare, conectati simbolul config / master.key la /path/to/shared/config/master.key.
- Daca trebuie sa oferiti unui dezvoltator o copie a cheii, nu o trimiteti niciodata prin e-mail (cu exceptia cazului in care utilizati e-mailuri criptate, pe care majoritatea dintre noi nu le folosim!) Puteti utiliza un manager de parole, deoarece utilizeaza criptarea.
- Puneti cheia pe variabila de mediu RAILS_MASTER_KEY. In unele cazuri in care nu puteti incarca un fisier, aceasta este singura optiune. Chiar daca acest lucru este convenabil, asigurati-va ca cunoasteti riscurile utilizarii variabilelor de mediu. Riscurile pot fi atenuate, dar daca puteti incarca master.key, utilizati aceasta optiune.
Resurse:
- Acreditari criptate pe sine pe sine 5.2
Rutare, selectare sablon si redirectionare
- Nu efectuati redirectionarea URL pe baza sirurilor introduse de utilizator. Cu alte cuvinte, nu treceti datele introduse de utilizator catre redirect_to. Daca nu aveti de ales, creati o lista alba de adrese URL de redirectionare acceptabile sau limitati la redirectionarea numai catre cai din domeniul dvs. (exemplu de cod). Reduce redirectionarea catre site-uri de phishing si malware. Impiedicati atacatorii sa ofere victime adrese URL, cum ar fi http://www.my-legit-rails-app.com/redirect?to=www.dangeroussite.com.
- Nu utilizati un sir introdus de utilizator pentru a determina numele sablonului sau vizualizarii de redat. Impiedica atacatorii sa redea vizualizari arbitrare, cum ar fi paginile numai pentru administratori.
- Evitati rutele „catch-all”, cum ar fi match ‘: controller (/: action (/: id (.: Format)))’ si faceti metode de control non-action private. Atenueaza accesul neintentionat la metodele controlerului.
Resurse:
- OWASP Ruby on Rails Cheatsheet – Redirectionari si redirectionari (validare URL)
Software terta parte
- Aplicati frecvent cele mai recente patch-uri de securitate in sistemul de operare. Acordati o atentie speciala serviciilor orientate spre internet, cum ar fi serverele de aplicatii (Passenger, Puma, Unicorn), serverele web (Nginx, Apache, Passenger Standalone) si serverele SSH.
- Actualizati frecvent Ruby.
- Fereste-te de vulnerabilitatile de securitate din pietrele tale. Rulati frecvent bundler-audit sau utilizati un serviciu precum Snyk, GuardRails (ambele gratuite pentru dezvoltare open-source).
Instrumente de securitate
- Rulati Brakeman inainte de fiecare desfasurare. Daca utilizati un instrument automat de revizuire a codului, cum ar fi Code Climate, activati motorul Brakeman.
- Adaugarea unei politici de incredere in bijuterii cu MediumSecurity este o modalitate buna de a opri instalarea pietrelor periculoase pe server. De exemplu, pachetul –trust-policy MediumSecurity.
- Puteti utiliza rubocop gem si permite reguli legate de securitate in fisierul de configurare .rubocop.yml.
- Luati in considerare utilizarea unui serviciu de securitate continuu, cum ar fi Detectify.
- Luati in considerare utilizarea unui Firewall pentru aplicatii web (WAF), cum ar fi NAXSI pentru Nginx, ModSecurity pentru Apache si Nginx. Atenueaza atacurile XSS, SQL Injection, DoS si multe alte atacuri.
Resurse:
- Pastrarea aplicatiei Rails in siguranta
- Cum va poate asigura RuboCop aplicatiile dvs. Ruby si Rails
Testarea
- Includeti teste de securitate in suita de teste. Uitati-va la aplicatia RailsGoat a OWASP pentru exemple de specificatii Capybara legate de securitate. Creste gradul de constientizare suplimentar al securitatii si atenueaza regresiunile legate de securitate.
- Creati teste de securitate in perechi: unul pentru scenariul de acces refuzat si altul pentru scenariul de acces acordat.
- Atunci cand utilizati TDD, luati in considerare implementarea autentificarii in primele etape ale dezvoltarii, deoarece tinde sa intrerupa mai multe teste preexistente.
Altii
- Folositi parametri puternici in controlere. Acesta este comportamentul implicit de la Rails 4+. Atenueaza atacurile de alocare in masa, cum ar fi suprascrierea atributului de rol al modelului utilizator in scopuri de escaladare a privilegiilor.
- Implementati Captcha sau Captcha negativ pe formularele expuse public. reCAPTCHA este o optiune excelenta si exista o bijuterie care faciliteaza integrarea Rails. Alte optiuni sunt pietrele rucaptcha si negative-captcha. Atenueaza SPAM-ul automat (spamboti).
Detalii si mostre de cod
Exemplu de injectie comanda
Daca vedeti un apel la eval trebuie sa fiti foarte siguri ca il igienizati corect. Folosirea expresiilor regulate este o modalitate buna de a realiza acest lucru.
Validare parola regex
Putem implementa validarea puterii parolei in Devise adaugand urmatorul cod la modelul de utilizator.
Pundit: asigurati-va ca toate actiunile sunt autorizate
Adaugati urmatoarele la app / controllers / application_controller.rb
Adaugati urmatoarele la controlere care nu necesita autorizare. Puteti crea o preocupare in scopuri DRY.
Pundit: afiseaza numai inregistrarile corespunzatoare in casetele selectate
Ganditi-va la un site de stiri asemanator unui blog in care utilizatorii cu rol de editor au acces la anumite categorii de stiri, iar utilizatorii de administratori au acces la toate categoriile. Utilizatorul si modelele Categorie au o relatie HMT. Cand creati o postare pe blog, exista o caseta de selectare pentru alegerea unei categorii. Vrem ca editorii sa isi vada categoriile asociate numai in caseta de selectare, dar administratorii trebuie sa vada toate categoriile. Am putea completa caseta de selectare cu user.categories. Cu toate acestea, ar trebui sa asociem toti utilizatorii administratori cu toate categoriile (si sa actualizam aceste asociatii de fiecare data cand se creeaza o noua categorie). O abordare mai buna este utilizarea Pundit Scopes pentru a determina ce categorii sunt vizibile fiecarui rol de utilizator si a utiliza metoda policy_scope atunci cand populeaza caseta de selectare.
Convertiti filter_parameters intr-o lista alba
Dezvoltatorii pot uita sa adauge unul sau mai multi parametri care contin date sensibile la filter_parameters. Listele albe sunt de obicei mai sigure decat listele negre, deoarece nu genereaza vulnerabilitati de securitate in caz de uitare a dezvoltatorului. Urmatorul cod converteste filter_parameters intr-o lista alba.
configurare rack-cors
Cereri de strangulare
In unele pagini, cum ar fi pagina de conectare, veti dori sa va strangeti utilizatorii la cateva cereri pe minut. Acest lucru impiedica robotii sa incerce rapid mii de parole.
Rack Attack este un middleware Rack care ofera restrictii printre alte caracteristici.
Cand cheia I18n se termina cu _html
In loc de urmatorul exemplu:
Utilizati urmatorul:
HAML: protectie XSS
In mod implicit,
compileaza pentru:
Autori
- Bruno Facca – LinkedIn – E-mail: Bruno la Facca dot info
Contribuind
Contributiile sunt binevenite. Daca doriti sa corectati o eroare sau sa adaugati elemente noi la lista de verificare, nu ezitati sa creati o problema urmata de un PR. Consultati sectiunea TODO pentru sugestii de contributie.
Daca sunteti interesat sa contribuiti in mod regulat, trimiteti-mi o linie la adresa de e-mail de mai sus pentru a deveni colaborator.
A FACE
- Adaugati probe de proba (RSpec si / sau Minitest) pentru a detecta prezenta vulnerabilitatilor. Pentru inspiratie, consultati specificatiile Capybara legate de securitate RailsGoat ale OWASP.
- Comparati pietre pretioase de incarcare cu privire la implementarea elementelor incarcate de fisiere din aceasta lista de verificare (creati un tabel).
- Comparati pietrele de autentificare cu privire la implementarea articolelor de autentificare ale acestei liste de verificare (construiti un tabel).
Referinte si lecturi suplimentare
- Ghid de securitate Ruby on Rails
- The Rails 4 Way de Obie Fernandez, Capitolul 15
- OWASP Top Ten
- SitePoint: Capcane de securitate ale sinelor comune si solutiile lor
- Rails Security Audit de Hardhat
- Lista de verificare a securitatii sinelor de Eliot Sykes
- Lista de verificare a elementelor de securitate Ruby on Rails
- Cele mai bune practici de securitate a sinelor
- Resurse minunate de securitate Ruby
- Securitate minunata a sinelor
- Securizarea datelor sensibile in sine
Licenta
Eliberat sub licenta MIT.








