Олег А.
252 повідомлення
#17 років тому
Котеров — отвратно. Это справочник, а не учебник, хотя позиционируется именно как учебник.
Вадим Т.
3240 повідомлень
#17 років тому
Цитата ("ArtLab"):
Можно спорить конечно - я говорил не о "наглядности", а о производительности. В любом случае - в этом коде - лучше заменить на preg_replace, а вообще я максимально стараюсь использовать str_replace, где это возможно.

В догонку про цепочку str_replace vs одного preg_replace. Не факт что в тех или иных случаях цепочка str_replace будет работать быстрее. Вот, посмотрите и запустите у себя пример, чтобы убедиться что не всегда цепочка str_replace быстрее (я проверял с консоли на PHP 4).

<?php
define('TEST', '***');

test("str_replace('4', '', str_replace('3', '', str_replace('2', '', str_replace('1', '', str_replace('0', '', TEST)))));");
test("str_replace(array('0', '1', '2', '3', '4'), '', TEST);");
test("preg_replace('||', '', TEST);");

function test($func) {
$tstart = array_sum(explode(' ', microtime()));
for ($i = 0; $i < 10000; $i++) eval($func);
$tend = array_sum(explode(' ', microtime()));
printf("%0.06f \n", $tend - $tstart);
}
?>


В даном примере что цепочка str_replace, что один str_replace с массивом параметров (с массивом работает почти так же, как и цепочка, но это и более наглядно, и предпочтительно по перфомансу) - но все это в данном случае это работает медленнее чем preg_replace, который делает то же самое.
Вадим Т.
3240 повідомлень
#17 років тому
Вот этот же пример для тех, кто мне пишет что из-за eval() получаются неправильные результаты в данном тесте. Пусть убедятся в обратном.

<?php
define('TEST', '***');

test('testA1');
test('testA2');
test('testB');

function testA1() {
str_replace('4', '', str_replace('3', '', str_replace('2', '', str_replace('1', '', str_replace('0', '', TEST)))));
}

function testA2() {
str_replace(array('0', '1', '2', '3', '4'), '', TEST);
}

function testB() {
preg_replace('||', '', TEST);
}

function test($func) {
$tstart = array_sum(explode(' ', microtime()));
for ($i = 0; $i < 10000; $i++) $func();
$tend = array_sum(explode(' ', microtime()));
printf("$func: %0.06f \n", $tend - $tstart);
}
?>
Константин Т.
589 повідомлень
#17 років тому
Цитата ("ArtLab"):

5) Нет защиты от XSS - атак


А можно привести версию с защитой от XSS атак в нужных местах?
Константин Т.
589 повідомлень
#17 років тому
Цитата ("tvv"):

- проблемы безопасности, ничто не мешает хакеру использовать этот скрипт на сайте Вашего заказчика в дорвей для рассылки спама


А как этим скриптом послать спам, можно пример?
Андрей Л.
457 повідомлень
#17 років тому
Цитата ("Pilat66"):
Цитата ("tvv"):

- проблемы безопасности, ничто не мешает хакеру использовать этот скрипт на сайте Вашего заказчика в дорвей для рассылки спама


А как этим скриптом послать спам, можно пример?

curl, сокеты..

Pilat66,
Вы не заметили как там данные "проверяется", сторонний скрипт легко отправит сообщение?

Вот такая вот рассылка вот вам и XSS атаки
Вадим Т.
3240 повідомлень
#17 років тому
Цитата ("Pilat66"):
Цитата ("tvv"):

- проблемы безопасности, ничто не мешает хакеру использовать этот скрипт на сайте Вашего заказчика в дорвей для рассылки спама

А как этим скриптом послать спам, можно пример?

Pilat66, запросто. Неужели Вы не поняли как это делается, и сомневаетесь в моих словах? Вот например ADI правильно говорит. Посмотрите как в том скрипте передаются данные для отправки, включая E-mail получателя. Как Вы видите - методом POST! Значит, при этом можно вызывать этот скрипт извне, например через CURL с другого хоста, подставляя поочередно разные E-mails из базы данных, и эта спам рассылка будет идти от админа сайта, на котором этот скрипт установлен (и, конечно, с IP адреса этого сайта).
Константин Т.
589 повідомлень
#17 років тому
Я, наверно, туповат, но tmail получателя забит жёстко в текст?
	 /*
* На какой Email отправка.
*/
$to = '***';

/*
* Отправка пиьсма
*/
$send=mail($to, $subject, $body, "From: $email");


A!!! в "From: $email" можно добавить получателя, вот оно как! Ещё ни разу этой функцией не пользовался, теперь буду знать её хитрости.
Гость
156 повідомлень
#17 років тому
Цитата ("Pilat66"):
Я, наверно, туповат, но tmail получателя забит жёстко в текст?
	 /*
* На какой Email отправка.
*/
$to = '***';

/*
* Отправка пиьсма
*/
$send=mail($to, $subject, $body, "From: $email");


A!!! в "From: $email" можно добавить получателя, вот оно как! Ещё ни разу этой функцией не пользовался, теперь буду знать её хитрости.

Учитесь пользоватся документацией, в частности php.net -
bool mail ( string to, string subject, string message ] )

