Олег А.
252 сообщения
#18 лет назад
Котеров — отвратно. Это справочник, а не учебник, хотя позиционируется именно как учебник.
Вадим Т.
3240 сообщений
#18 лет назад
[quote="ArtLab"]Можно спорить конечно - я говорил не о "наглядности", а о производительности. В любом случае - в этом коде - лучше заменить на preg_replace, а вообще я максимально стараюсь использовать str_replace, где это возможно.[/quote]
В догонку про цепочку str_replace vs одного preg_replace. Не факт что в тех или иных случаях цепочка str_replace будет работать быстрее. Вот, посмотрите и запустите у себя пример, чтобы убедиться что не всегда цепочка str_replace быстрее (я проверял с консоли на PHP 4).

[code]<?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('|[0-4]|', '', 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);
}
?>[/code]

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

[code]<?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('|[0-4]|', '', 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);
}
?>[/code]
Константин Т.
589 сообщений
#18 лет назад
[quote="ArtLab"]
5) Нет защиты от XSS - атак
[/quote]

А можно привести версию с защитой от XSS атак в нужных местах?
Константин Т.
589 сообщений
#18 лет назад
[quote="tvv"]
- проблемы безопасности, ничто не мешает хакеру использовать этот скрипт на сайте Вашего заказчика в дорвей для рассылки спама
[/quote]

А как этим скриптом послать спам, можно пример?
Андрей Л.
457 сообщений
#18 лет назад
[quote="Pilat66"][quote="tvv"]
- проблемы безопасности, ничто не мешает хакеру использовать этот скрипт на сайте Вашего заказчика в дорвей для рассылки спама
[/quote]

А как этим скриптом послать спам, можно пример?[/quote]
curl, сокеты..

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

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

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

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

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

A!!! в "From: $email" можно добавить получателя, вот оно как! Ещё ни разу этой функцией не пользовался, теперь буду знать её хитрости.[/quote]
Учитесь пользоватся документацией, в частности php.net -
[code]bool mail ( string to, string subject, string message [, string additional_headers [, string additional_parameters]] )[/code]
Четвертый параметр, это header который сообщит получателю, от кого был получено письмо. Так что эти скриптом, который у Вас, можно только заспамить одного человека, а в частности Админа Петрова.
Константин Т.
589 сообщений
#18 лет назад
Да нет, в header можно, например, Bcc: вставить.
Всё равно mail() непригодная к использованию функция, так что для меня не опасная
Артём П.
124 сообщения
#18 лет назад
Pilat66, почему не пригодная?
Константин Т.
589 сообщений
#18 лет назад
Неизвестна судьба сообщения, неизвестно сколько времени уйдёт на положение в очередь.
Артём П.
124 сообщения
#18 лет назад
Pilat66, и что вы посоветуете использовать для этих целий?
Константин Т.
589 сообщений
#18 лет назад
Я пишу в базу письмо, а потом его отправляю спецскриптом по крону (примерно так). В окрестностях PEAR::Mail есть ссылка на аналогичный скрипт. Это хотя бы защищает от потерь времени и простоев при недоступности того, что использует mail().

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

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

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

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

Что-то похожее на то, что я описал, сделано в Mail_Queue - . Я подобный механизм делал не на php а на Perl, и с более сложной структурой почтовых сообщений, но принцип должен быть везде один и тот же.
Вадим Т.
3240 сообщений
#18 лет назад
[quote="ArtPetrov"]tvv, а Вы что скажите насчет mail(); ?[/quote]
Для отправки E-mails мне нравится использовать PHPMailer (), это из готовых. А вообще у меня есть для отправки почты еще и свой класс, который я использую в своих проектах, так получше.

[quote="AlekseySribnyj"][quote="Pilat66"][code]/*
* Отправка пиьсма
*/
$send=mail($to, $subject, $body, "From: $email");[/code]
A!!! в "From: $email" можно добавить получателя, вот оно как! Ещё ни разу этой функцией не пользовался, теперь буду знать её хитрости.[/quote]
Четвертый параметр, это header который сообщит получателю, от кого был получено письмо. Так что эти скриптом, который у Вас, можно только заспамить одного человека, а в частности Админа Петрова.[/quote]
Ну ребята, а если подумать? Смотрите, вот строка, которая включает в себя дополнительный хидер: "From: $email". А что мне мешает на вход подать методом POST $email, равный например такому: $email = "spamer@companydomain\nTo: youremail@yourdomain"? Только вместо "\n" нужно, передать реальный бинарный символ новой строки. Тогда как раз передастся нужный хидер сендмейлу или что там используется. И письмо уйдет не только админу, но еще и получателю youremail@yourdomain. Вот Вам и дорвей для спамеров получился.
Вадим Т.
3240 сообщений
#18 лет назад
Если кто хочет, может посмотреть как я обычно оформляю свои проекты и код:

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

Уже запостил этот проект на SourceForge, ожидаю проверку модератором... В общем, можете посмотреть, если будут замечания по коду, с удовольствием рассмотрю и буду благодарен. Надеюсь, этот пример поможет новым фрилансерам, которые спрашивают как оформлять свои исходники.
Константин Т.
589 сообщений
#18 лет назад
Вопрос не по теме, но мне непонятно, правильно ли указание
[code] * @copyright [/code]
вместе с лицензией GPL ?