PHP

Val Petruchek

подписывайтесь, а то хуже будет!  

ПОДПИСЫВАЙТЕСЬ НА RSS

Как удалить фотки из вконтакта

Навеяно материалом с роема.

Пользователь вконтакта:

Больше, чем месяц назад я удалил все свои альбомы с фотографиями. Я не собираюсь их восстанавливать и не хочу, чтобы эти фотографии находились на серверах ВКонтакте, а так же были доступны по прямым ссылкам, например: http://csxxx.vkontakte.ru/uxxxx/xxxxxxx

Саппорт вконтакта:

Фотографии не удаляются с серверов полностью для избежания дефрагментации на них. Данные фотографии доступны исключительно по прямым ссылкам и, соответственно, никто и никогда не сможет их открыть, а нам это тем более не нужно.

Дуров вконтакта:

Если бы для доступа к статике (фотографиям) дергался Apache и PHP (технологии, необходимые для вывода остального контента с авторизацией), то система не прожила бы и минуты даже при 1% текущей нагрузки.

Теоретически проблема решаема, разумеется. Но мы принципиально не делаем шаги, которые нам самим как пользователям не представляются необходимыми. Скажем, за многие годы пользования разными социальными сетями у меня не возникало жгучей потребности проверять какие-то там прямые ссылки. Возникнет - сделаем.

Во-первых, Дуров утверждает, что дёргать php при каждом запросе к каждой фотке, чтобы проверить, есть ли у текущего пользователя доступ к этой конкретной фотке.

Это разумно: выдернуть сессию текущего пользователя, выдернуть информацию о фотке (владелец и его уровни приватности, альбом этой фотки и его публичность) - большой объём работы для такой простой задачи, как отдача одной картинки.

Поэтому, чтобы облегчить жизнь серверам, вконтакте решает проблему по-другому: каждой фотке присваивается неподбираемый URL. Если пользователь узнал этот урл, то значит у пользователя есть доступ к этой фотке.

Если же у пользователя исчезает доступ к фотографии (например, пользователя удаляют из друзей), то этот урл пользователю больше нигде не светится.

Если пользователь каким-то образом сохранил прямой адрес фотки, то он может ею любоваться и дальше. На первый взгляд, это кажется “уязвимостью”, ведь доступа уже быть не должно, а он есть. Но на эту уязвимость можно смотреть по-другому: когда у пользователя появился доступ к фотографии, он мог безболезненно сохранить её себе на жёсткий диск, и продолжать любоваться ею даже после то, как доступ у него заберут. Просто вместо винчестера юзера фотка “сохраняется” на сервере вконтакта.

Т.е. выдачу прав к фотографии надо рассматривать как перманентную, а не временную, тогда и уязвимости никакой нет.

Во-вторых, Дуров пишет, что удалять фотки удалённых аккаунтов получается очень накладно, т.к. повышается фрагментированность жёстких дисков на серверах, поэтому владельцы удалённых аккаунтов должны довольствоваться тем, что урлы их фоток больше нигде светиться не будут, если кто-то сохранил себе урл, то вотку сможеть видеть даже после удаления аккаунта владельца.

В дефрагмегтированность верю, поэтому нежелание удалять фотки понятно - и производительность пострадает, и винты будут умирать быстрее.

А вот почему нельзя вместо удаления просто переименовывать файлы, не понимаю. Помечать таким образом файлы, которые надо удалить, и всё. Старые урлы не работают, файл живёт до тех пор, пока винт не умирает (и при перезеркаливании в рейде эти файлы просто удаляются).

Более того, мои скромные познания в линуксо/юниксах наводят меня на мысль о том, что файлы можно даже не переименовывать, а просто поставить на эти файлы такие права, чтобы пользователь, от имени которого работает вебсервер (nginx небось), не мог их читать.

Вот и всё, и данные “удалены”, и сервера не “дефрагментированы”. Более того, “удалённые” таким образом фотографии могут быть восстановлены, если владелец одумается и вернётся в лоно ВК.

Может я чего-то не понимаю в специфике работы больших сайтов™? Или VK просто душит жаба, что “удалённые” таким образом фотографии будут лежать мёртвым грузом на винтах - и показывать пользователям нельзя, и удалить нельзя (дефрагментация ведь!)?

Как проверить, анимированный ли gif файл

20.07.10 @ 00:24 — PHP

function is_ani($filename)
{
    return (bool)
preg_match(‘#(\x00\x21\xF9\x04.{4}\x00\x2C.*){2,}#s’file_get_contents($filename));
}

php.net, там в комментах всегда куча сниппетов)

Как ломают сапу

17.07.10 @ 14:28 — Programming, PHP, WebSites

На форуме сапы человек пожаловался на “левые ссылки” среди продажных:

1. Их нет в списке ссылок на акаунте,
2. В sape акаунте прописан style для вывода ссылок, левые же выводятся без этого style

Хеш код один и все ссылки выводит sape_links - если из шаблона убрать конструкцию sape_links - не выводятся не левые ни правые ссылки.

