"PHP" / Говнокод #26066 Ссылка на оригинал

0

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

Запостил: Antifriz_otrabotanyi Antifriz_otrabotanyi, (Updated )

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

  • 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;
    }
    Ответить
      • Там еще красивый паттерн для поддержки разных бд: легко расширяемый
        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' — в другом, а вместо свитч-кейса был выбор класса по имени. И чтобы всё было с наследованием реализации.
          Ответить
        • слона-то ты и не приметил
          /**
               * <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
          Ответить
          • 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
              Ответить
            • В «PHP» некоторые типы работают по-разному в 32-битной и в 64-битной версии. Ну прямо как int в «Си».
              Ответить
                • 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 (или на чем ты там сидишь), ясно, что там мало всего
                                        Ответить
                                • Кстати, в классическом рогалике сейфа нету.
                                  Умер -- начинай со входа в пещеру
                                  Ответить
                      • > хочу "максимально удобный конткертному процессору размер", но почему не взять int?
                        Для x64 у инта тоже самый удобный размер?
                        Ответить
                    • Кажется что так же, кресты в этом месте совместимы с няшной
                      Ответить
        • Приведи реальный пример, когда тебе понадобился «Vanish».
          Ответить
          • Вагиш
            Легко свой дом от пятен избавиш

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

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

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

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

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

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

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

                Слушай, а это у какахана такая отладка или это униКАЛьная разработка?
                Ответить
                • Это стандартное отладочное сообщение, включенное по умолчанию:
                  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/
                  Ответить
                    • А вот «Django», даже при включённом «debug = True», тщательно затирает из дебажного выхлопа всё, что напоминает пароли. Именно поэтому я за «Django».
                      Ответить
                      • Потому что Django это всё таки Python, то-есть инструмент программистов, а не операторов шаблонизатора, как 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;
        }
    Ответить

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

Из-за тебя ушел bormand, guest!

    А не использовать ли нам bbcode?


    8