• 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

Aruba Cloud VPS - 50% taniej przez 3 miesiące!
0 głosów
695 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 (256,320 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 (256,320 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ź 733 wizyt
0 głosów
1 odpowiedź 639 wizyt
0 głosów
1 odpowiedź 277 wizyt
pytanie zadane 16 marca 2022 w Systemy operacyjne, programy przez MarC_des Nowicjusz (120 p.)

93,166 zapytań

142,179 odpowiedzi

321,947 komentarzy

62,495 pasjonatów

Advent of Code 2024

Top 15 użytkowników

  1. 918p. - dia-Chann
  2. 902p. - Łukasz Piwowar
  3. 901p. - CC PL
  4. 894p. - Łukasz Eckert
  5. 716p. - Michał Telesz
  6. 664p. - Marcin Putra
  7. 649p. - Michal Drewniak
  8. 641p. - rafalszastok
  9. 641p. - rucin93
  10. 629p. - Piotr Aleksandrowicz
  11. 629p. - Adrian Wieprzkowicz
  12. 621p. - Dawid128
  13. 612p. - Mikbac
  14. 611p. - ksalekk
  15. 606p. - Mariusz Fornal
Szczegóły i pełne wyniki

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

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...