[C++] Regular expressions

Pagina: 1
Acties:

  • Slagroom
  • Registratie: Juni 2001
  • Laatst online: 23-08 10:29
Hallo,

Ik ben een best gevaarlijk programmatje aan het maken en ik wil er een soort van controle in zetten. Het programma geeft mensen rechten om directories te verwijderen wat je normaal alleen als root mocht. Maar nu wil ik niet dat ze een directorie lager iets kunnen verwijderen. Hoe kan ik dus controleren dat een string niet begint met .. of ./? Moet dit uberhaubt wel eens met regular expressions?

Ik heb nu dit:

C++:
1
2
3
4
5
6
if(!strncmp("..", argv[2], strlen("..")) || !strncmp("./", argv[2], strlen("./"))) {
    sprintf(commando, "/bin/rm -rf /home/httpd/vhosts/%s/httpdocs/%s", argv[2], argv[3]);
    return system(commando);
} else {
    return 0;
}

  • whoami
  • Registratie: December 2000
  • Laatst online: 22:13
Je kan het doen met RegExen, maar als je enkel de eerste 2 karakters moet kontroleren, kan je het toch evengoed doen zoals je het nu doet.

https://fgheysels.github.io/


  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

Slagroom schreef op 23 January 2003 @ 11:40:
Hallo,

Ik ben een best gevaarlijk programmatje aan het maken en ik wil er een soort van controle in zetten. Het programma geeft mensen rechten om directories te verwijderen wat je normaal alleen als root mocht. Maar nu wil ik niet dat ze een directorie lager iets kunnen verwijderen. Hoe kan ik dus controleren dat een string niet begint met .. of ./? Moet dit uberhaubt wel eens met regular expressions?

Ik heb nu dit:

C++:
1
2
3
4
5
6
if(!strncmp("..", argv[2], strlen("..")) || !strncmp("./", argv[2], strlen("./"))) {
    sprintf(commando, "/bin/rm -rf /home/httpd/vhosts/%s/httpdocs/%s", argv[2], argv[3]);
    return system(commando);
} else {
    return 0;
}
Zoals je zelf al zegt is dit een heel gevaarlijk programma helemaal omdat het door meerdere mensen gaat gebruikt worden?

Kan je niet beter een systeem maken dat je eerst de absolute directory bepaald? En dan testen dat de locatie minimaal /home/httpd/vhosts/<IETS>/httpdocs is ?

Hoe je dat moet doen kan ik je helaas niet aan helpen... :/ Maar er zijn vast mensen die dat wel weten.

Programmer - an organism that turns coffee into software.


  • Slagroom
  • Registratie: Juni 2001
  • Laatst online: 23-08 10:29
Klopt, ik heb dit er ook inzitten maar dan verder bovin in het programma.

Is er trouwens een manier om te kijken wie het programma uitvoert? Het programma is gezet met een s bit en de owner is root. Dan komt er zeker altijd root uit...

  • Slagroom
  • Registratie: Juni 2001
  • Laatst online: 23-08 10:29
Ik zag mijn fout:

C++:
1
2
3
4
5
6
if(strncmp("..", argv[1], strlen("..")) == 0 || strncmp("./", argv[1], strlen("./")) == 0){ 
    return 0; 
} else { 
    sprintf(commando, "/bin/rm -rf /home/httpd/vhosts/%s/httpdocs/%s", argv[2], argv[3]); 
    return system(commando); 
}


Hij moest dus andersom zijn

[ Voor 13% gewijzigd door Slagroom op 23-01-2003 12:33 . Reden: zo dus ]


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 21-08 17:14
Als je nou std::string gebruikt, dan kun je gewoon zeggen
code:
1
2
3
4
bool legal_path( string const& path )
{
  return path.substr(0,2)!=".." && path.substr(0,2)!="./";
}
PS. Moet de tweede check niet "begint met /" zijn?

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • Slagroom
  • Registratie: Juni 2001
  • Laatst online: 23-08 10:29
MSalters schreef op 23 January 2003 @ 16:56:
Als je nou std::string gebruikt, dan kun je gewoon zeggen
code:
1
2
3
4
bool legal_path( string const& path )
{
  return path.substr(0,2)!=".." && path.substr(0,2)!="./";
}
PS. Moet de tweede check niet "begint met /" zijn?
Zo kan het ook ja.

En nee, die tweede hoeft niet begint met / te zijn. Dan wordt er verwezen naar // en dat geeft een error

  • Reptile209
  • Registratie: Juni 2001
  • Laatst online: 21:23

Reptile209

- gers -

'k weet het niet zeker hoor, maar volgens mij kan je nu lachen als je als user invult:
"/bullpoep/../../.." ofzo. Dus niet alleen checken op /.. aan het begin, maar in de hele string!

Zo scherp als een voetbal!

Pagina: 1