[PHP] Kolejne pytania i skrypt sprawdzający


(Ryan370z) #1
  1. Czy w funkcji strpos() mogę podać więcej niż 2 parametry, np:

    strpos('Tu mam łańcuch', "#","|"," ");

  2. Jeśli nie, to którą funkcją mogę sprawdzić (w 1 poleceniu), czy w łańcuchu nie ma znaków polskich i innych (chodzi o to, żeby nie można było wykonać ataku sql injection)? 3. Jak napiszę funkcję filtrującą dane chciałbym sprawdzić jej działanie. Jeśli będzie błąd i skrypt przepuści takie zapytanie:

    [...ZAPYTANIE...]x' AND BENCHMARK(9999999,BENCHMARK(999999,BENCHMARK(999999,MD5(NOW()))))=0 OR '1'='1

(jak wiadomo będzie to wtedy mały DDoS), to czy jak takie coś dostanie się do bazy, to jak to mogę odkręcić? I jaki będzie efekt przede wszystkim :stuck_out_tongue:

  1. No i czy do tego celu będzie dobra pętla while?

(Damgora) #2
  1. NIE

  2. strtr() albo wyrażenia regularne

  3. nie wiem (nie DDoS, jeżeli już to DoS)

  4. raczej nie


(Ryan370z) #3

Ok. W 2 parametrze w poleceniu strtr() mam do wpisania znaki, które będą szukane i zamieniane. Mam błąd:

Parse error: syntax error, unexpected ':' in /var/www/virtual/omegaforce.c0.pl/rejestr.php on line 35

<?

         #Sprawdź, czy pola są poprawnie wypełnione

        $pass=$_POST['Pass']; 

        $login=$_POST['Nick'];

        $password=strtr($pass , "#!@$%^&*()-=_+{}][":;'><,.?`~/*\|" , "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");

        $login2=strtr($pass , "#!@$%^&*()-=_+{}]['":;'><,.?`~/*\|" , "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");

Wszystkie niedozwolone znaki ma zamieniać na 'a'. Jak mam napisać to ":"?


(Damgora) #4

postaw \ (backslash) przed " (cudzysłowem) bo kończy ciąg


(Ryan370z) #5

Ok działa. A teraz jak mogę zrobić funkcję sprawdzająca, czy w bazie jest już ten sam gracz o tym samym nicku/e-mailu?


(Damgora) #6

jedyne na co wpadłem na szybko:

    if(mysql_num_rows(mysql_query("SELECT * FROM users WHERE login='".$_POST['login']."' OR mail='".$_POST['mail']."'")))        //znaleziono    else//nie znaleziono  [/code]

Z racji nagromadzenia nawiasów, cudzysłowów i apostrofów mogły się wkraść jakieś błędy. I być może jest jakiś lepszy sposób.

(Ryan370z) #7

Podsunąłeś mi dobry pomysł :wink:, ale myslę że można prościej. Połączyłem obie funkcje sprawdzające:

function check()

         {

          $sql= mysql_query("SELECT * FROM `users` WHERE login ='".$_POST['Nick']."' OR mail='".$_POST['mail']."'"); # POCZATEK

           if(!($sql))     

            echo(''); # KONIEC

           else{

                if(!($_POST['Nick'] && $_POST['Pass'] && $_POST['Repeat'] && $_POST['mail']))

                 echo('');

                 elseif($_POST['Pass'] != $_POST['Repeat'])

                  echo('');

                else{ 

                     $Pass=$_POST['Pass'];

                     $md5= md5("$Pass");

                     $sql2="INSERT INTO `users` (`login`, `pass`, `mail`, `kasa`, `sila`, `zrecznosc`, `celnosc`, `refleks`, `top`, `arena` ,`bron`, `rekawice`, `helm`, `buty`, `kamizelka`, `tarcza`, `lvl`) VALUES ('".$_POST['Nick']."', '$md5', '".$_POST['mail']."', '1000', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1')";

                     $query= mysql_query($sql2);

                     echo('');

                    }

                }

           }[/code]

Według mnie jest lepiej i prościej :wink:.


(Damgora) #8

a według mnie to nie działa :wink:


(Ryan370z) #9

Dlaczego? :> omegaforce.cba.pl/rejestracja.php Sprawdź sobie tutaj ;p

edit: masz rację, nie działa.


(Damgora) #10

Chcesz wiedzieć dlaczego nie działa? Zacytuję zdanie z manuala:

a ty oczekiwałeś false jeśli SELECT nic nie znajdzie (szczerze też tak próbowałem na początku :wink: )

Ale ten wykrzyknik to postawiłeś chyba tylko dlatego, że bez niego nie pozwalało dodać żadnego usera.

Ja wykorzystałem funkcję mysql_num_rows() ale można użyć innych, które sprawdzą czy zapytanie zwróciło jakieś dane.

ps. trafiłem na inną funkcję, która przetwarza zapytania do bazy chroniąc przed SQL Injection - mysql_real_escape_string() sorki, że dopiero teraz


(Ryan370z) #11

Sorki że odgrzewam, ponieważ byłem na obozie i nie mogłem odpowiadać na topic.

Gdy użyję funkcji mysql_num_rows() to formularz się nie wyświetla.