136 ROZDZIAŁ 18. NAPISY Bezpiecznymi alternatywami do strcpy i strcat są też funkcje strlcpy oraz strlcat opra- cowana przez projekt OpenBSD i dostępna do ściągnięcia: strlcpy, strlcat. strlcpy() działa podobnie do strncpy: strlcpy (buf, argv[1], sizeof buf);, jednak jest szybsza (nie wy- pełnia pustego miejsca zerami) i zawsze kończy napis nullem (czego nie gwarantuje strncpy). strlcat(dst, src, size) działa natomiast jak strncat(dst, src, size-1). Do innych niebezpiecznych funkcji należy np. gets zamiast której należy używać fgets. Zawsze możemy też alokować napisy dynamicznie: #include #include #include int main(int argc, char **argv) { char haslo_poprawne = 0; char *haslo; if (argc!=2) { fprintf(stderr, "uzycie: %s haslo", argv[0]); return EXIT_FAILURE; } haslo = malloc(strlen(argv[1]) + 1); /* +1 dla znaku null */ if (!haslo) { fputs("Za malo pamieci.\n", stderr); return EXIT_FAILURE; } strcpy(haslo, argv[1]); if (!strcmp(haslo, "poprawne")) { haslo_poprawne = 1; } if (!haslo_poprawne) { fputs("Podales bledne haslo.\n", stderr); return EXIT_FAILURE; } puts("Witaj, wprowadziles poprawne haslo."); free(haslo) return EXIT_SUCCESS; } Nadużycia z udziaÅem ciÄ
gów formatujÄ
cych Jednak to nie koniec kÅopotów z napisami. Wielu programistów, nieÅwiadomych zagrożenia czÄsto używa tego typu konstrukcji: #include int main (int argc, char *argv[]) { printf (argv[1]); } Z punktu widzenia bezpieczeÅstwa jest to bardzo poważny bÅÄ
d programu, który może nieÅÄ ze sobÄ
katastrofalne skutki! PrawidÅowo napisany kod powinien wyglÄ
daÄ nastÄpujÄ
co:
... zobacz całą notatkę
Komentarze użytkowników (0)