Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Skapa regexp för tillåtna filnamn #24

Closed
jesjos opened this issue Feb 17, 2012 · 15 comments
Closed

Skapa regexp för tillåtna filnamn #24

jesjos opened this issue Feb 17, 2012 · 15 comments
Milestone

Comments

@jesjos
Copy link
Member

jesjos commented Feb 17, 2012

Av säkerhetsskäl bör vi inte tillåta vilka filnamn som helst vid filuppladdning. Dock vill man så långt som möjligt undvika att döpa om användarens filer. Finns det någon schysst standard man kan följa?

@oleander
Copy link
Member

Syftar du inte på filtyp? Det ska väll inte finnas någon begränsning på filnamnet?

@jesjos
Copy link
Member Author

jesjos commented Feb 17, 2012

Nej jag menar filnamn. Filnamn som innehåller snedstreck kan t.ex feltolkas som sökvägar. Det är kutym att köra någon form av filename sanitizer som byter ut farliga tecken mot typ underscore på uppladdade filer, men de som jag hittade snabbt var för restriktiva. Läge att kolla upp teorier om hur en sådan behöver fungera.

@oleander
Copy link
Member

Kan vi inte bara escape:a namnet?

require "cgi"
file_name = "/a/b/c"
CGI.escape(file_name)
# => "%2Fa%2Fb%2Fc"

@jesjos
Copy link
Member Author

jesjos commented Feb 18, 2012

Inte helt optimalt

CGI.escape("åäö.pdf")
# => "%C3%A5%C3%A4%C3%B6.pdf" 

@oleander
Copy link
Member

Kan inte riktigt se varför de där skulle vara ett problem, användaren ser ju inte den escapade versionen i vilket fall.

Så här kommer de fungera internt.

  • En rå blob av data sparas ner till /tmp/gt/237bde52
  • Följande värde skickas till mig i backenden {from: "/tmp/gt/237bde52", to: "random/dir/%C3%A5%C3%A4%C3%B6.pdf"}
  • Jag commitar en fil vid namn CGI.unescape("random/dir/%C3%A5%C3%A4%C3%B6.pdf") i object[:branch]-branchen.
  • git ls-files listar sedan alla filer i repon, oavsett filnamn.

Intern kan filnamnen innehålla precis vad som helst, där bland mellanslag och slash.

@jesjos
Copy link
Member Author

jesjos commented Feb 18, 2012

Jag vet inte vad som händer exakt när du commitar filen med det unescapade namnet, men jag tänker att vi riskerar att råka ut för liknande situationer som den som beskrivs här: http://guides.rubyonrails.org/security.html#file-uploads

@oleander
Copy link
Member

Jag tror att det är viktigt att påpeka att det är git som sätter namnet på filen i filsystemet, inte vi.

Blob:en med data /tmp/gt/237bde52 kommer namnges internt i git med avseende på längd, tidigare commits, klockslag os.v, för att sedan köras genom en SHA1-metod.
Filnamnet sparas sedan undan som en referens vid sidan av filen.

Vi kommer därför aldrig läsa direkt från filsystemet. Istället läser vi filerna genom git.

Kolla gärna på föreläsningen av Scott Chacon som jag skickade för ett tag sedan. Han förklarar hur git hanterar filer internt.
Alternativt så finns GitPro skrivet av samma person, om du föredrar att läsa.

Slutligen så kan de vara värt att nämna att alla repos i GT är s.k bare-repos (kommer inte på något bättre namn på svenska).

Kör du -a .git/objects | head -n 10 på en godtycklig repo för exempel-filer.

@Tarrasch
Copy link
Contributor

Jag tycker det låter extremt overkill att försöka escapea filnamn. Tillåt inte filnamn som innehåller åäö/\+* etc.?

Kan inte vara så jobbigt för användaren att själv ändra filnamnet. Dessutom kör vi med git för att få användaren att följa goda vanor, då bör vi ju inte uppmuntra till filnamn som alltid ställer till det. Hur ser ni på saken?

@oleander
Copy link
Member

Hehe, kunde lika gärna skickat min kommentar till /dev/null :trollface:

@jesjos
Copy link
Member Author

jesjos commented Feb 18, 2012

Vi sätter alltså stop för dylika filer redan i klienten. Agreed?

@oleander
Copy link
Member

Jag har tagit ett snack IRL med Arash. Vi kan ta samtalet på tisdag, om det passar.
Kort och gott så behöver vi ingen begränsning av samma anledning jag tog upp i min förra post.

@oleander
Copy link
Member

De enda begräsningarna jag kan komma på atm är de som finns i unix i sig.
Te.x "/". I OS X fungerar inte ":" i mappnamn – de kan vara något att kolla upp.

@oleander
Copy link
Member

Hittade den här artikeln hos MS ang namnkonventioner.

  • The following reserved characters
    • < (less than)
    • (greater than)

    • : (colon)
    • " (double quote)
    • / (forward slash)
    • \ (backslash)
    • | (vertical bar or pipe)
    • ? (question mark)
    • * (asterisk)
    • \0

Alla tecken utom : fungerar dock i OS X.

@oleander
Copy link
Member

oleander commented Mar 2, 2012

Tänk även på att en mapp och en fil inte kan ha samma namn.

Inte okej:

/path/file1
/path # <= A file

@spontus
Copy link
Member

spontus commented Mar 22, 2012

regexen kollar nu allt som är med på den listan förutom /
Detta för att den inte får in ett filnamn utan en path som eventuellt kan innehålla en mapp eller två

OT:
skapade precis en fil som heter:
<>:"|?*
i linux :p

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants