PHP сообщество

любители кода :)

Очистка таблицы через угадывание id

Bloged in Без рубрики от admin Понедельник Январь 14, 2008 at about 12:29 пп

Допустим у нас есть таблица. Есть функция удаления элемента из таблицы по id, реализованная в скрипте delete.php. И есть хакер, который пишет скрипт, который делает запросы delete.php?id=$id, где $id из 1..1000000. Как защититься от такой атаки?

UPD Хм, я сам уже догадался. Такая возможность должна быть доступна только авторизованному пользователю, вот и всё.

о сокетах, потоках и т.д.

Bloged in Без рубрики от admin Понедельник Январь 14, 2008 at about 8:21 дп

Стоит задача написать публичный веб-чат. Потоковый.
Решил все это делать на базе ирц. То есть транспортом сообщений будет заведовать ирц демон. Ирц потому что я неоднократно сталкивался с этим протоколом и он мне знаком.

На первый взгляд казалось все просто - коннектимся, авторизуемся, заходим на канал и дальше бесконечный цикл, который умрет только при разъединении соединения. Отвечать на пинги не сложно. Получать сообщения, обрабатывать их и явой выводить в нужный фрем тоже труда не составляет. Проблема возникла в другом - как снаружи отправить данные в этот цикл, как снаружи инициализировать выход из цикла? В общем подход не совсем удачный. Я уже не говорю про ресурсопожираемость.

Немного погуглив пришел к выводу, что от клиентсервероной прослойки не уйти. Получается что-то типа:
Web Based Client (на стороне клиента) <–> IRC Proxy (на сервере) <–> IRC daemon

ирц прослойку можно реализовать на C, коннектиться с обмениваться сообщениями с ирц демоном проблем не составит. Как реализовать потоковую двухстороннюю связь между браузером клиента и прослойкой? Может кто знает как оно реализовано на voodoochat или php-spb-ru (или как он там правильно называется) чате? Вот на эту тему хотелось бы подискутировать.

Парсинг XML данных

Bloged in Без рубрики от admin Воскресенье Январь 13, 2008 at about 3:18 пп

Неужели парсинг формата XML - такая непростая задача?
Почему чуть ли не на каждом хостинге её нужно решать своим способом и обязательно с кучей гемороя? Начиная от кодировки и заканчивая проблемой отсутствия той или иной либы в составе ПХП?
Почему даже при наличии либы один и тот же XML файл, одним и тем же скриптом - на одном компе читается, а на втором нет?

В общем вопрос такой - чем и как преобразовать XML документ в хэш-массив на 4-ом PHP?

скачка посетителем из запароленной директории

Bloged in Без рубрики от admin Пятница Январь 11, 2008 at about 10:53 пп

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

вот как раз и прошу совета по поводу этого скрипта)) ума не приложу в каких функциях пхп мне стоит покапаться.

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

scaffold

Bloged in Без рубрики от admin Пятница Январь 11, 2008 at about 5:55 пп

Есть ли какие нибудь scaffoldы на пхп? а то посмотрел щяс как у руби с этим и сижу облизываюсь……

Работа c SimpleXml с помощью Xpath

Bloged in Без рубрики от admin Вторник Январь 8, 2008 at about 1:49 пп

Хочу вот поделиться с сообществом скромными наработками по SimpleXml и Xpath, надеюсь, что кому-нибудь это может пригодиться.

Устройство

SimpleXml – встроенное в php5 расширение для работы с XML (доступно по умолчанию). Суть работы, которого заключается в преобразовании XML документа в некий объект (типа SimpleXMLElement).
После преобразования любой узел XML документа может быть представлен объектом SimpleXMLElement, который по сути является массивом.
Например, пусть имеется XML документ, представленный ниже:

<?xml version=”1.0″ encoding=”utf-8″ standalone=”yes”?>
<html>
 <body>
   <div id=”head”>text</div>
   <div id=”content”>
      <p></p>
      <p></p>
      <p>
	  <label>text</label>
      </p>
      <p></p>
   </div>
   <div id=”footer”>
     text
     <p></p>
     <p></p>
   </div>
 </body>
</html>

после преобразования SimpleXml:
$xml = simplexml_load_file($xmlfile);
или
$xml = simplexml_load_string($xmlstring);
смотря, где у нас расположен XML документ (в файле или строке)

мы получим объект $xml типа SimpleXMLElement, который содержит другие такие же SimpleXMLElement объекты (соответствующие преобразованные узлы исходного XML документа).

Т.е. узел (в данном случае корень) <html></html> это сам $xml или $xml[0] (помните про массивы?), а узел <body></body> это $xml->body ($xml[0]->body[0] или $xml->body[0]), а узел <div id=”footer”></div> это $xml->body->div[2] или $xml[0]->body[0]->div[2].

Далее необходимо сделать некоторые пояснения (для наглядности, на примере узла <div>):
1. Объект SimpleXMLElement всегда указывает на текстовое содержимое одноименного узла, т.е. текст, который содержится между <div></div>, при этом (для случая чтения) записи div и div[0] эквивалентны, т.е. они обе всегда указывают на 1-й элемент массива.
(т.е. echo $xml->body->div выведет 'text', и echo $xml->body->div[0] тоже выведет 'text'. А вот echo $xml->body->div[1] уже не выведет ничего, т.к. в <div id=”content”></div> нет текстового содержимого).
2. Исходя из вышесказанного для изменения текстового содержимого узла документа XML достаточно выполнить:
а) $xml->body->div='test1' (этот вариант будет работать только если div единственный потомок своего родителя, в противном случае выскочит Warning.
б) $xml->body->div[0]='test1' (этот вариант будет работать всегда, но при этом потомки не учитываются!, т.е. $xml->body->div[1]='test1' уничтожит всех потомков <div id=”content”> оставив <div=”content”>text1</div>).
3. Помните про то, что каждый узел в представлении SimpleXML это массив? Так вот (как можно было заметить из приведенных выше примеров), если одноименный потомок у родителя один, то это массив из одного элемента, а если их несколько, то соотвестственно массив из нескольких элементов.
(т.е. как видим из исходного XML документа, $xml->body[0] - массив из 1 элемента, а $xml->body->div - массив из нескольких элементов.)
4. Если у узла в исходном XML документе имеются свойства или при добавлении оных средствами SimpleXML, то к объекту SimpleXMLElement можно обращаться как двухмерному массиву, где 2-ой массив - массив свойств.
(т.е. echo $xml->body->div[0]['id'] выведет head, а $xml->body->div[0]['id']='new_id' установит новое свойство id).
И соответсвенно, если у узла нет свойств, то их можно добавить так: $xml->body[0]['id']='body_id'.
5. Помимо всего объект SimpleXMLElement имеет свои методы, о которых можно узнать из официальной документации.

Таким образом мы можем обратиться к любому узлу. Но стоит заметить, что чем больше вложенность узлов, тем неудобней к ним обращаться: например, чтобы обратиться к узлу <label></label> нам потребуется написать следующее:
$xml->body->div[1]->p[2]->label.
А если вложенность будет еще больше? То вышеприведенная строчка может удлиниться. К счастью есть такая штука как Xpath и SimpleXML может с ней работать.

Xpath

Для работы с Xpath достаточно обратиться c нужным запросом к методу xpath(), который выполнит поиск и вернет нам массив найденных объектов SimpleXMLElement, которые будут соответствовать узлам преобразованного XML документа. Например:
$result = $xml->Xpath(”//*”); - найдет вообще все объекты;
$result = $xml->Xpath(”//div”); - найдет все объекты div;
$result = $xml->Xpath(”//div[@id='head']”); - найдет 1 объект div c id = head;
$result = $xml->Xpath(”//*[text()='text']”); - найдет все объекты, текстовое содержание которых = 'text'.

И так далее, подробнее о функциях и предикатах Xpath можно узнать из официальной документации по Xpath, стоит заметить, что не все они подходят для использования в методе xpath().

Обобщение

С учетом вышесказанного можно создать так называемые “обертки” (например) вокруг метода xpath(), с помощью которых можно делать такие вещи:
<?php
// подключаем “обертку”
require_once('smplxmlfunc.php');
// преобразуем XML документ
$xml = simplexml_load_file($xmlfile);

/**
* работаем с “обертками”
*/
// устанавливаем всем div уникальные ID

setId($xml, '//div');
// добавляем в div картинки
addNode($xml, '//div', 'img');
// задаем картинкам атрибут alt
addAtrribute($xml, '//div/img', 'alt');
// удаляем div с id=3 со всеми потомками
removeNode($xml, “//div[@id='3']”, 'all');

// сохраняем
$xml->asXML($xmlfile);
// при необходимости форматируем (убираем лишние пробелы, расставляем табуляцию для читабельности)
trimXml($xmlfile);
?>

Скачивание файлов через скрипт

Bloged in Без рубрики от admin Понедельник Январь 7, 2008 at about 9:03 пп

Есть необходимость отдавать юзеру файлы с сервера через скрипт, одной из задач которого является антилич, с чем благополучно и легко справился. Но есть вторая задача - ограничить кол-во коннектов (потоков) с одного IP, а то убивает сервер наповал.

Поискал скрипты в сети, не нашел. Никто не подскажет готовый материал или хотя бы пример кода или идеи, как это реализовать?

Спасибо.

Выделение блоков в html

Bloged in Без рубрики от admin Суббота Январь 5, 2008 at about 6:47 дп

Есть массив, элементы которого - html текст. Все элементы имеют одну и ту же структуру.
Задача - наиболее оптимальным способом выцепить из этих элементов куски.

Поясню. Например элемент представляет из себя что-то вроде:

    <td>текст1</td></td></td>
    <div>текст2</div></td>
    <a href=”">ссылка1</a>

Заранее структура элемента не известна, и требуется получить на выходе текст1, текст2, ссылка1. Элемент может содержать “шумы”, т.е. структура не обязательно правильно оформлена - например это появление двух лишних </td></td> после текст1

Как лучше всего это сделать? Может с DOM напрямую работать, оттуда проще будет выцепить?
Мб есть готовые функции на php для разбора структуры?

UPD: текст1, текст2 совершенно произвольный и может в ключать в себя html код. Например, первые два элемента массива могут быть просто текстом, тогда как третий элемент будет содержать табличку. Общая структура элемента при этом останется неизменной, а вот “формат” текста1 будет разным.

UPD1: Реализована промежуточная версия, которая генерирует фиды, скачивая каждый пост из френдленты. С кэшированием.

Кодировка в xmlrpc

Bloged in Без рубрики от admin Среда Январь 2, 2008 at about 12:00 пп

Прошу помощи клуба.
В полном соответствии с http://vexer.ru/lits/?id=028 посылаю текст в ЖЖ, получаю на выходе кодировку ISO.
Меняю в xmlrpc.inc
$GLOBALS['xmlrpc_internalencoding']='ISO-8859-1';
на
$GLOBALS['xmlrpc_internalencoding']='UTF-8';
- выдает “Application failed during request deserialization: reference to invalid character number at line 20, column 15, byte 463 at /usr/lib/perl5/XML/Parser.pm line 187″.
Где еще поискать?

по теории экранирования

Bloged in Без рубрики от admin Среда Январь 2, 2008 at about 9:39 дп

для экранирования строк есть несколько функций, в частности для БД mysql:
mysql_escape_string() и mysql_real_escape_string()
вторая, кроме строки принимает параметром ещё и указатель на соединение и экранирует в зависимости от кодировки.
вопрос: имеет ли значение какую функцию использовать для cp1251? а для utf8?
ведь специальные символы встречаются только в первой половине кодовых страниц.