Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Maty
Člen
Avatar
Maty:24.4.2021 1:23

Šlo by to nějak lepe zabezpečít ? Popřipadně jak? Je to pouze kód na test, a je to můj první login, register.

config.php : https://pastebin.com/gCYvavKA
login.php : https://pastebin.com/xx2HgwXc
register.php : https://pastebin.com/x7G2x40N

Chci docílit: Lepší zabezpečení, pokud to jde. Popřipadně jestli by mi někdo vysvětlil, jak funguje protekce proti SQL Injcetu, někde jsem četl že je to bind, a někde že mysqli_real_es­cape_string.

Editováno 24.4.2021 1:23
 
Odpovědět
24.4.2021 1:23
Avatar
Maty
Člen
Avatar
Maty:24.4.2021 1:29

Ještě doplním

function jmeno() {
    $jmeno = $_SESSION['username'];
    echo $jmeno;
}

//isAdmin
$jmeno = NULL;

Zkoušel jsem poprve funkce, ake jelikož jsem tam nechtěl mit nějake warningy, tak jsem napsal $jmeno = NULL; Vím o tom že to takhle nemusí byt, vím že to vubec nemusí spíš němělo byt ve funkci, pouze jsem zkoušel.

 
Nahoru Odpovědět
24.4.2021 1:29
Avatar
Milan Turyna
Tvůrce
Avatar
Milan Turyna:25.4.2021 16:34

Me rady, nejen bezpecnostni:

1. config.php

  • zabezpecit proti utoku SQL injection pomoci prepared statements (https://www.w3schools.com/…atements.asp), napr: radek 22
    • kvuli tomu, ze tam vypisujes promennou primo do textoveho retezce bez escapovani (ci jine ochrany) a tim padem pri zmene par pismen muze utocnik ziskat potrebna data
  • formatovani kodu (i v ostatnich souborech)
    • pouzivej prosim nejaky editor ktery ti odsadi logicke bloky a funkce, nebot je to hruza
  • pokud se jedna o vetsi system, tak je do budoucna dobre pouzivat nejakou knihovnu pro spravu session, kde muzes mit dane sessions serazene dle kontextu (uzivatel, nastaveni zobrazeni, jazyk atd. atd.) aby se ti nestalo, ze si obcas prepises nejaky klic a ani nevis jak, neco podobne jako: https://doc.nette.org/cs/3.1/sessions
if($is_Admin == 0) {
// proc nastavujes promennou $is_Admin na 0, kdyz jsi prave zkontroloval ze je rovna 0?
    $is_Admin = 0;
    $_SESSION['admin'] = $is_Admin;
    $rank = 'Nezaregistrovaný';
}
// to stejne v dalsich xxy. podminkach

¨

  • pri kontrolovani, zda je $is_Admin rovno danemu cislu, pouzivas operator pro porovnani bez ohledu na datovy typ ==, pouzival bych === pro porovnani vcetne datoveho typu
  • k tomu co delas (pravdepodobne ticket system) bych doporucil naucit se objektove orientovane programovani, aspon na zakladni urovni, bude to pak jednodussi, efektivnejsi a lepe pridas nove funkce
  • ja jsem delal neco podobneho jak ty, taky na tematiku minecraftu, akorat komplexnejsi vcetne celeho redakcniho systemu, helpdesku, statistik a hrackeho panelu, neni to nic svetobornyho ani uplne best-practices, ale inspirovat by ses mohl https://github.com/…craft-webcms, je to Nette a PHP
  • pote az prejdes na OOP, tak misto ukladani nazvu role do $rank bych udelal nejakou tridu a nasazel bych tam objekty, kde bys mel ulozeny nazev, prava atd.

2. login.php

  • mas nejaky speficky duvod proc pouzivat pro prijate data $_REQUEST nikoliv $_POST a $_GET?
    • ve formulari mas nastaveny POST
    • $_REQUEST obsahuje jak POST pozadavky tak i GET pozadavky, dle meho je lepsi vzdy vedet jaky to je
if ($query == false) // nemusis psat == false, staci if(!$query)
{
    die('Query přikaz nebyl vykonan');
}
  • je zbytecne pouzivat cyklus while, nebot vis, ze vzdycky se provede pouze jednou (bud bude uzivatel presmerovan - header() a nebo bude prerusen skript - die())
$_SESSION['valid'] = 'valid'; // proc nastavujes do promenne 'valid'? to to nekde vypisujes?
$_SESSION['valid'] = true; // pokud to mas jen jako kontrolu, pouzij true a nebo 1

3.

  • while loop, viz: 2. bod
  • prazdne else, radek 27
    if ($vysledek->num_rows > 0)
    {
....
    }
    else
    {
    }

4. v mnoha pripadech pletes cestinu a anglcitinu dohromady

Co se tyce tve otazky k SQL Injection:

  • je vice zpusobu jak se ji branit
  • napr: prepared statements jak jsem ti poslal odkaz, mysqli_real_es­cape_string
  • prepared_state­ments, cili funkce bind_param je dle meho nejvhodnejsi, ovsem v mysqli je nemile udelana a lepsi je napriklad v PDO
// PDO
  $conn = new PDO("mysql:host=host;dbname=db", "user", "pass");
  $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

  $stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email)
  VALUES (:firstname, :lastname, :email)");
  $stmt->bindParam(':firstname', $firstname);
  $stmt->bindParam(':lastname', $lastname);
  $stmt->bindParam(':email', $email);

  $firstname = "John";
  $lastname = "Doe";
  $email = "[email protected]";
  $stmt->execute();

.

// mysqli
$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) die("Connection failed: " . $conn->connect_error);

$stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email) VALUES (?, ?, ?)");
$stmt->bind_param("sss", $firstname, $lastname, $email);

$firstname = "John";
$lastname = "Doe";
$email = "[email protected]";
$stmt->execute();
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
25.4.2021 16:34
Řeš pouze to, co dokážeš ovlivnit.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 3 zpráv z 3.