Обнуление links.db ничего не дало, файлик создался опять и те же левые ссылки так же появились..чё думать ума не приложу..

Выяснили, что на сайте стоит “похаченный” sape.php:

Методика данного хака такая:
1. на сервер кидается файл (тут надо или фтп, или аналогичный доступ) под любым именем. В данном случае этот файл был спрятан в качестве jpg фотографии из галереи.

2. В sape.php вносится два изменения в return_links():
$f_name = base64_decode(’************’);
require_once($f_name);
где ********* - “закодированное” имя файла, кинутого на сервер на первом этапе

3. ….

4. PROFIT!!!

Внутри файла - “закодированный” php. Закодированность заключается в нечитаемости исходников, но раскодировать их несложно - используются функции base64_туда, base64_сюда, eval, пляска с файлом (файл открывает сам себя, считывает оттуда закодированный код, раскодирует его и выполняет).

По итогу закодированным оказывается код с другой биржи (типа линкфида), который ставится поверх сапы, и позволяет одновременно обрабатывать и сапоссылки, и свои ссылки. Вот цитата из кода:

define(’LINKFEED_USER’,'3baa192191449805df730ce2cea07a6f13408b14′);
define(’__SAPE_USER’,'’);
define(’_ML_ID’,'2BF37BAF09C11EECC16AF32F77063F20′);

По идее для такого хака нужен фтп доступ на сайт, т.к. даже если в директорию галереи (зачастую с правами доступа 0777) теоретически мог нагадить кто угодно на сервере, то sape.php при стандартных настройках не должен быть доступен.

Я бы посоветовал всем пользователям сапы - параноикам проверять sape.php на предмет изменений (для данного хака характерно наличие base64_decode — в нормальном (моём) sape.php эта функция не вызывается).

Ведванольненькие кроссворды онлайн

04.01.10 @ 22:39 — JavaScript, PHP, Creative

У меня тут бешеный траффик (и гневные комментарии возмущённых пользователей) по запросу “программа для составления кроссвордов скачать бесплатно“, поэтому отрекламирую тут свой новый сайт с онлайн кроссвордами.

Я переписал старенький генератор (с паскаля на пхп) кроссвордов по заданной сетке, написал генератор тематических кроссвордов (сыроват пока), и с нуля сделал javascript.

Кроссвордов на сайте пока мало (да и те старые), но интерфейс меня прёт.

Баги (особенно интересуют макинтоши) можно мне в комменты писать (тут или в жж), добрые люди уже рассказали про Firefox+Search for text when I start typing.

PHP фреймворки

08.10.08 @ 23:45 — Programming, PHP

Тут вот соседи из Кривого Рога прутся от использования Zend Framework:

На работе проект разрабатываем с использованием Zend Framework […] основан на Model-View-Controller […] контроллер должен соответствовать правилам именования […] накладывает серьезные правила на структуру каталогов […] иногда фреймворк предоставляет мало свободы там, где стандартными методами тяжело обойтись и приходится сталкиваться с нетипичными задачами.

Я тут тоже встрял в один проект с использованием фреймворка, правда другого. Ощущения те же самые — да, фреймворк вынуждает писать код в парадигме MVC. Да, файлы надо разносить по соответствуюшим директориям.

Но при необходимости выйти за пределы дозволенного и решить нетипичную задачу (изящно подрубиться к фреймворку, например, для авторизации пользователя в стороннем скрипте) приходится бороться с фреймворком. И необходимость этой борьбы (зачастую изнурительной) полностью перечёркивает все достоинства фреймворка.

Достоинства эти, кстати, довольно сомнительные.

Правильное воплощение парадигмы MVC зависит не от фреймворка, а от программиста: криворукий сумеет смешать MVC в кучу даже во фреймворке, а программист с головой сможет кодить в стиле MVC даже без ООП, на функциях.

А вот необходимость заюзать фреймворк нестандартно возникнет обязательно, на то он и фреймворк. И если для её реализации понадобится возиться с фреймворком длительное время, то ну его наверное нафиг.

На данном этапе наиболее удобным мне кажется использование самописного фреймворка с максимальным включением сторонних библиотек: шаблонизатора (BTW, Smarty рулят), форм-процессора, database access layerа (что-нибудь с поддержкой Active Records), мейлера (создателям PHPMailerа — риспект и уважуха), jquery и далее по вкусу.

PHP послать письмо через gmail

05.06.08 @ 09:56 — PHP, Google

Задача: средствами PHP отправить письмо через smtp.gmail.com. Не просто с указанием адреса @gmail.com в поле From:, а именно через гугловский сервер.

Зачем это нужно? Во-первых, на многих хостингах существуют всяческие ограничения по использованию почты. Во-вторых, такое письмо должно выглядеть “белее” письма, отправленного локальным smtp: меньше шансов, что оно попадёт в junk folder.

Основная проблема, которая возникает при отправке письма через smtp.gmail.com и не возникает при отправке писем по smtp через другие, более обычные сервера, состоит в необходимости использования TLS соединения на 465 порт.

Отправить письмо из PHP напрямую через SMTP сервер (а не через mail() или sendmail) можно давно с помощью LGPL библиотеки PHPMailer.

Оказывается, начиная со второй версии, разработчики библиотеки добавили поддержку отправки почты по SMTP по безопасному соединению. Вот code snippet, формирующий правильный вызов метода отправки письма при использовании гугловского smtp:

     $mail->Mailer “smtp”;  
     $mail->SMTPAuth true;  
     $mail->SMTPSecure “tls”;
     $mail->Host “smtp.domain.com”;  
     $mail->Port “465″;  
     $mail->Username “email.address@gmail.com”;  
     $mail->Password “1W0N’T_t3ll-U”;  

Разработчики библиотеки не волшебники: для отправки писем по безопасному SMTP-соединению необходим PHP с поддержкой OpenSSL.

PHP — 3 notes

04.03.08 @ 16:21 — JavaScript, PHP

Три коротких заметки про PHP.

1. Kevin van Zonneveld разрабатывает библиотеку php.js — стандартные php функции, портированные на JavaScript. Естественно, не все функции портированы, на данный момент их 114. Не рекомендуется к просмотру людям, не знающим, как передать переменную из JavaScript в PHP — окончательное разжижение мозга (до состояния “каша в голове”) гарантированно.

2. Каким, по вашему, будет результат вызова in_array(”68_105″,array(68,16,123))? Оказывается, у функции in_array() есть третий параметр — [bool strict]. С его помощью можно включить поиск в массиве не только по значению, но и по типу.

3. Только начиная с версий 4.4.0 и 5.0.2 PHP функция sort() умеет использовать установки локали (с помощью флага SORT_LOCALE_STRING). Для более ранних версий (хотя пора уже проапгрейдиться) можно использовать костылик usort($array, “strcoll”)

HTTPS запросы в Curl PHP не работают

25.01.08 @ 07:57 — PHP

Не в первый раз сталкиваюсь, и всё время забываю: не срабатывает curl при https запросе из php4 на win32 (в стандартной установке). HTTP запросы отрабатываются нормально, а HTTPS — нет.

Помогает выключение опции CURLOPT_SSL_VERIFYPEER а так же опции CURLOPT_SSL_VERIFYHOST:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);

Update: я не сильно разбираюсь в настройках Curlа, но по-моему эта же проблема может возникать и на не-windows серверах.

PHP (ссылки)

30.10.07 @ 06:06 — Links, PHP

Несколько PHP-ссылок:

Украинские ИНН

29.10.07 @ 14:20 — Programming, PHP, Ukraine

Встретил у Болка запись о том, как формируются номера российских ИНН. Стало интересно, как с этим обстоит дело у нас.

Итак, украинский ИНН (индивидуальный налоговый номер) состоит из 10 цифр. В нём зашифрованы:

  • дата рождения (первые пять цифр образуют число, равное количеству дней от 01.01.1900 до даты рождения владельца ИНН);
  • пол (чётность девятой цифры: четная цифра – женский, нечетная – мужской);
  • checksum, т.е. контрольное число (последняя цифра)

Как считается контрольная цифра я пока что не знаю. Здесь можно проверить, как работает большой брат, исходники большого брата — под катом.

Забавные факты про украинский ИНН:

  • физическим лицам, которые из-за своих религиозных или других убеждений отказываются от принятия идентификационного номера, официально сообщили об этом соответствующим органам государственной власти и имеют соответствующую отметку в паспорте, предоставляется идентификационный номер в виде номера и серии паспорта таких лиц (src);
  • иностранцы не могут отказаться от кодов, даже если они имеют соответствующие религиозные убеждения. Причина: украинские власти не могут внести соответствующую отметку в их паспорт (см. предыдущий пункт) и присвоить ИНН по номеру паспорта. Зачем нужен украинский ИНН иностранцу? Чтобы иметь возможность стать учредителем юрлица или заниматься предпринимательской деятельностью на территории Украины (src);
  • я не смог найти в сети информацию о том, какие ИНН присваиваются гражданам, родившимся в 19 веке (т.е. до 01.01.1900 года).

Отдельно хочется процитировать каких-то религиозных маразматиков (орфография и пунктуация сохранены):

Как здесь не заметить, что определенные проблемы будут ощущать, например, лица, которые изменили свой пол.

Понятно, что не сложно написать программу, которая к 1 января 1900 года прибавит число и получит дату рождения. Так что, милые дамы, со старинным правилом этикета, согласно которого о Вашем возрасте спрашивать было не принято, придется расстаться. У технотронного века свой жесткий и далекий от условностей приличия “этикет”.

Мой вам совет, милые дамы: если кто-то выспрашивает у вас ваш ИНН, отнеситесь к нему с подозрением!

(more…)

Next Page »   
Реклама::

 
Реклама::