Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MySQL] Proszę o wskazówki do prostej wyszukiwarki newsów
Forum PHP.pl > Forum > Bazy danych > MySQL
Guli
Mam tabelkę o nazwie news a w nim:
id
nazwa_kat_id
data_utw
tytul
tekst

Zrobiłem sobie taką prościutką wyszukiwarkę, która wyszukuje posty id, tytul i tekst a kod wygląda tak (wszystko w jednym pliku o nazwie wyszukiwarka.php):

  1. <form action="wyszukiwarka.php" method="post">
  2. <legend>Szukaj</legend>
  3. <input type="text" name="slowo" id="slowo" value="<?php echo $slowo; ?>" size="17" />
  4. <input type="submit" name="znajdz" value="Szukaj" class="button" />
  5. </form>


  1. <?php
  2. echo '<table summary="Tabela testowa" class="tabela2">';
  3. echo '<tbody><tr><th class="first">Lp</th>';
  4. echo '<th>Tytuł</th>';
  5. echo '<th>Data</th></tr>';
  6. require('mysql.php');
  7.  
  8. if(isset($_REQUEST['slowo'])) {
  9.  
  10. $slowo = stripslashes($_REQUEST['slowo']);
  11.  
  12. $query = 'SELECT id, tytul, tekst FROM ' . $prefix . 'news WHERE tytul LIKE '%' . $slowo . '%' OR tekst LIKE '%' . $slowo . '%' ORDER BY data_utw DESC';
  13.  
  14. $result = mysql_query($query);
  15. $n = mysql_num_rows($result);
  16.  
  17. if (strlen($slowo)<3){
  18.  
  19. echo 'Szukany ciąg musi mieć przynajmniej trzy znaki';
  20. }
  21. else {
  22.  
  23. if($n > 0) {
  24.  
  25. while($wiersz = mysql_fetch_assoc($result)
  26. {
  27.  
  28. echo '<tr>';
  29. echo '<td>'.$wiersz['id'].'</td>';
  30. echo '<td>'.$wiersz['tytul'].'</td>';
  31. echo '<td>'.$wiersz['tekst'].'</td>';
  32. echo '</tr>';
  33. }
  34. echo '</tbody>';
  35. echo '</table>';
  36. }
  37.  
  38. else { 
  39. echo 'Nie ma tego słowa w bazie';
  40. } 
  41. }
  42. }
  43. ?>
  44. </form>


I mam pytania z nim związane.

1. Czy wystarczy zabezpieczenie przed atakami tylko słowa $keyword poprzez stripslashes ? Jeśli nie to co można dodać ? Czy to wystarczy mysql_real_escape_string ?
2. Czy przy wyświetlaniu wyników id, tytul i tekst trzeba dodać stripslashes i strip_tags np. stripslashes($wiersz['tytul']) ?
3. Gdzie należy dopisać echo z informacją:

- że pusta jest baza
- że tego słowa nie ma w bazie
- jeśli nie wpisałem słowa a kliknąłem w przycisk submit to ma pojawić się info, że nie podałem słowa kluczowego ?

Nie jestem pewien czy w kodzie jest dobrze i w którym to miejscu.

4. Czy najlepsze jest tak pisać po wpisaniu słowa i kliknięciu w submit formularza ?
  1. <?php
  2. if(isset($_REQUEST['slowo'])) {
  3. $keyword = stripslashes($_REQUEST['slowo']);
  4.  
  5. itd.
  6. ?>


czy tak :
  1. <?php
  2. if(array_key_exists('slowo', $_POST) ) {
  3. $slowo = stripslashes($_POST['slowo']);
  4.  
  5. itd.
  6. ?>


Co można jeszcze dodać do kodu lub zmienić ?

Za pomoc dziekuje
Inzabi
- zawsze stosuj mysql_escape_string, lub nawet addslashes zanim zapiszesz dane do bazy
- register_globals na off, zawsze stosuj _GET _POST
- usuwaj wszelkie informacje o błedach, zawsze utrudni to ewentualnym włamywaczom pracę
Guli
Inzabi
register_globals na moim serwerze jest na off. Natomiast nie wiem o co chodzi z tym _POST i _GET. Ta tablica $_REQUEST będzie mi potrzebna w panelu admina gdzie mam sesje i ciasteczka. Na publicznej stronie użyję _POST. O to ci chodziło ?

Cytat
usuwaj wszelkie informacje o błedach,

Możesz to rozwinąć ? O jakie błędy ci chodzi ?
Inzabi
$_REQUEST to tablica zbiorcza, stosuje się ją raczej w starych serwisach, które działają jeszcze na register_globals. Gdy ją stosujesz, to włamywacz ma szerokie pole do popisu. Można przejąć na przykład informacje z sesji i stać się adminem. Nie podam tu sposobów, aby nie ułatwiać zadanie domorosłym hakierom smile.gif. Dlatego stosuj zawsze $_GET, $_POST, $_SESSION>
Jeśli musisz używać $_REQUEST, to znak, że musisz zmienić projekt strony.

Co do tych błedów. Chodzi zablokowanie możliwości podejrzenia struktury tabeli, najlepiej stosowac error_reporting(0) i zabezpieczać się przed sql injection.
Na przykład: stosuj @mysql_query() zamiast 'mysql_query(), wtedy w przypadku błednego zapytania SQL, w najgorszym razie, strona bedzie pusta.
Guli
Aha rozumiem. Zrobić taki zapis if(isset($_POST['slowo'])) zamiast if(isset($_REQUEST['slowo'])) ?

A czy zapisanie error_reporting(0); do pliku o nazwie mysql.php wystarczy ? A ten plik wygląda tak:

  1. <?php
  2. @mysql_connect($mysql_hostname, $mysql_username, $mysql_password) or die('MySQL error: ' . mysql_errno() . ' ' . mysql_error());
  3. mysql_select_db($mysql_database);
  4. mysql_query("SET NAMES latin2");
  5. ?>


A będę wywoływał poprzez require('mysql.php'); a w tym miejscu $result = mysql_query($query); dodać znak małpy i zmienić na $result = @mysql_query($query);

Czy prawidłowo ?
Inzabi
Najlepiej zabezpieczaj wszystko co się da. To że błędów nie widać, nie znaczy, że już jest bezpiecznie. Do pełnego zabezpieczenia jeszcze daleka droga.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.