Forumdelen sponsras av

path frågor c# || tilllåt under mappar och filer men ej föräldrar mappar.

Trädvy Permalänk
Medlem
Registrerad
Sep 2009

path frågor c# || tilllåt under mappar och filer men ej föräldrar mappar.

Hejsan Swec.

I programmet ska en användare kunna läsa filer på en server. Men jag vill begränsa användaren så den kan bara läsa filer i current directory eller sub directory. Dock ska användaren inte få läsa filer som ligger utanför current directory. Hitintills har jag inte hitta nå bra sätt att göra detta på. Det ända jag har kommit fram till är att försöka parsa bort alla directory "tecken" från stringen men det känns så om ständigt måste finnas nå bättre tänker jag.

Har någon nåt förslag?

Tack för svar!b

Смерть -это решение всех проблем. Нет человека - нет проблемы
Comp1: Ubuntu 16.04 Comp2: Arch Linux
Comp3: Ubuntu Server 16.04 Comp4: Centos 6.5
Comp5: Linux mint 16 Comp6: Raspberry pi (olika OS hela tiden)
Phone: Motorola Google Nexus 6

Trädvy Permalänk
Medlem
Registrerad
Sep 2009

Path.Combine var ju intressant också. Example:

string path = Directory.GetCurrentDirectory(); string userSetPath = "c:\Windows\System32\ftp.exe"; string openPath = Path.Combine(path, userSetPath); // result openPath="c:\Windows\System32\ftp.exe"

Annat är ju:

string path = Directory.GetCurrentDirectory(); // let's say c:\User\projektUser\project\Folder string userSetPath = "..\..\..\Path\outside\parent\file.txt"; string openPath = Path.Combine(path, userSetPath); // result openPath="c:\User\Path\outside\parent\file.txt"

Смерть -это решение всех проблем. Нет человека - нет проблемы
Comp1: Ubuntu 16.04 Comp2: Arch Linux
Comp3: Ubuntu Server 16.04 Comp4: Centos 6.5
Comp5: Linux mint 16 Comp6: Raspberry pi (olika OS hela tiden)
Phone: Motorola Google Nexus 6

Trädvy Permalänk
Medlem
Plats
Falun
Registrerad
Dec 2003
Skrivet av asdfgh:

Hejsan Swec.

I programmet ska en användare kunna läsa filer på en server. Men jag vill begränsa användaren så den kan bara läsa filer i current directory eller sub directory. Dock ska användaren inte få läsa filer som ligger utanför current directory. Hitintills har jag inte hitta nå bra sätt att göra detta på. Det ända jag har kommit fram till är att försöka parsa bort alla directory "tecken" från stringen men det känns så om ständigt måste finnas nå bättre tänker jag.

Har någon nåt förslag?

Tack för svar!b

Säg att Current Directory för användaren är "/home/users/test/" då kan du tillåta allt bara pathen börjar med Current Directory.
Test:
/home/users/test2/ = fail
/var/log/ = fail
/home/users/test/games/ = success
/home/users/test/games/platform/ = success
/home/users/tester44/games/ = fail

Lösningen jag föreslår nu är alltså att om du vet vad Current Directory är så ser du till att Önskad Path måste börja med Current Directory. Viktigt är att man måste ha med ett sista slash så att man inte kan gå runt maskineriet genom att ha användarnamn som har några extra tecken.

Exempel:

