Globocnik0 / Potniski-promet

MIT License
0 stars 0 forks source link

SQL injection #2

Open jaanos opened 2 years ago

jaanos commented 2 years ago

Vidim, da imata v iskanjePodatkov.py in simulacijaPodatkov.py nekaj nevarnih poizvedb, npr. https://github.com/Globocnik0/Potniski-promet/blob/3290a8c168e36470023a28243fade71267562138/iskanjePodatkov.py#L20-L25 Z vstavljanjem podatkov s format namreč odpreta možnost za napade SQL injection. Namesto tega na mesto podatkov postavita %s (brez morebitnih navednic - za to bo poskrbel vmesnik), same podatke pa podajta v seznamu kot drugi argument metode execute, npr.

    cur.execute("""
        SELECT vlak, cas_prihoda, cas_odhoda, postaja.ime AS postaja, postaja.id AS postajaId, proga
        FROM voznired JOIN postaja on voznired.postaja = postaja.id
        WHERE postaja.ime = %s or postaja.ime = %s
        ORDER BY proga, cas_prihoda
    """, [postaja1c, postaja2c])

Na isti način lahko gradita tudi poizvedbe, kjer število podatkov ni fiksno. Tako namesto https://github.com/Globocnik0/Potniski-promet/blob/3290a8c168e36470023a28243fade71267562138/simulacijaPodatkov.py#L30-L34 raje naredita

    cur.execute("INSERT INTO model(kapaciteta, teza) VALUES {}".format(", ".join("(%s, %s)")),
                [val[i] for val in vnosModel for i in (0, 1)])

Seveda lahko v bolj kompleksnih primerih sestavita niz s %s na mestu vsakega vstavljenega podatka in seznam podatkov v ustreznem vrstnem redu, pa potem kličeta cur.execute na tem nizu in seznamu.

zcerne commented 2 years ago

Problem sem odpravil kjer je bilo potrebno, torej v mapaha iskanjeVoznegaReda.py in prijavaNakup.py. V mapi simulacijaPodatkov.py se mi to ni zdelo potrebno, saj je namenjena le polnjenju baze. Ali je to vredu?

jaanos commented 2 years ago

Pri polnjenju baze to res ni tako kočljivo (saj podatkov ne podaja potencialno zlonamerni uporabnik), je pa vseeno bolje, če se podatki vstavljajo na varen način, tako da ne bi prihajalo do napak in morebitnih nepričakovanih izidov.

zcerne commented 2 years ago

Popravil.