• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed PHP kod błędu

Object Storage Arubacloud
0 głosów
268 wizyt
pytanie zadane 19 grudnia 2022 w PHP przez Kaduq Użytkownik (780 p.)
zamknięte 20 grudnia 2022 przez Kaduq

Siema mogłby ktoś pomóc.

Mam taki kod w php. Powinno pojawiać sie w przegladarce komunikat bledu itp 

A jest cos takiego ? co ja tam zle robie 

Fatal error: Uncaught mysqli_sql_exception: Duplicate entry 'bobo' for key 'login' in
<?php
include('header.html');
if(isset($_REQUEST['login']) && isset($_REQUEST['password']) && isset($_REQUEST['tos'])) {
    
    $login = $_REQUEST['login'];
    $password = $_REQUEST['password'];
    $tos = $_REQUEST['tos'];
    $db = new mysqli('localhost', 'root', '', 'forms');
    
$q = "INSERT INTO user (id, login, password) VALUES (NULL, \"$login\", \"$password\")";
$db->query($q);
if($db->errno == 0) {
    echo "Dodano poprawnie uzytkownika z id=" . $db->insert_id;
} else {
    echo "Nastapil blad numer " . $db->errno . ", komunikat bledu" . $db->error;
}
    //rozlaczenie z baza
    $db->close();
} else {
    include('registerForm.html');
}
include('footer.html');
?> 

 

komentarz zamknięcia: Otrzymałem odpowiedź na moje pytanie.
1
komentarz 20 grudnia 2022 przez Michał Kazula Pasjonat (19,540 p.)

W powyższym kodzie wykorzystano już kilka technik zabezpieczających przed SQL injection.

  1. Funkcja htmlentities() służy do konwersji znaków specjalnych na ich odpowiedniki HTML (np. < na &lt;). Dzięki temu ataki typu "cross-site scripting" (XSS) są trudniejsze do przeprowadzenia.
  2. Opcja ENT_QUOTES oznacza, że zostaną zamienione zarówno pojedyncze, jak i podwójne cudzysłowy.
  3. Parametr "UTF-8" określa kodowanie znaków, w którym przeprowadzana jest konwersja.
  4. Funkcja mysqli_real_escape_string() służy do "ucieczki" znaków specjalnych, takich jak ' czy ", które mogą być wykorzystywane w atakach SQL injection. Funkcja ta dodaje do nich odpowiednie "ucieczki", takie jak \' czy \", co sprawia, że nie są one traktowane jako część zapytania SQL.

Oprócz tego, warto pamiętać o kilku innych zabezpieczeniach:

  1. Zawsze należy sprawdzać dane wejściowe, w szczególności te, które są wykorzystywane w zapytaniach SQL. Można to zrobić np. za pomocą funkcji preg_match() lub filter_var().
  2. Zamiast konkatenacji zmiennych do zapytania SQL lepiej jest używać parametrów zapytań (ang. prepared statements). Dzięki temu dane wejściowe są automatycznie "uciekane", co dodatkowo zabezpiecza przed atakami SQL injection.
  3. Ważne jest również, aby nadawać odpowiednie uprawnienia użytkownikom bazy danych. Unikajmy używania kont z pełnymi uprawnieniami, jeśli nie są one konieczne.
  4. Aby zabezpieczyć się przed atakami typu "injection", warto również zadbać o odpowiednią konfigurację serwera bazy danych.
komentarz 20 grudnia 2022 przez Kaduq Użytkownik (780 p.)
Ok wszystko jasne.

Dziękuje jeszcze raz za pomoc. ;]
komentarz 20 grudnia 2022 przez VBService Ekspert (253,340 p.)

@Michał Kazula, 

To bez obiektowości będzie tak:

if (!$db->query($q)) {
    printf("Errorcode: %d\n", $db->errno);
}

ale $db->query$db->errno to też OOP wink

komentarz 20 grudnia 2022 przez VBService Ekspert (253,340 p.)

@Kaduq, 

pytanie mam takie mianowicie SQL incjection czy taki kawałek kodu zabezpieczy mi stronę przed tym czy to tylko początek zabezpieczeń?

aby uniknąć tego typu ataków, należy zawsze sprawdzać poprawność danych wejściowych i możesz np. też używać zapytań parametryzowanych, np. jak poniżej:

if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $login = $_POST['login'] ?? null;
    $haslo = $_POST['haslo'] ?? null;
    
    if ($login && $haslo) {
        $conn = mysqli_connect('localhost', 'username', 'password', 'database_name');

        $sql = "SELECT * FROM uzytkownicy WHERE user = ? AND pass = ?";
        $stmt = mysqli_prepare($conn, $sql);
        mysqli_stmt_bind_param($stmt, "ss", $login, $haslo);
        mysqli_stmt_execute($stmt);

        $result = mysqli_stmt_get_result($stmt);
        mysqli_close($conn);

        while ($row = mysqli_fetch_array($result)) {
            // wyświetlenie danych użytkownika
            echo $row['username'];
            echo $row['email'];
        }
         
    }
}

W powyższym przykładzie zapytanie parametryzowane zapobiega wstrzykiwaniu niebezpiecznych komend SQL, ponieważ dane wejściowe są automatycznie przetwarzane przez bibliotekę MySQLi, uniemożliwiając wstrzykiwanie niebezpiecznych danych.

komentarz 20 grudnia 2022 przez Michał Kazula Pasjonat (19,540 p.)

@VBService, 
Wiem ;-)

Podobne pytania

0 głosów
1 odpowiedź 533 wizyt
0 głosów
1 odpowiedź 532 wizyt
0 głosów
1 odpowiedź 153 wizyt
pytanie zadane 16 marca 2022 w Systemy operacyjne, programy przez MarC_des Nowicjusz (120 p.)

92,570 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,958 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...