c ++ - Opret en sikker, undslippet sti base/fil navn, tjek om sikker

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg spekulerer på, om der er en generisk måde at producere filsystem sikre filnavne, der er bærbare. Det vil sige, jeg har en bruger indtastet streng og vil gerne producere en fil med et navn, der ligner det navn, de har valgt. Det resulterende navn må ikke indeholde nogen henvisning eller et andet specielt filsystems specielle navn eller tag.


I øjeblikket erstatter jeg bare en masse kendte dårlige tegn med andre tegn eller tomme strenge. For eksempel, med navnet ABC / DEF* : A Company? producerer jeg strengen ABC - DEF - A Company. Mit valg til erstatningskarakterer er helt vilkårlig, som jeg ikke kender til et generisk flugtsymbol.


Så mine beslægtede spørgsmål er:



  1. Er der en metode (måske i boost filsystem), der kan fortælle mig, om navnet refererer strengt til en fil uden en sti?

  2. Er der en funktion, der fortæller mig, om navnet er 'sikkert' at bruge som en fil (dette kan være en ekstra check fra 1 for nogle filsystemer)?

  3. Er der en funktion til at konvertere en streng til et rimeligt sikkert navn?






Addtional Notes


Til # 1 tænkte jeg bare at sammenligne en boost path :: filnavn () til det oprindelige objekt, hvis de er de samme, så har jeg en fil. Men det tillader stadig ting som '..' og '.' Men det kan være okay, hvis der er en god løsning til # 2


I teorien skal jeg give en mappe, hvor filen vil opholde sig, da forskellige filsystemer kan have forskellige krav. Men en global løsning til operativsystemet ville også være okay.


Jeg har allerede en funktion, der bare erstatter en masse almindeligt kendte usikre tegn.


Fælles fildialoger kan ikke bruges til at filtrere, da grænsefladen måske ikke altid tillader dem, og i nogle tilfælde er brugeren ikke direkte opmærksom på forholdet til filen (avancerede brugere vil dog).

Bedste reference


Ifølge POSIX fuldt bærbare filnavne er de eneste bærbare filnavne dem, der kun indeholder A–Za–z0–9.\_- og er maks 14 tegn lange. [11]


Når det er sagt, er en mere praktisk tilgang at antage, at moderne filsystemer kan klare længere filnavne og blot erstatte alle tegn, der ikke udtrykkeligt er markeret som 'sikre' med \_. Sommetider, i stedet for at erstatte med \_, er disse tegn hexekodede, ligesom i webadresser: sample\%20file.txt. KDE-programmer bruger f.eks. Dette. [12]


Med hensyn til implementering er det så enkelt som s/[^A-Za-z0-9.-]/\_/.

Andre referencer 1


Hvor bærbar er bærbar? Mange systemer havde grænser for længden og nogle
sandsynligvis stadig gøre. Er disinguishing mellem navne et problem? Nogle
systemer skelner sag, og andre don t. Hvad med en endelig .xxx?
For nogle systemer er det signifikant, for andre er det bare tekst.


Forsigtig længde er det sikreste bet at tage den modsatte tilgang:
Opret et sæt kendte sikre tegn, og konverter alt uden for
det til en bestemt karakter. ASCII alfanumerik, og '\_' synes
ret sikkert, og du er nok OK (i dag) med '-', men jeg tvivler på
listen går meget længere. Og afhængigt af hvad du gør med disse
Navne, du vil måske tvinge dem til en enkelt sag, enten øverst eller
nederste.