Admin » 2007.11.03 03:27 |
Имеется скрипт сервиса гостевых книг. При первом взгляде сразу бросается в глаза его не оптимизированность. Т.е. расходуется слишком много системных ресурсов. Например имеется код
если его переписать следующим образом
то это даст небольшой прирост производительности, а главное код воспринимается легче, ИМХО.
Далее, в скрипте используется постоянное соединение с MySql, я думаю все же лучше заменить mysql_pconnect на mysql_connect заменяем
на
Так же можно изменить имена переменных на более короткие, и вообще сделать их константами. Это так же даст небольшой прирост производительности В файле functions.php видим функцию транслита, сделано с помощью 65 функций str_replace Этот код так же можно переписать следующим образом
точно то же самое с заменой смайлов в файле convert_to_smiles.php |
Admin » 2007.11.03 03:31 |
далее смотрим довольно интересный файл filtro.php приведу его содержание здесь
и сразу замечание - для фильтрации лучше использовать т.н. "белый список" , а не "черный" - что это значит? А значит это вот что - лучше создать список символов разрешенных для передачи скрипту, чем запрещать потенциально опасные символы. Очень хорошо помогают в этом регулярные выражения. Данный код можно переписать следующим образом
1) Цифры следует писать без кавычек, что мы и сделали 2) Если читабельность кода не сильно пострадает, то лучше несколько функций обьеденить в одну конструкцию, тоже сделали 3) Убрали из замены символы chr(9), chr(10), chr(13) - это символы табуляции, они вполне могут пригодиться в дальнейшем и опасности в себе не несут. 4) Еще можно добавить функцию nl2br - она заменит переносы строк на <br />
Т.к. в переменной $a могут находиться довольно много символов, то обрабатывать ее регулярным выражением ее не будем. Но если это, например, пароль или логин, то лучше проверять их регулярными выражениями. Об этом чуть позже. |
Admin » 2007.11.03 03:34 |
Дальше будем изучать "основной" файл скрипта - index.php В начале кода видим следующую конструкцию
Спрашивается, зачем $ref = $_GET["ref"];, если дальше мы все равно присвоим переменной $ref значение от rand(10000,1000000); ? $ref = $_GET["ref"]; убираем. Еще дальше видим код
здесь абсолютно не нужно! Ведь далее мы все равно переменной $id присвоим целочисленное значение с помощью intval Заменяем весь этот код на
Смотрим дальше
Здесь помимо проблем с оптимизацией видим проблемы со стилем... ( хотя, смотря на этот скрипт, мы это видим постоянно =D ) Переписываем так
Поскольку ранее переменной $id мы присвоили тип int, то и передавать эту переменную следует как int, так же SQL комманды принято писать В ВЕРХНЕМ РЕГИСТРЕ. Очень советую этого придерживаться. |
Admin » 2007.11.03 03:40 |
т.к. в дальнейшем не предполагается использовать нумерованный массив, а только ассоциативный, заменяем 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 символов.
|
Admin » 2007.11.03 03:41 |
в данном случае лучше заменить конструкцию if($var == "") $error = $error."..."; на if(!$var) $error = $error.'...'; Т.к. если оставить как было, если ввести к примеру заголовок 0, то проверка пройдет успешно, хотя в базу данных НИЧЕГО не занесется, а нам нужно чтобы заголовок был.
Оставляем следующее
И то только потому что мы работаем с WML |
Admin » 2007.11.03 03:42 |
Панель администрирования из данного скрипта будет рассмотрена чуть позднее, если у Вас есть еще какие-либо замечания, то обязательно пишите! =) |
Admin » 2007.11.03 03:46 |
Продолжим =)
Еще такое замечание, в скрипте везде явно прописан путь на главную сайта, но лучше для таких целей использовать переменную $_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, а можно придумать соответствующее регулярное выражение, это уже рещать Вам. |
Admin » 2007.11.03 03:46 |
Вобщем здесь я привел лишь основные недоработки этого скрипта и если копать его глубже, то наверняка найдется еще много недоработок. Знаете как определяется настоящий срок и для написания какого-либо скрипта? Предпологаемый срок * 2 + 3 дня + 1 ночь Вот так вот =) я это к тому, что любой скрипт можно дорабатывать и дорабатывать, было бы желание =) |
Casper » 2008.01.22 15:20 |
Помоги пожалуйста с загруз-центром. Там почему то индексная страница ужасно долго загружается, а с Opera Mini вообще вместо станицы вот это получается - Error
Could not locate remote server http://dowmloads.smartinet.org/ Вот индекс http://wap.smartinet.org/downfile.zip |
Gemorroj » 2008.01.23 12:35 |
Вобщем я начал переписывать, потом забросил, т.к. думаю бесполезно это, чтобы добиться приличного прироста скорости следует весь скрипт переписывать. Я так понял он на register_globals On работает? Еще там ошибки в HTML коде. Ну и вообще код корявый. |
Casper » 2008.01.23 17:02 |
Да, php_value register_globals On Очень-очень жаль=( |
Ekcnepm » 2008.07.29 18:24 |
Паш,помоги со скриптом,в смысле с PHP. Значит так..есть папка theme в ней файл темы default.php.есть в корне два файла http://cmswap.ru/config.txt http://cwswap.ru/index.txt нужно чтобы $theme передавалась в индеексный файл как тема ..я в ПХП еще не очень..как сделать? |
Gemor » 2008.07.29 23:19 |
какое отношение ЭТОТ вопрос имеет к ЭТОЙ теме? |
САНЯ » 2008.07.30 01:57 |
Как писать грабб |
Gemorroj » 2008.07.30 03:15 |
а ЭТОТ!? =((( |
denich » 2008.07.30 18:24 |
гг |
Vliker » 2009.11.11 16:38 |
Admin, почему не выложил подправленный скрипт сервис гостевых книг гг? |