A tesztelt Python-tárolók 3.6%-a tartalmazott hiányzó vesszőhibákat

Megjelent egy tanulmány eredményei, amely a Python kód vesszőhibákkal szembeni sebezhetőségét vizsgálta. A problémák abból a tényből fakadnak, hogy a Python automatikusan összefűzi a karakterláncokat egy listában, ha a felsorolások nincsenek vesszővel elválasztva, és az értékeket tuple-ként kezeli, ha vessző követi őket. Miután automatizált elemzést végeztek 666 Python kódot tartalmazó GitHub-repozitóriumon, a kutatók a vizsgált projektek 5%-ában azonosítottak potenciális vesszőproblémákat.

További manuális ellenőrzések során kiderült, hogy mindössze 24 adattár (3.6%) tartalmazott valódi hibákat, míg a fennmaradó 1.4% téves pozitív volt (például szándékosan kihagyhattak egy vesszőt a sorok között a fájlútvonalak, hosszú hashek, HTML blokkok vagy SQL utasítások összefűzéséhez). Figyelemre méltó, hogy a valódi hibákat tartalmazó 24 adattár olyan nagyobb projekteket is tartalmazott, mint a Tensorflow, a Google V8, a Sentry, a Pydata xarray, a rapidpro, a django-colorfield és a django-helpdesk. A vesszőproblémák azonban nem kifejezetten a Pythonra jellemzőek, és gyakran előfordulnak a C/C++ projektekben (a legutóbbi javítások közé tartozik az LLVM, a Mono és a Tensorflow).

A vizsgált főbb hibatípusok:

  • Egy véletlenül hiányzó vessző listákban, tuple-ökben és halmazokban a karakterláncok összefűzését okozza a különálló értékként való értelmezés helyett. Például a Sentryben az egyik tesztesetben hiányzott egy vessző a "releases" és a "discover" karakterláncok között egy listában, ami egy nem létező "/releasesdiscover" kezelő kereséséhez vezetett a "/releases" és a "/discover" külön ellenőrzése helyett.
    A tesztelt Python-tárolók 3.6%-a tartalmazott hiányzó vesszőhibákat

    Egy másik példa a rapidpro-ban hiányzó vessző, ami két különböző szabály 572. sorban történő egyesítéséhez vezetett:

    A tesztelt Python-tárolók 3.6%-a tartalmazott hiányzó vesszőhibákat
  • Egyetlen tuple-definíció végén lévő vessző hiánya a tuple helyett egy normál típushoz való hozzárendelést eredményezi. Például a "values ​​= (1,)" egyetlen tuple-t rendelne egy változóhoz, de a "values ​​= (1)" egy egész típusú értéket rendelne hozzá. Az ezekben az értékadásokban szereplő zárójelek nem befolyásolják a típusdefiníciót, és opcionálisak, a tuple jelenlétét pedig az elemző csak a vesszők jelenléte alapján határozza meg. REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': ( 'rest_framework.permissions.IsAuthenticated' # egy karakterlánc kerül hozzárendelésre tuple helyett. ) }
  • Az értékadás során a plusz vesszők fordított helyzetben vannak. Ha véletlenül vessző marad az értékadás végén, akkor egy tuple lesz értékként rendelve a szokásos típus helyett (például, ha az "érték = 1" értéke "érték = 1,"-ként van megadva).

Forrás: opennet.ru

Vásároljon megbízható tárhelyet DDoS védelemmel, VPS VDS szerverekkel rendelkező webhelyekhez 🔥 Vásároljon megbízható weboldal tárhelyet DDoS védelemmel, VPS VDS szerverekkel | ProHoster