За последние 24 часа нас посетил 22671 программист и 1273 робота. Сейчас ищут 838 программистов ...

Ещё одна авторизация (PDO_MySQL+PHP_AUTH_USER)

Тема в разделе "Решения, алгоритмы", создана пользователем Vladson, 30 июл 2010.

  1. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Версия сугубо демонстрационная, пароли храниться в неизменённом виде (обычно этого следует избегать)

    Update: сделал нормальный вариант, пароли хранятся в SHA1
    PHP:
    1. <?php
    2. /* сама наша база
    3. CREATE TABLE `users` (
    4.   `username` char(24) NOT NULL,
    5.   `password` binary(40) NOT NULL,
    6.   UNIQUE KEY `username` (`username`)
    7. ) ENGINE=MyISAM;
    8.  
    9. INSERT INTO `users` (`username`, `password`) VALUES
    10. ('Vladson', '7c4a8d09ca3762af61e59520943dc26494f8941b');
    11. */
    12.  
    13. // тут всё логично
    14. if (!isset($_SERVER['PHP_AUTH_USER'])) {
    15.     Header ("WWW-Authenticate: Basic realm=\"Admin Page\"");
    16.     Header ("HTTP/1.0 401 Unauthorized");
    17.     exit();
    18. }
    19.  
    20. // тут посылаем нафик кавычки
    21.     $_SERVER['PHP_AUTH_USER'] = stripslashes($_SERVER['PHP_AUTH_USER']);
    22.     $_SERVER['PHP_AUTH_PW'] = stripslashes($_SERVER['PHP_AUTH_PW']);
    23. }
    24.  
    25. // конект к базе
    26. $dbh = new PDO('mysql:dbname=test;host=localhost', 'root', '');
    27.  
    28. // готовим запрос
    29. $sth = $dbh->prepare('SELECT * FROM `users` WHERE `username` = :username AND `password` = SHA1(:password);');
    30.  
    31. // подставляем данные и отправляем запрос
    32. $sth->execute(array(
    33.         ':username' => $_SERVER['PHP_AUTH_USER'],
    34.         ':password' => $_SERVER['PHP_AUTH_PW']
    35.     )
    36. );
    37.  
    38. // Получаем ответ
    39. $user_data = $sth->fetch(PDO::FETCH_ASSOC);
    40.  
    41. // false в случае если юзера нет или пароль неверный
    42. if ($user_data == false || !is_array($user_data)) {
    43.     Header ("WWW-Authenticate: Basic realm=\"Admin Page\"");
    44.     Header ("HTTP/1.0 401 Unauthorized");
    45.     exit();
    46. }
    47.  
    48. // или вся информация идёт в $user_data
    49. Header ("Content-type: text/plain");
    50. var_dump($user_data);
    51. ?>
     
  2. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    мм, а для чего это?) Ну, как бы степень полезности невелика, если не сказать что нулевая

    Если б ты что-то типа такого http://pyha.ru/forum/topic/4488.0 забабахал...
     
  3. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    В прошлый раз давал ещё менее полезное решение, но оно вызвало не мало реакции, как критики так и наоборот благодарностей...

    Смысл примерно в том чтоб
    1 - показать как это работает (есть люди которые делают тоже самое через задний проход, недавно на одном форуме парниша спрашивал хорош ли его код, этот выбирал юзера, и уже в РНР сравнивал пароль, само собой код был полон дыр)
    2 - пропогандировать PDO (ещё год-два назад на дешёвых и бесплатных хостах был редкость, сегодня есть практически везде) не редко встречаю коментарии новичков которые говорят что это сложно, я же стараюсь показать насколько это удобно и просто
     
  4. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    пропаганда PDO попахивает борьбой с ветряными мельницами. По поводу удобства я бы тоже поспорил.

    PHP:
    1. <?php
    2. $userdata = $this->context->db('read')->fetch('SELECT * FROM {users} WHERE `username` = ?s', $_SERVER['PHP_AUTH_USER']);
    для меня это удобно
    ?s - обрамляет одинарными кавычками + эсскейпинг строки
    {users} - добавляет префикс к таблице
     
  5. phpdude

    phpdude Активный пользователь

    С нами с:
    9 июл 2010
    Сообщения:
    697
    Симпатии:
    0
    и для меня по внешнему виду тоже.

    это бесползно.

    тоже сомнительно
     
  6. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    Насчёт PDO - его жизнь и развитие в данный момент под вопросом.
     
  7. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    PHP:
    1. <?php
    2. PHP::getInstance()->setVar(PHP::String("username"))->getVar(PHP::Zval(PHP::String("this")))->requestVarByLastExecuteVar(PHP::String("context"))->reqestFuncByLastExecuteVar(PHP::String("db"),PHP::Array(PHP::String("read")))->requestFuncByLastExecuteVar(PHP::String("fetch"),PHP::Array(PHP::String("SELECT * FROM {users} WHERE `username` = ?s"),PHP::getInstance()->getVar(PHP::Array(PHP::String("_SERVER"),PHP::String("PHP_AUTH_USER")))))
    3. ->if(PHP::ReqeustFunc(PHP::String("empty"),PHP::Array(PHP::getInstance()->getVar(PHP::Zval(PHP::String("username"))))))
    не всё. больше немогу =))
     
  8. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    Mr.M.I.T.
    ето что ?xD
     
  9. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Кому и Вупи Голдберг невеста, но речь не о тебе.
    Во времена РНР4.2 жизнь волшебных кавычек тоже встала под вопрос,
    однако на 95% хостингах до сих пор стоит. Но топик не про PDO и тем
    более не про волшебные кавычки, это просто "готовое решение" для
    тех кто не может написать даже такое.
     
  10. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    да хрень это.

    Я же говорю, вот напиши trueЪ расширяемое решение, которое будет поддерживать как PDO так и Redis, для http base auth и для контакта/фейсбука. Это ж куда интересней.
     
  11. phpdude

    phpdude Активный пользователь

    С нами с:
    9 июл 2010
    Сообщения:
    697
    Симпатии:
    0
    это first steps in ZF :D
     
  12. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    Не, здесь другое - на развитие PDO не хватает ресурсов - им просто почти никто не занимается, а нативные библиотеки уверенно топают вперёд. Из-за этого разрыв в возможностях сейчас довольно приличный. Поэтому есть мнение, что PDO нужно выкинуть в PECL и не тратить на него ресурсы, т.к. разработчиков почти нету, а сконцентрироваться на нативных библиотеках, т.к. их поддерживают сами вендоры.
    З.Ы. А кавычки убили, точнее они щас depricated и в следующем major релизе будут убиты физически. Как и safe_mode и ещё некоторые вещи :)
     
  13. phpdude

    phpdude Активный пользователь

    С нами с:
    9 июл 2010
    Сообщения:
    697
    Симпатии:
    0
    наступит эра "пизды" для говнохостингов, 9(% используют это гавно для "защиты" на шаредах .... дибилы ну и хй в них, пусть умрут. УРА!
     
  14. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    ой нескоро они себе поставят эту версию

    из-за какого мудилы все разъехалось?
     
  15. phpdude

    phpdude Активный пользователь

    С нами с:
    9 июл 2010
    Сообщения:
    697
    Симпатии:
    0
    мит тебя запомнил
     
  16. Костян

    Костян Активный пользователь

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО
    тут тема о заголовках, а не о ПДО. Вообще нафиг обсуждать всякий бред если бред привет медвед
     
  17. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
  18. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    Чё я у себя нашёл!!!
    PHP:
    1.  
    2. <?php
    3.  include "sis/classes/ghtml.class.php";
    4.  $cities_id=array(1,2,3,4,5,6);
    5.  $cities_name=array("MSK","SPB","NN","KZ","NOV","UFA");
    6.  
    7.  GHTML::Run(array("html_autoinsert_on"=>0,"html_method"=>"_POST"));
    8.  
    9.  print GHTML::Link("/test.php",null,GHTML::Link("/test.php","style='font-weight:bold;font-size:20px;'")->Html("[Главная]"))->Html("[Главная]");
    10.  print " ";
    11.  print GHTML::Link("/test.php?act=reg",null,GHTML::Link("/test.php?act=reg","style='font-weight:bold;font-size:20px;'")->Html("[Регистрация]"))->Html("[Регистрация]");
    12.  
    13.  
    14.  print GHTML::Form("POST","")
    15.  ->HTML(
    16.      GHTML::Input("name","text","Имя пользователя",null,true)->Html(),
    17.      "<br>",
    18.      GHTML::Input("pass1","password","Пароль")->Html(),
    19.      "<br>",
    20.      GHTML::Input("pass2","password","Пароль ещё раз")->Html(),
    21.      "<br>",
    22.      GHTML::Select("city")->Html(
    23.            GHTML::Option("")->Html("Выберите город"),
    24.            GHTML::Option($cities_id,$_POST['city'])->Html($cities_name)
    25.      ),
    26.      "<br>",
    27.      GHTML::CheckBoxList("che_cities[]",$cities_id,null,$_POST['che_cities'])->Html($cities_name),
    28.      "<br>",
    29.      GHTML::RadioList("r_cities[]",$cities_id,null,$_POST['r_cities'])->Html($cities_name),
    30.      "<br>",
    31.      GHTML::Textarea("resume",50,9,null,true)->Html("Ненмого о себе"),
    32.      "<br>",     
    33.      GHTML::Input("","submit","Жми!")->Html()
    34.  );
    HTML:
    1. <a href='/test.php' style='font-weight:bold;font-size:20px;' />[Главная]</a> <a href='/test.php?act=reg'  />[Регистрация]</a><form method='POST' action='' /><input type='text' name='name' value='Имя пользователя'  /><br><input type='password' name='pass1' value='Пароль'  /><br><input type='password' name='pass2' value='Пароль ещё раз'  /><br><select name='city'  /><option value=''  />Выберите город</option><option value='6'  />MSK</option><option value='5'  />SPB</option><option value='4'  />NN</option><option value='3'  />KZ</option><option value='2'  />NOV</option><option value='1'  />UFA</option></select><br><input type='checkbox' name='che_cities[]' value='6'  />MSK<br /><input type='checkbox' name='che_cities[]' value='5'  />SPB<br /><input type='checkbox' name='che_cities[]' value='4'  />NN<br /><input type='checkbox' name='che_cities[]' value='3'  />KZ<br /><input type='checkbox' name='che_cities[]' value='2'  />NOV<br /><input type='checkbox' name='che_cities[]' value='1'  />UFA<br /><br><input type='radio' name='r_cities[]' value='6'  />MSK<br /><input type='radio' name='r_cities[]' value='5'  />SPB<br /><input type='radio' name='r_cities[]' value='4'  />NN<br /><input type='radio' name='r_cities[]' value='3'  />KZ<br /><input type='radio' name='r_cities[]' value='2'  />NOV<br /><input type='radio' name='r_cities[]' value='1'  />UFA<br /><br><textarea name='resume' cols='50' rows='9'  />Ненмого о себе</textarea><br><input type='submit' name='' value='Жми!'  /></form>
     
  19. phpdude

    phpdude Активный пользователь

    С нами с:
    9 июл 2010
    Сообщения:
    697
    Симпатии:
    0
    устрашный хтмл генератор?)
     
  20. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    нелюблю мешать php и html ;)
     
  21. phpdude

    phpdude Активный пользователь

    С нами с:
    9 июл 2010
    Сообщения:
    697
    Симпатии:
    0
    Mr.M.I.T.
    так ты его намешал вроде)))) причем так, хардкорненько )))
     
  22. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    3D на PHP, че
    GIFEncoder v2.0
    запускать в консоли
    PHP:
    1. <?php
    2. $start = microtime(1);
    3. include('gif_animate.php');
    4. class space
    5. {
    6.     public $points = array();
    7.     private $x;
    8.     private $y;
    9.     public $steps = 0;
    10.    
    11.     public function __construct($x, $y, $z) {
    12.         $this -> x = $x;
    13.         $this -> y = $y;
    14.         $this -> z = $z;
    15.     }
    16.    
    17.     public function addPoint($point, $x, $y, $z, $fx = 0, $fy = 0, $fz = 0) {
    18.         array_push($this -> points, array($point, $x, $y, $z));
    19.         $point -> addP($fx, $fy, $fz);
    20.     }
    21.    
    22.     public function step() {
    23.         $t = 1;
    24.         $busy = array();
    25.         foreach ($this -> points as $n => &$point) {
    26.             $x = $point[1];
    27.             $y = $point[2];
    28.             $z = $point[3];
    29.             if (!($x >= 0 && $x < $this->x && $y >= 0 && $y < $this->y && $z >= 0 && $z < $this->z)) {
    30.                 unset($this->points[$n]);
    31.                 continue;
    32.             }
    33.             $f = abs($point[0]->p['fx']) + abs($point[0]->p['fy']) + abs($point[0]->p['fz']);
    34.             if ($f > 0 && 1 / $f < $t) {
    35.                 $t = 1 / $f;
    36.             }
    37.         }
    38.         foreach ($this -> points as $n => &$point) {
    39.             $xyz = abs($point[0]->p['fx']) + abs($point[0]->p['fy']) + abs($point[0]->p['fz']);
    40.             $hypo = pow(abs($point[0]->p['fx']), 2) + pow(abs($point[0]->p['fy']), 2) + pow(abs($point[0]->p['fz']), 2);
    41.            
    42.             if ($point[0]->p['fx'] != 0 && $xyz > 0) {
    43.                 if ($point[0]->p['fx'] < 0) {
    44.                     $fxmin = 1;
    45.                 }
    46.                 $move_x = sqrt($hypo) * ($point[0]->p['fx'] / $xyz);
    47.                 if (isset($fxmin)) $move_x = $move_x * -1;
    48.             } else {
    49.                 $move_x = 0;
    50.             }
    51.            
    52.             if ($point[0]->p['fz'] != 0 && $xyz > 0) {
    53.                 if ($point[0]->p['fy'] < 0) {
    54.                     $fymin = 1;
    55.                 }
    56.                 $move_y = sqrt($hypo) * ($point[0]->p['fy'] / $xyz);
    57.                 if (isset($fymin)) $move_y = $move_y * -1;
    58.             } else {
    59.                 $move_y = 0;
    60.             }
    61.            
    62.             if ($point[0]->p['fz'] != 0 && $xyz > 0) {
    63.                 if ($point[0]->p['fz'] < 0) {
    64.                     $fzmin = 1;
    65.                 }
    66.                 $move_z = sqrt($hypo) * ($point[0]->p['fz'] / $xyz);
    67.                 if (isset($fzmin)) $move_z = $move_z * -1;
    68.             } else {
    69.                 $move_z = 0;
    70.             }
    71.            
    72.             $point[1] += $move_x*$t;
    73.             $point[2] += $move_y*$t;
    74.             $point[3] += $move_z*$t;
    75.         }
    76.         $this -> steps+=$t;
    77.     }
    78.    
    79.     public function shot() {
    80.         $r = imagecreatetruecolor($this -> x+1, $this -> y+1);
    81.         foreach ($this -> points as &$point) {
    82.             $x = $point[1];
    83.             $y = $point[2];
    84.             $z = $point[3];
    85.             if ($x >= 0 && $x < $this->x && $y >= 0 && $y < $this->y && $z >= 0 && $z < $this -> z) {
    86.                 $ox = $this->x / 2;
    87.                 $oy = $this->y / 2;
    88.                 $oz = $this->z / 2;
    89.                 $xf = $x - $ox;
    90.                 $yf = $y - $oy;
    91.                 $zf = $z;
    92.                 $xr = $x - $xf / ($this->z/($this->z - $z));
    93.                 $yr = $y - $yf / ($this->z/($this->z - $z));
    94.                 imageline($r, $xr, $yr, $xr, $yr, $point[0]->color);
    95.             }
    96.         }
    97.         ob_start();
    98.         imagegif($r);
    99.         return ob_get_clean();
    100.     }
    101. }
    102. class Point
    103. {
    104.     public $p = array('fx' => 0, 'fy' => 0, 'fz' => 0);
    105.     public $color;
    106.     public function __construct() {
    107.         $red = dechex(rand(1, 255));
    108.         if (strlen($red) < 2) $red = '0'.$red;
    109.         $green = dechex(rand(1, 255));
    110.         if (strlen($green) < 2) $green = '0'.$green;
    111.         $blue = dechex(rand(1, 255));
    112.         if (strlen($blue) < 2) $blue = '0'.$blue;
    113.         $this->color = hexdec("0x$red$green$blue");
    114.     }
    115.     public function addP($fx = 0, $fy = 0, $fz = 0) {
    116.         $this->p['fx'] += $fx;
    117.         $this->p['fy'] += $fy;
    118.         $this->p['fz'] += $fz;
    119.     }
    120. }
    121. $gifs = array();
    122. $space = new space(399, 399, 399, false, true);
    123.  
    124. $xs = range(-31, 31);
    125. $rands = range(-10, 10, 0.5);
    126. for ($i=0; $i<1000; $i++) {
    127.     $space->addPoint(new Point, 200, 200, 200, $rands[array_rand($rands)], $rands[array_rand($rands)], $rands[array_rand($rands)]);
    128. }
    129. while($space->steps < 100) {
    130.     $nshot = $space -> steps;
    131.     $space -> step();
    132.     if ((int)$nshot < (int)$space -> steps) {
    133.         array_push($gifs, $space -> shot());
    134.         echo 'Step #',$space -> steps,"\r\n";
    135.     }
    136. }
    137. $gif = new GIFEncoder($gifs, 0, 0, 0, 0, 0, 0, 'bin');
    138. file_put_contents('c:\anim.gif', $gif -> GetAnimation());
    139. echo "\r\nTime: ",substr(microtime(1) - $start, 0, 4);
    [​IMG]
    :p
     
  23. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    [vs]
    круто, заставь его под музыку танцевать :D
     
  24. phpdude

    phpdude Активный пользователь

    С нами с:
    9 июл 2010
    Сообщения:
    697
    Симпатии:
    0
    [vs]
    бывает же делать кому то нечего :D
     
  25. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    Ага, работы небыло, несколько ночей надо было дежурить кое-где, вот и писал всякую чушь))