Четвертый параметр, это header который сообщит получателю, от кого был получено письмо. Так что эти скриптом, который у Вас, можно только заспамить одного человека, а в частности Админа Петрова.
Константин Т.
589 повідомлень
#17 років тому
Да нет, в header можно, например, Bcc: вставить.
Всё равно mail() непригодная к использованию функция, так что для меня не опасная
Артём П.
124 повідомлення
#17 років тому
Pilat66, почему не пригодная?
Константин Т.
589 повідомлень
#17 років тому
Неизвестна судьба сообщения, неизвестно сколько времени уйдёт на положение в очередь.
Артём П.
124 повідомлення
#17 років тому
Pilat66, и что вы посоветуете использовать для этих целий?
Константин Т.
589 повідомлень
#17 років тому
Я пишу в базу письмо, а потом его отправляю спецскриптом по крону (примерно так). В окрестностях PEAR::Mail есть ссылка на аналогичный скрипт. Это хотя бы защищает от потерь времени и простоев при недоступности того, что использует mail().

Вообще у меня есть желание полностью взять под контроль процесс отправки, но пока придётся ограничиться анализом логов почтового сервера. Иногда надо знать, когда письмор реально отправилось и что удалённый сервер ответил.
Артём П.
124 повідомлення
#17 років тому
tvv, а Вы что скажите насчет mail(); ?
Станислав Малкин
1410 повідомлень
#17 років тому
Цитата ("Pilat66"):
Я пишу в базу письмо, а потом его отправляю спецскриптом по крону (примерно так). В окрестностях PEAR::Mail есть ссылка на аналогичный скрипт. Это хотя бы защищает от потерь времени и простоев при недоступности того, что использует mail().

Вообще у меня есть желание полностью взять под контроль процесс отправки, но пока придётся ограничиться анализом логов почтового сервера. Иногда надо знать, когда письмор реально отправилось и что удалённый сервер ответил.


Насколько я знаю, PEAR::MAIL и аналогичные в итоге тем же mail() все и отправляет. Пакет - всего лишь обертка для этой функции.
Константин Т.
589 повідомлень
#17 років тому
Цитата ("ArtLab"):

Насколько я знаю, PEAR::MAIL и аналогичные в итоге тем же mail() все и отправляет. Пакет - всего лишь обертка для этой функции.


Это и не совсем так - поддерживается несколько методов, и не совсем об этом я пишу. Моя идея (и не только моя, это общепринятая методика) - посылать письмо не тем скриптом, который принимает запрос от пользователя, а отдельным, работающим в бэкграунде. Это сильно повышает надёжность отправки почты и не вызывает задержки у пользователя. Если посмотреть на многоие сайты, которые зачем-либо отсылают почту - очень часто по несколько секунд или минут после нажатия на кнопку "Отправить" скрипт что-то делает, на самом деле он, например, вызывает сто копий sendmail - из-за этого и задержка, и нагрузка на процессор, и потеря почты как результат аварийного завершения скрипта по каким-либо причинам.

Что-то похожее на то, что я описал, сделано в Mail_Queue - . Я подобный механизм делал не на php а на Perl, и с более сложной структурой почтовых сообщений, но принцип должен быть везде один и тот же.
Вадим Т.
3240 повідомлень
#17 років тому
Цитата ("ArtPetrov"):
tvv, а Вы что скажите насчет mail(); ?

Для отправки E-mails мне нравится использовать PHPMailer (), это из готовых. А вообще у меня есть для отправки почты еще и свой класс, который я использую в своих проектах, так получше.

Цитата ("AlekseySribnyj"):
Цитата ("Pilat66"):
/*
* Отправка пиьсма
*/
$send=mail($to, $subject, $body, "From: $email");

A!!! в "From: $email" можно добавить получателя, вот оно как! Ещё ни разу этой функцией не пользовался, теперь буду знать её хитрости.

Четвертый параметр, это header который сообщит получателю, от кого был получено письмо. Так что эти скриптом, который у Вас, можно только заспамить одного человека, а в частности Админа Петрова.

Ну ребята, а если подумать? Смотрите, вот строка, которая включает в себя дополнительный хидер: "From: $email". А что мне мешает на вход подать методом POST $email, равный например такому: $email = "spamer@companydomain\nTo: youremail@yourdomain"? Только вместо "\n" нужно, передать реальный бинарный символ новой строки. Тогда как раз передастся нужный хидер сендмейлу или что там используется. И письмо уйдет не только админу, но еще и получателю youremail@yourdomain. Вот Вам и дорвей для спамеров получился.
Вадим Т.
3240 повідомлень
#17 років тому
Если кто хочет, может посмотреть как я обычно оформляю свои проекты и код:

Что это такое? После проекта решил сделать свой небольшой Open Source проектик для работы с MULTI CURL PHP extension. Так как это уже 4-й или 5-й заказчик или фрилансер с Weblancer.net, который меня просит проконсультировать на эту тему.

Уже запостил этот проект на SourceForge, ожидаю проверку модератором... В общем, можете посмотреть, если будут замечания по коду, с удовольствием рассмотрю и буду благодарен. Надеюсь, этот пример поможет новым фрилансерам, которые спрашивают как оформлять свои исходники.
Константин Т.
589 повідомлень
#17 років тому
Вопрос не по теме, но мне непонятно, правильно ли указание
 * @copyright 

вместе с лицензией GPL ?