1. PHP / Говнокод #2607

    +162.5

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    $s_name=$_POST['s_name'];
    $f_name=$_POST['f_name'];
    $m_name=$_POST['m_name'];
    $login=$_POST['login'];
    $password1=$_POST['password1'];
    $password2=$_POST['password2'];
    $post_id=$_POST['post'];
    $query="SELECT  person.login as login	FROM	person	ORDER BY ID";
    $res=Select($query);
    $flag=false;
    		  While(OCIFetch($res))
    		        {
    			        $login_base=text($res,'LOGIN');
    				if ($login==$login_base)
    				{
    				$flag=true;
    				break;
    				}
    			}
    		If($flag)
    			{
    			echo "</br><center><h3>Такой логин уже существует...придумайте еще что-нибудь!</center></h3></br>";
    			?>
    			<center><h4><a href="index.php?menu=reg">Назад</a></h4><center>
    			<?
    			}
                   if (!$flag)
    		   {
    		     if ($password1==$password2)
    		           {
    		             If (($login!='') and ($password1!='') and ($s_name!='') and ($f_name!='') and ($m_name!=''))
    			   {
                                     .... Ну и дальше  добавение и все такое))

    ммм.. альтернативные способы защиты от инъекций в запросах???)))

    Запостил: 1_and_0, 12 Февраля 2010

    Комментарии (9) RSS

    • Что-то я тут защиты не нашел.
      И зачем делать всю выборку, а после шерстить массив?
      Нечем процессор занять?
      Достаточно сделать SELECT COUNT(*)
      Это намного быстрее будет.
      Ответить
      • В этом то и прикол, про что я и написал "защита от инъекций".
        В сам запрос в базу не поступает никакой информации из вне, а после просматривается массив средствами пхп, но зато 100% гарантия от sql-инъекции)))
        Ну, понятно что говнокод в чистом виде, и все должно организовываться по другому, с этим никто и не спорит)
        Это код не мой,а у автора спрашивать бессмысленно, так автор плохо знаком и с PHP и с SQL..., и делалось это ради того что бы "курсовик хоть как либо работал", и курсовая работа была зачтена, код при проверки не смотрелся, в базе было не более 10 записей на каждую таблицу, сервер в универе мощный, итог: "нам похрен какие ресурсы мы тратим, это не наши проблемы!", вот как то так все печально...
        Ответить
        • omg как знакомо)) аффтар случайно это (http://www.govnokod.ru/2439) не писал ?
          Ответить
          • нет, но идея одна и та же)) только у вас говнокод более экзотичный!)))
            Ответить
    • Идея хороша. Впрочем, наверное, если логинов будет в базе тысяч пятдесят, вот тогда начнутся трудности.
      Ответить
      • Вылетело из головы совсем. Если алгоритм бы работал чисто для защиты вида:
        1) выбираем безопасно все логины из базы
        2) проверяем, нет ли среди выбранного желаемого
        3) если есть, запрещаем
        4) ???
        5) ПРОФИТ
        то его бы было критически важно правильно дополнить в месте создания логина. На кой такие титанические старания насмарку, если будет неэкранированный инсерт?
        Итак, доработка.
        $allowed_logins = array ('Vasya', 'Petya', 'Misha', .../* сколько надо логинов */ );
        $id_login = 0;
        for( $i = 0; $i < count($allowed_logins); $i++)
        if ($login == $allowed_logins[$i])
        {
        $id_login = $i;
        break;
        }
        if(! $id_login)
        {
        die "Такой логин использовать нельзя!";
        exit;
        }
        if ($id_login)
        {
        $query = "insert into users(login) values(" + $allowed_logins[$id_login] + ")";
        /* ... */
        }

        И никакой злобный хакер не зарегистрируется под ником с иньекцией!
        Ответить
        • Ну вообще-то хакеры не регистрируются, а заходят под зарегенными аккаунтами. Т.е. регулярку на $_POST все равно придется повесить.

          И еще: цикл лучше оформить так
          for($i = 0, $c = count($allowed_logins); $i < $c; $i++)

          Иначе count будет пересчитываться каждую итерацию и в конце концов начнутся проблемы с быcтродействием.

          Кроме того, есть еще функция in_array().
          Ответить
          • Вот все руки не доходят изучить такую конструкцию цикла, все забываю, да по старинке пишу:
            $c = count($allowed_logins);
            for($i = 0, $i < $c; $i++)
            {
            ...
            }
            Ответить
          • Спасибо, кэп!

            Вы бы ещё сказали, что ветвь if ($id_login) не нужна, агрегируется else, или вообще безо всего, потому что в предыдущей строке уже exit;
            И что die; exit в данном случае излишне.

            Это таки была шутка юмора, тэйк ит изи.
            Ответить

    Добавить комментарий