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

    −1

    1. 1
    Пидарашки, приведите реальный пример говнокода.

    Запостил: Antifriz_otrabotanyi, 05 Декабря 2019

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

    • if (new Boolean(x > 0).toString().length() == Math.round(Math.pow(Math.sin(Math.PI/6), -2))) {
          System.out.println("x > 0");
      }


      https://ideone.com/aVwOK3
      Ответить
    • Почему, если говнокод, то сразу "PHP"?
      Ответить
    • function database() {
          global $database;
          if ($database===null) {
              $database=new PdoOne('mysql','127.0.0.1','root','abc.123','example');
              $database->logLevel=3; // it shows all errors
              try {
                  $database->connect(true);
              } catch(exception $ex) {
                  die("The database is not available");
              }
          }
          return $database;
      }
      Ответить
      • >> global $database;
        >> return $database;

        Паттерн «Синголтон».
        Ответить
        • Пул соединений.
          Ответить
        • Там еще красивый паттерн для поддержки разных бд: легко расширяемый
          switch ($this->databaseType) {
                      case 'mysql':
                          switch ($type) {
                              case 'table':
                                  $query
                                      = "SELECT * FROM information_schema.tables where table_schema='{$this->db}' and table_name=?";
                                  break;
                              default:
                                  $this->throwError("objectExist: type [$type] not defined for {$this->databaseType}", "");
                                  die(1);
                                  break;
                          }
                          break;
                      case 'sqlsrv':
                          switch ($type) {
                              case 'table':
                                  $query = "SELECT * FROM sys.objects where name=? and type_desc='USER_TABLE'";
                                  break;
                              default:
                                  $this->throwError("objectExist: type [$type] not defined for {$this->databaseType}", "");
                                  die(1);
                                  break;
                          }
                          break;
                      default:
                          $this->throwError("database not defined or supported {$this->databaseType}", "");
                          die(1);
                  }
                  $arr = $this->runRawQuery($query, [PDO::PARAM_STR, $objectName], true);
                  return is_array($arr);
          Ответить
          • Недостаточно ынтырпрайзно: надо сделать, чтобы 'mysql' было в одном классе, 'sqlsrv' — в другом, а вместо свитч-кейса был выбор класса по имени. И чтобы всё было с наследованием реализации.
            Ответить
      • >exception $ex
        Ебля с эксепшенами
        Ответить
      • > it shows all errors
        Прямо в браузер?
        Ответить
        • Оказывается, в файл:
          https://github.com/EFTEC/PdoOne/blob/master/lib/PdoOne.php
          Ответить
          • слона-то ты и не приметил
            /**
                 * <p>This function returns an unique sequence<p>
                 * It ensures a collision free number only if we don't do more than one operation
                 * per 0.0001 second However,it also adds a pseudo random number (0-4095)
                 * so the chances of collision is 1/4095 (per two operations done every 0.0001 second).<br>
                 * It is based on Twitter's Snowflake number
                 *
                 * @param bool $unpredictable
                 *
                 * @return float
                 * @see \eftec\PdoOne::getSequence
                 */
                public function getSequencePHP($unpredictable = false)
                {
                    $ms = microtime(true);
                    //$ms=1000;
                    $timestamp = (double)round($ms * 1000);
                    $rand = (fmod($ms, 1) * 1000000) % 4096; // 4096= 2^12 It is the millionth of seconds
                    $calc = (($timestamp - 1459440000000) << 22) + ($this->nodeId << 12) + $rand;
                    usleep(1);
                    if ($unpredictable) {
                        if (PHP_INT_SIZE == 4) {
                            return '' . $this->encryption->encryptSimple($calc);
                        } else {
                            // $r is always a 32 bit number so it will fail in PHP 32bits
                            return '' . $this->encryption->encryptInteger($calc);
                        }
                    }
                    return '' . $calc;
                }


            usleep
            Ответить
            • Погуглил, что такое «Twitter's snowflake». Нашёл вот это:
              https://developer.twitter.com/en/docs/basics/twitter-ids

              https://github.com/twitter-archive/snowflake

              Ничего не понял.
              Ответить
            • The problem

              Some programming languages such as Javascript cannot support numbers with > 53-bits. This can be easily examined by running a command similar to: (90071992547409921).toString() in a browser console or by running the following JSON snippet through your JSON parser.
              {"id": 10765432100123456789, "id_str": "10765432100123456789"}

              In affected JSON parsers the ID will not be converted successfully and will lose accuracy. In some parsers there may even be an exception.

              Если число не помещается в 53 бита, жопоскрипт его интерпретирует как плавающего питуха что ли?
              Ответить
              • Проверяем выхлоп (90071992547409921).toString().
                Pale Moon (какой-то из форков «SpiderMonkey»):
                "90071992547409920"
                Chrome (V8):
                "90071992547409920"
                Opera/Presto (Carakan):
                "90071992547409920"
                Internet Explorer (Chakra):
                "90071992547409920"
                QupZilla (JavascriptCore, такой же движок в «Safari»):
                "90071992547409920"
                Netscape 4.8 (не знаю, какой там движок, может быть, Rhino?):
                "90071992547409920"

                Похоже, что числа, не влезающие в 32 бита, переводятся в double. Пока влезает в 53 бита, ошибок округления нет. Прямо как в «Бейсике» на «Спектруме» и на «Атари», где целые и плавпитухи не различались.

                А если бы использовали промежуточный 80-битный формат плавпитуха, то в мантиссу бы влезло 64 бита и вообще никто бы не заметил подвоха.
                Ответить
                • Это говно, типы данных отличные от строки не нужны.
                  Ответить
              • Ещё одно последствие разработки языка путём сранья на салфетку.
                JavaScript numbers are always stored as double precision floating point numbers
                Ответить
            • > if (PHP_INT_SIZE == 4)
              А я думал пхп высокоуровныевый язык.
              Ответить
              • В «PHP» некоторые типы работают по-разному в 32-битной и в 64-битной версии. Ну прямо как int в «Си».
                Ответить
                • И как же работает int в «Си»?
                  Ответить
                  • По-разному.
                    Ответить
                  • Может работать, может не работать.
                    Ответить
                    • https://ideone.com/EFGoBi
                      UB имени Борманда.
                      Ответить
                      • Как интересно всё в математике, как хорошо и слаженно работают ученые. Число Тараса приводит к UB Борманда.
                        Ответить
                  • int может быть 16 (в борланд си под дос), 32 или 64

                    ю невер ноу, чек int_max, люк
                    Ответить
                    • А ещё бывают DSP, GPU, мейнфреймы, микроконтроллеры и прочая питушня, в которой в инте может быть сколько угодно битов.

                      Именно поэтому я за int8_t, int16_t, int32_t, int64_t и так далее.
                      Ответить
                      • А если мне похуй на конкретный размер, но я хочу "максимально удобный конткертному процессору размер", но почему не взять int?
                        Ответить
                        • Ну что значит похуй? Всё равно ты знаешь порядок чисел, с которыми работаешь. Иначе UB.

                          Поэтому int16_least_t или int8_fast_t или сколько там тебя устроит по минимуму.

                          А int нинужен.
                          Ответить
                          • Значит, что я взял MAX_INT, и построил по нему логику.
                            Ответить
                            • Длинная арифметика какая-нибудь чтоли? Где ещё настолько похуй на порядок чисел, что ты с любым max int сможешь работать?
                              Ответить
                              • Ох блядь, ну змейку я пишу, или рогалик. Или тупую утилиту, где есть список всех запущенных приложений (очевидно, их не будет больше чем 256 даже).

                                При этом я хочу выбрать самый удобный для данного CPU тип
                                Ответить
                                • > рогалик
                                  А потом у тебя сейв с 32-битки не откроется на 16-битке. Потому что HP у босса было ограничено max int.

                                  > не больше чем 256
                                  Ахаха. На чистой винде их там не под 200 сейчас?
                                  Ответить
                                  • я не пишу переносимый софт.

                                    Кстати, я относительно недавно (лет пять назад) обосрался на этом деле.
                                    Я писал под яблоко под четверый гейфон, а потом вышел пятый, и он был 64-битнынй и кажется NSNumber поменялся

                                    >Ахаха. На чистой винде их там не под 200 сейчас?
                                    PS C:\Windows\system32> Get-Process | measure | select {$_.Count}
                                    
                                    $_.Count
                                    --------
                                         117

                                    ну такое

                                    но у меня семерка
                                    Ответить
                                    • > (get-process).length
                                      256

                                      Явно к эксперименту не готовился. До этого было 259, но я не помню, что там закрыл.
                                      Ответить
                                      • У меня 57.

                                        Я регулярно удаляю из автозапуска всякую хрень. У меня остановлена служба «Планировщик заданий», а также запрещена ещё куча служб (DNScache, NGEN (clr_optimization-что-то-там), WSearch, wmiApSrv, WebClient, RemoteAccess, WerSvc, WinRM, RemoteRegistry, BITS, службы автообновления Adobe и Гугла и т. п.), а то бы наверняка было бы столько же.
                                        Ответить
                                        • у тебя же виндуос 98 (или на чем ты там сидишь), ясно, что там мало всего
                                          Ответить
                                          • Сёма вообще на Windows 3.1 сидит (или на чём там). У него наверное ещё меньше процессов.
                                            Ответить
                                      • PS C:\Users\gost> (get-process).length
                                        204
                                        Ответить
                                  • Кстати, в классическом рогалике сейфа нету.
                                    Умер -- начинай со входа в пещеру
                                    Ответить
                        • > хочу "максимально удобный конткертному процессору размер", но почему не взять int?
                          Для x64 у инта тоже самый удобный размер?
                          Ответить
                    • А в си++ не так?
                      Ответить
                      • Кажется что так же, кресты в этом месте совместимы с няшной
                        Ответить
        • vanished
          Ответить
          • Приведи реальный пример, когда тебе понадобился «Vanish».
            Ответить
            • На «Говнокоде».
              Ответить
            • Вагиш
              Легко свой дом от пятен избавиш

              А теперь приведи пример, где тебе реально понадобился Бараш. Ну или Мразиш.
              Ответить
        • >> Прямо в браузер?

          Вот тут неплохо сделали:
          http://webfile.ru/265

          Удобно, всё понятно.

          Главное, всю цепочку вызовов показывает с фрагментами исходников.

          Угадайте, на каком языке написано.
          Ответить
          • > DOCROOT/index.php
            И правда удобно, пути не палятся. Правда, совершенно непонятно, нафига отладочную инфу в проде высирать, тем более на 404 ошибку…

            С другой стороны, учитывая, сколько в Интернете сайтцов на «Джанге» с «Debug = True», затирание конфиденциальных данных в стектрейсе выглядит полезным.
            Ответить
          • http://webfile.ru/movie
            И пароль от постгреса показывает. Удобно.
            Ответить
            • Кто-нибудь проверял, он наружу торчит или доступен только с локалхоста?
              Ответить
              • Они за «Cloudflare» и IP, при беглом осмотре, не палят. Именно поэтому я за «Cloudflare».

                Но вообще история записей говорит, что они, скорее всего, в 95.163.64.0/18 сидят. Можно просканить 5432 порт, если у кого-нибудь есть желание и абузоустойчивая впска.
                Ответить
            • А де там пороль?
              Ответить
              • Кликни по ссылке (arguments)
                Там будет реальный пример пароля.
                Ответить
                • Какой позор )))

                  Слушай, а это у какахана такая отладка или это униКАЛьная разработка?
                  Ответить
                  • Это стандартное отладочное сообщение, включенное по умолчанию:
                    http://web.archive.org/web/20161017100645/kohanaframework.org/3.3/guide/kohana/errors

                    На сайте «Любимой» «Коханы» единственная кнопка «Скачать». Т. е. документация доступна только в офлайне или в вебархиве.

                    В подвале сайта: «RIP Kohana 2007 - 2017». Последняя версия была в 2016. Возможно, в какой-то из версий PHP 7.x она перестанет работать. На замену готовят форк:
                    https://github.com/koseven/koseven/
                    Ответить
                    • Хихи, у форка такой же позор:
                      https://koseven.ga/documentation/kohana/errors

                      Всё правильно сделали.

                      MAKE KOHANA GREAT AGAIN!
                      Ответить
                      • А вот «Django», даже при включённом «debug = True», тщательно затирает из дебажного выхлопа всё, что напоминает пароли. Именно поэтому я за «Django».
                        Ответить
                        • Потому что Django это всё таки Python, то-есть инструмент программистов, а не операторов шаблонизатора, как PHP.

                          На PHP впринципе не может быть фреймворка без выхлопа паролей, без скул инеъкции, и без вывода путей в браузер
                          Ответить
                          • Именно поэтому я за «PHP».
                            Ответить
                          • Именно поэтому пхп залупа
                            Ответить
                            • >пхп залупа
                              масло масляное?
                              Ответить
                              • залупа конечно ругательное слово, но в данном сочетании они не эквивалентны
                                Ответить
                                • В чем разница?
                                  Ответить
                                  • с моей стороны было грубо такое оскорбление залупы. признаю.
                                    Ответить
                                    • Напомнило: Иван Охлобыстин попросил прощения у проституток за то, что сравнил с ними Алёну Водонаеву.
                                      Ответить
                        • А как оно отличает пароли от обычного текста?
                          Ответить
                          • ЕМНИП, смотрит в названия ключей: если видит там «password», «key» и тому подобное — фильтрует.
                            Ответить
                            • Нагуглил вот это:
                              def sensitive_post_parameters(*parameters):
                                  """
                                  Indicate which POST parameters used in the decorated view are sensitive,
                                  so that those parameters can later be treated in a special way, for example
                                  by hiding them when logging unhandled exceptions.
                              
                                  Accept two forms:
                              
                                  * with specified parameters:
                              
                                      @sensitive_post_parameters('password', 'credit_card')
                                      def my_view(request):
                                          pw = request.POST['password']
                                          cc = request.POST['credit_card']
                                          ...
                              
                                  * without any specified parameters, in which case consider all
                                    variables are sensitive:
                              
                                      @sensitive_post_parameters()
                                      def my_view(request)
                              Ответить
                              • Ага. Хардкорный багор )))
                                def get_traceback_frame_variables(self, request, tb_frame):
                                	"""
                                	Replace the values of variables marked as sensitive with
                                	stars (*********).
                                	"""
                                	# Loop through the frame's callers to see if the sensitive_variables
                                	# decorator was used.
                                	current_frame = tb_frame.f_back
                                	sensitive_variables = None
                                	while current_frame is not None:
                                		if (current_frame.f_code.co_name == 'sensitive_variables_wrapper' and
                                				'sensitive_variables_wrapper' in current_frame.f_locals):
                                			# The sensitive_variables decorator was used, so we take note
                                			# of the sensitive variables' names.
                                			wrapper = current_frame.f_locals['sensitive_variables_wrapper']
                                			sensitive_variables = getattr(wrapper, 'sensitive_variables', None)
                                			break
                                		current_frame = current_frame.f_back
                                
                                	cleansed = {}
                                	if self.is_active(request) and sensitive_variables:
                                		if sensitive_variables == '__ALL__':
                                			# Cleanse all variables
                                			for name in tb_frame.f_locals:
                                				cleansed[name] = CLEANSED_SUBSTITUTE
                                		else:
                                			# Cleanse specified variables
                                			for name, value in tb_frame.f_locals.items():
                                				if name in sensitive_variables:
                                					value = CLEANSED_SUBSTITUTE
                                				else:
                                					value = self.cleanse_special_types(request, value)
                                				cleansed[name] = value
                                	else:
                                		# Potentially cleanse the request and any MultiValueDicts if they
                                		# are one of the frame variables.
                                		for name, value in tb_frame.f_locals.items():
                                			cleansed[name] = self.cleanse_special_types(request, value)
                                
                                	if (tb_frame.f_code.co_name == 'sensitive_variables_wrapper' and
                                			'sensitive_variables_wrapper' in tb_frame.f_locals):
                                		# For good measure, obfuscate the decorated function's arguments in
                                		# the sensitive_variables decorator's frame, in case the variables
                                		# associated with those arguments were meant to be obfuscated from
                                		# the decorated function's frame.
                                		cleansed['func_args'] = CLEANSED_SUBSTITUTE
                                		cleansed['func_kwargs'] = CLEANSED_SUBSTITUTE
                                
                                	return cleansed.items()
                                Ответить
                                • В общем, чтобы заменял, ему нужно передать список «нехороших слов».

                                  А по умолчанию какие настройки?
                                  Ответить
                                  • Ну вот настройки подключения к БД вырезает, если я ничего не путаю.
                                    Ответить
    • public function first($defaultMsg='') {
              $r=$this->firstError();
              if ($r!==null) return $r;
              $r=$this->firstWarning();
              if ($r!==null) return $r;
              $r=$this->firstInfo();
              if ($r!==null) return $r;
              $r=$this->firstSuccess();
              if ($r!==null) return $r;
              return $defaultMsg;
          }
      Ответить
    • Въебал по минусу ублюдкам!
      Ответить

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