public bool isPathCurrentDirOrSubDir(string newUserPath) { var currentPath = Settings.User.CurrentPath; // "/home/users/test/"; var newPath = cleanUpPath(newUserPath); if (newPath.BeginsWith(currentPath)) { return true; } else { return false; } }

ηλί, ηλί, λαμά σαβαχθανί!?

Trädvy Permalänk
Hedersmedlem
Plats
Linköping
Registrerad
Okt 2006
Skrivet av Leedow:

Säg att Current Directory för användaren är "/home/users/test/" då kan du tillåta allt bara pathen börjar med Current Directory.
Test:
/home/users/test2/ = fail
/var/log/ = fail
/home/users/test/games/ = success
/home/users/test/games/platform/ = success
/home/users/tester44/games/ = fail

Lösningen jag föreslår nu är alltså att om du vet vad Current Directory är så ser du till att Önskad Path måste börja med Current Directory. Viktigt är att man måste ha med ett sista slash så att man inte kan gå runt maskineriet genom att ha användarnamn som har några extra tecken.

Exempel:

public bool isPathCurrentDirOrSubDir(string newUserPath) { var currentPath = Settings.User.CurrentPath; // "/home/users/test/"; var newPath = cleanUpPath(newUserPath); if (newPath.BeginsWith(currentPath)) { return true; } else { return false; } }

Har inte följt tråden eller riktigt satt mig in i ditt förslag. Men något ni måste ha koll på är inte bara att kolla en första bit av sökvägen. För även om den börjar på /home/user/test/ så finns det ingen säkerhet eftersom den kan fortsätta med /home/user/test/../../../found_your_root

Trädvy Permalänk
Medlem
Plats
Falun
Registrerad
Dec 2003
Skrivet av Shimonu:

Har inte följt tråden eller riktigt satt mig in i ditt förslag. Men något ni måste ha koll på är inte bara att kolla en första bit av sökvägen. För även om den börjar på /home/user/test/ så finns det ingen säkerhet eftersom den kan fortsätta med /home/user/test/../../../found_your_root

Om man kontrollerar absolut path så borde inte det där vara ett problem. Med det så menar jag att man i C# slår upp Directory(path) och sedan kontrollerar om Directory existerar och om dess nya path är baserad på current path. Även om "..", symlinks eller andra genvägar skulle användas så evaluerar Directory det till en korrekt path när man väl har sitt Directory-objekt.

Men visst, man måste hålla koll på det!

ηλί, ηλί, λαμά σαβαχθανί!?

Trädvy Permalänk
Medlem
Registrerad
Sep 2009

så det @Leedow menar är då:

public bool isPathCurrentDirOrSubDir(string newUserPath) { var currentPath = Settings.User.CurrentPath; // "/home/users/test/"; var newPath = cleanUpPath(newUserPath); if (newPath.BeginsWith(currentPath)) { return true; } else { return false; } } public void test(){ string curent = Directory.GetCurrentDirectory(); string usrPath = getUserPath(); string path = Path.combine(current, usrPath); if(!isPathCurrentDirOrSubDir(Path.GetFullPath(path)){ return; } // do stuff }

Ja, det känns som att det borde fungera för då. Då om jag inte missar nåt så ska getfullpath ta t,ex c:/path/to/current/../../Other/ =>c:/path/ other.

Klockrent tackar!

Смерть -это решение всех проблем. Нет человека - нет проблемы
Comp1: Ubuntu 16.04 Comp2: Arch Linux
Comp3: Ubuntu Server 16.04 Comp4: Centos 6.5
Comp5: Linux mint 16 Comp6: Raspberry pi (olika OS hela tiden)
Phone: Motorola Google Nexus 6

Trädvy Permalänk
Medlem
Registrerad
Sep 2009

En vidare fråga på detta är, Finns det nåt lämpligt exception att kasta då de skrivit in en "icke godkänd" path?

Tack för svar!

Смерть -это решение всех проблем. Нет человека - нет проблемы
Comp1: Ubuntu 16.04 Comp2: Arch Linux
Comp3: Ubuntu Server 16.04 Comp4: Centos 6.5
Comp5: Linux mint 16 Comp6: Raspberry pi (olika OS hela tiden)
Phone: Motorola Google Nexus 6

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Aug 2011
Skrivet av asdfgh:

En vidare fråga på detta är, Finns det nåt lämpligt exception att kasta då de skrivit in en "icke godkänd" path?

Du kan kasta ett DirectoryNotFoundException eller AccessDeniedException