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

    −1

    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
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    74. 74
    75. 75
    76. 76
    77. 77
    78. 78
    79. 79
    80. 80
    81. 81
    82. 82
    83. 83
    84. 84
    85. 85
    86. 86
    87. 87
    <?php include "init.php"; ?>
    <?php
    if(trim($_GET['mode'])=='ajax'){
    header('Content-Type: application/json; charset=utf-8');
    if(trim($_POST['action'])==htmlspecialchars(trim($_GET['script']))){
    $result=array();
    $result['errors']=array();
    if(trim($_POST['email'])==''){
    $result['errors']['email']=l('login_error_email_empty');
    } else {
    $check=mysql_query("SELECT * FROM `users` WHERE `email`='"._F($_POST['email'])."' OR (`phone`!='' AND `phone`='"._F(preg_replace('/\D/', '', $_POST['email']))."');");
    if(mysql_num_rows($check)){
    $user=mysql_fetch_assoc($check);
    } else {
    $result['errors']['email']=l('login_error_email_inexists');
    }
    }
    if(trim($_POST['password'])==''){
    $result['errors']['password']=l('login_error_password_empty');
    } elseif(mysql_num_rows($check) && $user['password']!=md5(trim($_POST['password']))){
    $result['errors']['password']=l('login_error_password_incorrect');
    } elseif($user['active']=='0'){
    $result['errors']['form']=l('login_error_account_inactive');
    } elseif($user['active']=='2'){
    $result['errors']['form']=l('login_error_account_removed');
    } elseif($user['active']=='3'){
    $result['errors']['form']=l('login_error_account_banned');
    }
    if(count($result['errors'])==0){
    $_SESSION['userid']=$user['userid'];
    mysql_query("UPDATE `users` SET `login_time`='".$time."' WHERE `userid`='".$_SESSION['userid']."';");
    $result['status']='success';
    } else {
    $result['status']='error';
    }
    echo json_encode($result);
    }
    exit;
    }
    ?>
    <?php
    $pagetitle=l('login_title')." • ".$config['sitename'];
    $pagedesc=$config['description'];
    ?>
    <?php
    if($m){ include "m-login.php"; exit; }
    ?>
    <?php include "inc/header.php"; ?>
    
    <div class="row">
    <div class="col-md-3"></div>
    <div class="col-md-6">
    <h3 class="special-title"><?php echo l('login_title'); ?></h3>
    <div class="auth-box">
    <form action="/<?php echo htmlspecialchars(trim($_GET['script'])); ?>/" method="POST" autocomplete="off" class="ajax-form" data-callback="loginCallBack">
    <input type="hidden" name="action" value="<?php echo htmlspecialchars(trim($_GET['script'])); ?>">
    <div class="form-group">
    <label><?php echo l('login_type_email'); ?></label>
    <div>
    <input type="text" autocomplete="off" class="form-control" name="email" placeholder="<?php echo l('login_email'); ?>" autofocus>
    </div>
    </div>
    <div class="form-group">
    <label><?php echo l('login_type_password'); ?></label>
    <div>
    <input type="password" autocomplete="off" class="form-control" name="password" placeholder="<?php echo l('login_password'); ?>">
    </div>
    </div>
    <button type="submit" class="btn btn-primary"><?php echo l('login_submit'); ?></button>
    <div class="cannot-login">
    <a href="<?php echo $locPrefix; ?>/restore/" class="pull-left"><?php echo l('login_cant_login'); ?></a>
    <a href="<?php echo $locPrefix; ?>/register/" class="pull-right"><?php echo l('login_to_register'); ?></a>
    <div class="clear"></div>
    </div>
    </form>
    </div>
    </div>
    <div class="col-md-3"></div>
    </div>
    
    <div class="social-login-title">
    <?php echo l('login_via_social_network'); ?>
    </div>
    
    <div class="social-login"><a href="/social/vk/<?php if(isset($_GET['ref'])){ ?>?ref=<?php echo urlencode($_GET['ref']); ?><?php } ?>" class="vkontakte"><i class="fa fa-vk"></i></a><a href="/social/ok/<?php if(isset($_GET['ref'])){ ?>?ref=<?php echo urlencode($_GET['ref']); ?><?php } ?>" class="odnoklassniki"><i class="fa fa-odnoklassniki"></i></a><a href="/social/fb/<?php if(isset($_GET['ref'])){ ?>?ref=<?php echo urlencode($_GET['ref']); ?><?php } ?>" class="facebook"><i class="fa fa-facebook"></i></a><a href="/social/gl/<?php if(isset($_GET['ref'])){ ?>?ref=<?php echo urlencode($_GET['ref']); ?><?php } ?>" class="google"><i class="fa fa-google"></i></a></div>
    
    <?php include "inc/footer.php"; ?>

    В среде "PHP"-разработчиков часто слышатся возбуждающие аппетит к ветчине повизгивания о том, что, дескать, без фреймворков не жизнь, чистый "PHP" - говно, и что без "Laravel" охуенный проект не создать. Но взгляните на вышеприведённый код страницы авторизации в одном из разработанных мною движков и задайте себе вопрос: зачем делить один ладненький, компактненький скриптик на контроллеры, модели, шаблоны, интерфейсы, и, как следствие, конское количество директорий, когда и "HTML"-представление, и "AJAX"-обработчик можно впихнуть в один файл на, в данном случае, полтора-два экрана? Чем обусловлена массовая течка по "MVC" и смежным архитектурам (к слову, не только лишь в "PHP", но и, слышно, в "Ruby" и "NodeJS")?

    Запостил: HornyPorny, 18 Июля 2018

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

    • показать все, что скрытоvanished
      Ответить
      • Скомбинированной с "trim" (ибо нехуй).
        Ответить
      • Кстати, я не совсем понимаю всеобщий сарказм касательно "mysql_real_escape_string". Что не так с этой функцией и с "mysql_query"? Быть может, я должен разбить и этот примитивный запросец на десять строк объектно-ориентированных методов "PDO"?
        Ответить
        • показать все, что скрытоvanished
          Ответить
          • Кто-то один решил, что надо признать данное расширение устаревшим, только и всего.
            Ответить
        • > Кстати, я не совсем понимаю всеобщий сарказм касательно "mysql_real_escape_string".

          Насколько я понимаю, всеобщий он только на говнокоде. Оно и понятно: на говнокоде собралась кучка неосиляторов со своими сраными верилогами, которые даже никогда сами регистрацию на php не писали простынёй без отступов и вперемешку с вёрсткой.

          С другой стороны: подход к защите от инъекций через экранирование — плохой подход. Если ты используешь экранирование — то ты можешь ЗАБЫТЬ экранировать. А если используешь prepared statements или хотя бы эти блять именованные параметры, как они там называются, то ты НЕ МОЖЕШЬ забыть сделать экранирование. И не можешь дважды экранировать случайно. При этом код получается абстрактнее, ты думаешь не про сраную строку, которую конкатенируешь, в добавок добавляя какие-то бэкслеши, а про запрос (написанный, на минуточку, на другом языке) и подставляемые в него данные. Именно поэтому mysql_real_escape_string и депрекейтнули, как устаревший подход, которому есть альтернатива, ВО ВСЕХ ПУНКТАХ его превосходящая, хотя существование mysqli_… как бы возвращает проблему на место. В php вообще все проблемы всегда должны быть на своих местах, таков принцип создателей языка. Мне кажется, если они начнут решать проблемы, от них отвернётся всё сообщество пользователей, потому что большинство из них пользуются PHP именно ради проблем. Представьте, что ваш сын был с бородавкой на лице. Вам вернули другого ребёнка, без бородавки. Вы ведь не станете радоваться. Вам нужен именно ВАШ сын.

          Впрочем, есть и способы обойти mysql_real_escape_string, но те, что я видел, были связаны со включением каких-то маргинальных кодировок или специальных режимов стрельбы по ногам со стороны разработчика (если уж обсираться, обосраться можно было бы и попроще). Причинами возможности обойти mysql_real_escape_string всегда являлся сам mysql (лол), и баги прикрывали в следующих версиях.
          Ответить
        • Наконец, существование в языке функций с именами mysql_escape_string и mysql_real_escape_string и их сосуществование — это какая-то совсем позорная добровольная капитуляция и констатация собственного идиотизма со стороны разрабов языка.

          Таковы, в общем и целом, претензии человечества к mysql_real_escape_string, если тебе интересно.
          Ответить
    • показать все, что скрытоvanished
      Ответить
    • Это бутстрап?
      Ответить
    • Ничего не понял. Переведи на "C++".
      Ответить
      • Я уже писал - я не обязан знать древний язык для калькуляторов; а посему перевода не будет.
        Ответить
        • Хорошо; тогда переведи на "Python".
          Ответить
          • Сожалею, но и в удовлетворении данной просьбы я также вынужден отказать вследствие того, что при наличии у меня определённой компетентности в "PHP" мне в хуй не упёрлось вдаваться в аналогичную технологию, поданную в другом фантике.
            Ответить
        • Да, язык калькуляторов, на котором "калькулятор" (читай: интерпретатор) PHP написал :D
          Ответить
          • И все операционные системы, в которых запускаются все сервера, написанные на калькуляторе, к которым прикручен этот интерпретатор.
            Ответить
      • Как будто ты на "C++" поймёшь.
        Ответить
    • показать все, что скрытоvanished
      Ответить
    • Полностью согласен. Почти 300 грёбаных инклудов в сраном вёдпрессе. Серваки загибаются от многотонного говнокода. Сайт ели ползает на dedicated serverе. От тотальной оопизации пользы нет, такой код разбирать это мучение скакать по файлам с однострочными функциями вызывающими друг друга.
      Ответить
    • Le singe mérite une banane.
      Ответить

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