Статьи

Ваш сайт такой динамичный?

Из очень интересного The Daily WTF , ежедневного дайджеста ужасно плохого кода, обнаруженного в дикой природе, приходит эта предостерегающая история о динамической веб-разработке, которая пошла наперекосяк.

Разработчик Stephan Jennewein был нанят, чтобы обновить веб-сайт для совместимости с Firefox. То, что на первый взгляд представляло собой скромный веб-сайт, состоящий из 15-20 статических страниц, оказалось сложной смесью кода JavaScript и PHP. Каждая из явно статических страниц содержала код, похожий на этот:

<html>
  <head>
    <link href="dynsitebase/styles.php" rel="stylesheet" type="text/css" />
    <script src="dynsitebase/base.php" language="JavaScript"></script>
    <script src="dynsitebase/themes.php" language="JavaScript"></script>
    <script src="dynsitebase/sitedata.php" language="JavaScript"></script>
    <script src="dynsitebase/pagelayout.php" language="JavaScript"></script>
    <script language="JavaScript">
      document.write("<title>" + CurrentPage.Title + "</title>");
    </script>
   </head>
   <body>
    <script language="JavaScript">
      DataInterface.initialize();
      DataInterface.bindToPage(CurrentPage);
      ImageLoader.preload(CurrentPage);
      LinkLoader.bindToContext(CurrentPage);

      PagePrinter.printHeader(CurrentPage);
      PagePrinter.printNavigation(CurrentPage);
      PagePrinter.printTitle(CurrentPage);
      PagePrinter.printSubTitle(CurrentPage);
      PagePrinter.printMainContent(CurrentPage);
      PagePrinter.printFooter(CurrentPage);

      DataInterface.close();
      ImageLoader.close();
      LinkLoader.close();
      PagePrinter.close();
    </script>
   </body>
</html>

Все содержимое страницы генерировалось и отображалось рядом объектов JavaScript, которые, в свою очередь, генерировались серией сценариев PHP на сервере! После загрузки любой страницы этого сайта браузер с отключенным JavaScript будет отображать пустое окно.

Если это не было достаточно нелепо, сценарии PHP, отвечающие за генерацию кода JavaScript, определяли, что нужно отображать на странице, на основе адреса страницы HTML, о чем сообщает ненадежный заголовок HTTP Referer

 function dynsitebase_PagePrinter_render()
{
  echo "var PagePrinter = new Object()";

  echo "PagePrinter.printHeader = function(pageObj)";
  echo "{";
  echo "  document.write("<div class='$css_headerdivclass'>");";
  echo "  document.write("<h1 class='$css_h1headerdivclass'>");";
  echo "  if (pageObj.header) ";
  echo "  {";
  echo "    document.write(pageObj.header);";
  echo "  }";
  echo "  else";
  echo "  {";
  echo "    document.write("$headerToRender");";
  echo "  }";

  ...

}

Хуже, чем код, написанный кем-то, кто не очень свободно говорит на JavaScript или PHP, автор этого чудовища, очевидно, знал эти языки довольно хорошо. Ему или ей не хватало понимания того, что делает код надежным, эффективным и обслуживаемым.

Читать The Daily WTF ( RSS-канал ); это заставит вас чувствовать себя лучше. Если этого не произойдет, возможно, вам придется пройти курс коррекции в области компьютерных наук.