Разрешения за достъп по време на споделяне на файлове с Android

Защо е достатъчно да openFileOutput() файл с режим MODE_WORLD_READABLE (както ръководството казва), за да направите файл четим от други приложения (чрез намерение за споделяне)?

Дори ако файлът е четим, директорията не остава ли лична (rwx------ вместо rwxrwxrwx)?


person Calaf    schedule 24.09.2013    source източник
comment
Полезна информация: stackoverflow.com/questions/10957679/   -  person PurkkaKoodari    schedule 24.09.2013


Отговори (2)


Дори ако файлът е четим, директорията не остава ли частна (rwx------ вместо rwxrwxrwx)?

Наличието на директорията като deny-all ще попречи на трети страни да изброяват съдържанието на директорията или да създават нови файлове там. Това не оказва влияние върху възможността за четене на файл, даден напълно квалифициран път до този файл.

Като се има предвид това, моля, не използвайте MODE_WORLD_READABLE. Използвайте FileProvider вместо това, за да имате по-фин контрол върху това кой има достъп до това съдържание. По този начин, например, можете да направите файла напълно недостъпен освен за конкретна операция за споделяне.

person CommonsWare    schedule 24.09.2013
comment
Бих искал да потвърдя, че ви разбирам. Имах предвид втората опция (Записване на данните във файл във вашата собствена директория на приложението) на developer.android.com/training/sharing/ . Но вместо това предполагате, че петото решение (Съхранявайте данните във вашия собствен ContentProvider) е по-добро. Ако въпросният файл е просто експортиран файл и ще бъде изтрит след завършване на споделянето, бихте ли предположили, че петото решение е по-добро от (по-простото) второ? - person Calaf; 24.09.2013
comment
@Calaf: Ако въпросният файл е само експортиран файл и той ще бъде изтрит след завършване на споделянето, все пак бихте ли предположили, че петото решение е по-добро от (по-простото) второ? -- имайте предвид, че нямате представа кога споделянето ще завърши. Може да отнеме секунди; може да отнеме дни. Вие просто не сте информирани дали потребителят го е споделил или не или кога ще стане споделянето. Ще трябва да съхранявате файла за разумен период, който вашите потребители смятат за разумен период от време, който може да е по-дълъг, отколкото си мислите. - person CommonsWare; 24.09.2013
comment
@Calaf: Бих използвал FileProvider над MODE_WORLD_READABLE независимо от това, но стойността на допълнителната сигурност се покачва с всяка милисекунда, в която файлът е достъпен за зложелатели. - person CommonsWare; 24.09.2013

Мисля, че ръчният цитат е неправилен. Файловете във вътрешната памет не могат да се четат от други приложения, независимо от техния режим. Объркването, което изпитвате, не е необичайно, поради което приложенията трябва да използват FileProvider, за да предлагат файлове на други приложения.

Това е въпрос на сигурност: разрешенията на файловата система не защитават адекватно данните. За да предложите файл на друго приложение чрез разрешения за файлове, трябва да зададете еквивалента на chmod a+r (най-малко). Това дава достъп за четене до всяко друго приложение, което е покана към всеки Том, Дик или Хари да започнат да сърбат вашите файлове. Освен това промяната на достъпа е постоянна, освен ако не си спомните да я промените обратно.

За сравнение, използването на разрешения за URI с FileProvider предлага само временен достъп за четене и само до конкретното приложение, което го е поискало. Можете да настроите приложението си така, че да предоставяте достъп само ако потребителят дойде в приложението ви, за да поиска файла; поне тогава потребителят знае както приложението, което е поискало файла, така и приложението, което го е имало.

person Joe Malin    schedule 24.09.2013
comment
Файловете във вътрешната памет не могат да се четат от други приложения, независимо от техния режим. Виждам, че MODE_WORLD_READABLE е остарял, но не го изпълнява (колкото и да не е кошерно) означава ли точно, че е имплементиран чрез chmod a+r? Ако наистина директорията остане chmod a+x (stackoverflow.com/a/14257260/704972 цитирано от Pietu1998 по-горе)—в с други думи, файловете вътре могат да бъдат достъпни само ако името им е известно - тогава никой от Том, Дик или Хари няма достъп, освен ако първо не открие името на файла. И дори тогава те могат да го прочетат, но не и да презапишат. - person Calaf; 24.09.2013
comment
Файловете във вътрешната памет не могат да се четат от други приложения, независимо от техния режим. Невярно поне за по-голямата част от текущата инсталирана база. За да предложите файл на друго приложение чрез разрешения за файлове, трябва да зададете еквивалента на chmod a+r, точно това прави настройката на режима. - person Chris Stratton; 24.09.2013
comment
@Calaf - по принцип си прав, но да приемем, че никой не може да познае името на файла, е рисковано. По-специално, приложение, което дори ще се опита да получи достъп и да използва нещо, може да е конкретно насочено към файловете с данни на дадено приложение и по този начин е написано, използвайки знания, получени чрез декомпилиране/изучаване на целевото приложение. - person Chris Stratton; 24.09.2013