title
Description
Body
Имеется скрипт сервиса гостевых книг. При первом взгляде сразу бросается в глаза его не оптимизированность. Т.е. расходуется слишком много системных ресурсов.
Например имеется код
|
|
если его переписать следующим образом
|
|
то это даст небольшой прирост производительности, а главное код воспринимается легче, ИМХО.
Далее, в скрипте используется постоянное соединение с MySql, я думаю все же лучше заменить mysql_pconnect на mysql_connect
заменяем
|
|
на
|
|
Так же можно изменить имена переменных на более короткие, и вообще сделать их константами.
Это так же даст небольшой прирост производительности
В файле functions.php видим функцию транслита, сделано с помощью 65 функций str_replace
Этот код так же можно переписать следующим образом
|
|
точно то же самое с заменой смайлов в файле convert_to_smiles.php
Неактивен
далее смотрим довольно интересный файл filtro.php приведу его содержание здесь
|
|
и сразу замечание - для фильтрации лучше использовать т.н. "белый список" , а не "черный" - что это значит?
А значит это вот что - лучше создать список символов разрешенных для передачи скрипту, чем запрещать потенциально опасные символы. Очень хорошо помогают в этом регулярные выражения.
Данный код можно переписать следующим образом
|
|
1) Цифры следует писать без кавычек, что мы и сделали
2) Если читабельность кода не сильно пострадает, то лучше несколько функций обьеденить в одну конструкцию, тоже сделали
3) Убрали из замены символы chr(9), chr(10), chr(13) - это символы табуляции, они вполне могут пригодиться в дальнейшем и опасности в себе не несут.
4) Еще можно добавить функцию nl2br - она заменит переносы строк на <br />
Т.к. в переменной $a могут находиться довольно много символов, то обрабатывать ее регулярным выражением ее не будем. Но если это, например, пароль или логин, то лучше проверять их регулярными выражениями. Об этом чуть позже.
Неактивен
Дальше будем изучать "основной" файл скрипта - index.php
В начале кода видим следующую конструкцию
|
|
Спрашивается, зачем $ref = $_GET["ref"];, если дальше мы все равно присвоим переменной $ref значение от rand(10000,1000000); ?
$ref = $_GET["ref"]; убираем.
Еще дальше видим код
|
|
здесь абсолютно не нужно! Ведь далее мы все равно переменной $id присвоим целочисленное значение с помощью intval
Заменяем весь этот код на
|
|
Смотрим дальше
|
|
Здесь помимо проблем с оптимизацией видим проблемы со стилем... ( хотя, смотря на этот скрипт, мы это видим постоянно )
Переписываем так
|
|
Поскольку ранее переменной $id мы присвоили тип int, то и передавать эту переменную следует как int, так же SQL комманды принято писать В ВЕРХНЕМ РЕГИСТРЕ. Очень советую этого придерживаться.
Неактивен
|
|
т.к. в дальнейшем не предполагается использовать нумерованный массив, а только ассоциативный, заменяем mysql_fetch_array на mysql_fetch_assoc
далее файл регистрации - reg.php
|
|
Очень интересно, все переменные обрабкатываются функцией filtro, которую мы рассмотрели ранее.
Но ведь не бывает таких универсальных решений, которые бы корректно обрабатывали и e-mail, и пароли, и ссылки, и просто какой-нибудь текст! В данном случае этот код необходимо переписать обязательно!
Я бы сделал примерно так
|
|
$title = substr(filtro($_POST['title']),0,25);
$sitename = substr(filtro($_POST['sitename']),0,25);
$razdel = substr(filtro($_POST['razdel']),0,10);
Здесь переменные фильтруются через функцию filtro
$msgs = substr(intval($_POST['msgs']),0,2); - это количество сообщений в гостевой на страницу, соответственно цифра, поэтому используем intval
Далее регулярки
if(!eregi("^[[:alnum:]][a-z0-9_^\.-]*@[a-z0-9^\.-]+\.[a-z]{2,6}$", $_POST['email']))
{exit('Error');}
else
{$email = trim($_POST['email']);}
if(!preg_match("/^http:\/\/+[a-zA-Z_0-9-^\.]+\.[a-z0-9]{2,6}+$/i", $link))
{exit('Error');}
else
{$link = trim($_POST['link']);}
$pass = trim($_POST['pass']
if(!preg_match("/^([a-zA-Z_0-9]+)$/i", $pass))
{exit('Error');}
else
{
if(strlen($pass) < 4)
{exit('Error');}
else
{$pass = substr($pass),0,25);}
}
E-mail и ссылка фильтруются через часто используемые регулярные выражения, можете скопировать их и использовать в своих скриптах.
Пароль подвергнется жестким репрессиям, в нем можно использовать только буквы латинского алфавита, цифры и знаки - и _
Так же пароль должен быть не менее 4 символов.
Неактивен
|
|
в данном случае лучше заменить конструкцию if($var == "") $error = $error."..."; на if(!$var) $error = $error.'...';
Т.к. если оставить как было, если ввести к примеру заголовок 0, то проверка пройдет успешно, хотя в базу данных НИЧЕГО не занесется, а нам нужно чтобы заголовок был.
|
|
Оставляем следующее
|
|
И то только потому что мы работаем с WML
Неактивен
Панель администрирования из данного скрипта будет рассмотрена чуть позднее, если у Вас есть еще какие-либо замечания, то обязательно пишите!
Неактивен
Продолжим
Еще такое замечание, в скрипте везде явно прописан путь на главную сайта, но лучше для таких целей использовать переменную $_SERVER['HTTP_HOST'];
Файл admin.php из админки... лично я бы вообще там все переписал... но поскольку мне за это не никто не заплатит ограничусь несколькими замечаниями
1) Переменные $id и $mid - должны быть целым числом, следовательно используем intval и все! Так же они к нам приходят только через GET запрос, следовательно заменяем REQUEST на GET. Это же касается всех остальных переменных. Если они передаются через POST - пишем POST, если через GET - пишем GET. Это несколько усложнит потенциальные попытки взлома каким-нибудь нехорошим человеком (хакером)
|
|
2) Вот этот код убрать:
|
|
3) Вот это тоже убрать:
|
|
4) Вот это
|
|
лучше переписать следующим образом
|
|
<<<END
...
END;
Не очень читабельная конструкция. И для лучшей совместимости с мозгом перепишем ее.
5) Все переменные в скрипте проверяются всего 1 функцией - filtro. Как было сказано ранее, не существует функций, которые бы корректно проверяли ВСЕ данные. К каждой переменной необходим свой подход, к целочисленным - intval ( кстати не забываем что, скажем, -5 это тоже число, только отрицательное, это надо учитывать , если в переменной должна содержаться какая-либо типизованная информация, то проверяем ее регулярными выражениями (E-mail, URL и т.д.), переменные в которых может содержаться большое кол-во символов, например сообщение в гостевой книге, можно фильтровать функциями типа filtro, а можно придумать соответствующее регулярное выражение, это уже рещать Вам.
Неактивен
Вобщем здесь я привел лишь основные недоработки этого скрипта и если копать его глубже, то наверняка найдется еще много недоработок.
Знаете как определяется настоящий срок и для написания какого-либо скрипта?
Предпологаемый срок * 2 + 3 дня + 1 ночь
Вот так вот я это к тому, что любой скрипт можно дорабатывать и дорабатывать, было бы желание
Неактивен
Помоги пожалуйста с загруз-центром. Там почему то индексная страница ужасно долго загружается, а с Opera Mini вообще вместо станицы вот это получается -
Error
Could not locate remote server http://dowmloads.smartinet.org/ Вот индекс http://wap.smartinet.org/downfile.zip
Отредактировано Casper (2008.01.22 15:25)
Неактивен
Вобщем я начал переписывать, потом забросил, т.к. думаю бесполезно это, чтобы добиться приличного прироста скорости следует весь скрипт переписывать. Я так понял он на register_globals On работает? Еще там ошибки в HTML коде. Ну и вообще код корявый.
Неактивен