Решил завести новую тему т.к. теперь чат будет на шаблонах и полностью на Mysql + все исходники я буду кидать сюда... Как и в прошлый раз прошу четко указывать где я не прав, а ГЛАВНОЕ ПОЧЕМУ!!! Пожалуй, начнем PHP: <?php /*************************************\ * config.php * ---------------------------- * Programm: DoD_Chat 1.2b (MySql) * Date: 27/07/2008 * Author: DragonOfDeath by support [url=http://www.php.ru]www.php.ru[/url] * Contact: [email=DragonOfDeath@bk.ru]DragonOfDeath@bk.ru[/email] \*************************************/ date_default_timezone_set ('Europe/Moscow'); //error_reporting(E_ALL | E_STRICT); // Настройки для соединения с БД $db_server = 'localhost'; $db_user = ''; $db_passwd = ''; $db_table = ''; // Настройки для работы с БД $db_table_config = 'chat_config'; // имя таблицы с конфигурацией чата $db_table_ipban = 'chat_ipban'; // Имя таблицы со списком IP адресов, которым запрещен доступ к чату $db_table_logs = 'chat_logs'; // Имя таблицы с логами чата $db_table_users = 'phpbb_users'; // Имя таблицы с пользователями чата $db_table_users_id = 'user_id'; // Имя поля с ID пользователя в таблице $db_table_users $db_table_users_name = 'username'; // Имя поля с логином пользователя в таблице $db_table_users $db_table_users_passwd = 'user_password'; // имя поля с паролем пользователя в таблице table $db_table_users ?> PHP: <?php /*************************************\ * index.php * ---------------------------- * Programm: DoD_Chat 1.2b (MySql) * Date: 27/07/2008 * Author: DragonOfDeath by support [url=http://www.php.ru]www.php.ru[/url] * Contact: [email=DragonOfDeath@bk.ru]DragonOfDeath@bk.ru[/email] \*************************************/ // Инициализируем сессию session_start(); // Подключение дополнительных файлов include_once ('config.php'); include_once ('includes/functions.php'); // Соеденяемся с БД db_connect($db_server, $db_user, $db_passwd, $db_table); mysql_query('SET NAMES CP1251'); // Выход из чата $act = $_GET['act']; if ($act == 'exit') { log_write($_SESSION['username'], '<b>[Вышел из чата]</b>', null, null, date('H:i:s'), '1'); $sql = ("UPDATE `$db_table_users` SET `user_chat_online` = '0' WHERE `$db_table_users`.`$db_table_users_id` = $_SESSION[user_id] LIMIT 1"); $sql = mysql_query($sql) or die (mysql_error()); @session_destroy(); header('Location: index.php'); die(); } // Определение и подключение языка "по-умолчанию" $sql = mysql_fetch_array(mysql_query("SELECT * FROM `$db_table_config` WHERE `name_config` = 'default_lang'")); $lang_def = $sql['value_config']; include_once ('languages/'.$lang_def.'/lang_main.php'); // Проверка что IP пользователя не занесен в бан $sql = ("SELECT * FROM `chat_ipban` WHERE `ip` = '".$_SERVER['REMOTE_ADDR']."' LIMIT 1"); $sql = mysql_query($sql) or die ($lang['ip_close_error']); // Если IP адрес есть в БД if (mysql_num_rows ($sql) == 1) { die ($lang['ip_close']); } // Проверка заполнения формы входа // Если не заполнена, вывести if (!isset($_POST['submit'])) { $sql = mysql_fetch_array(mysql_query("SELECT * FROM `$db_table_config` WHERE `name_config` = 'title_chat'")); $title = $sql['value_config']; $template = file_get_contents ('template/index.tpl'); $template = str_replace ('{title_chat}', $title, $template); echo $template; } else { $_POST['login'] = mysql_real_escape_string($_POST['login']); $_POST['password'] = mysql_real_escape_string($_POST['password']); // Проверка наличия пользователя $sql = ("SELECT * FROM `$db_table_users` WHERE `$db_table_users_name` = '".$_POST['login']."' LIMIT 0 , 1"); $sql = mysql_query($sql) or die (mysql_error()); // Если такого нет, выдать сообщение об ошибке if (mysql_num_rows ($sql) == 0) { die ($lang['user_none']); } // Если пользователь, все же, существует =) $data = mysql_fetch_array(mysql_query("SELECT * FROM `$db_table_users` WHERE `$db_table_users_name` = '$_POST[login]'")); // Если логин и пароль верные, входим if (($_POST['login'] == $data[$db_table_users_name]) && md5($_POST['password']) == $data[$db_table_users_passwd]) { // Проверяем что этому пользователю можно зайти в чат if ($data['user_chat_ban'] == 1) { die ($lang['user_in_ban']); } // Проверяем чему равна карма и нарушения elseif ($data['user_chat_error'] >= $data['user_chat_karma']) { die ($lang['user_karma_error']); } $_SESSION['login'] = true; $_SESSION['username'] = $data[$db_table_users_name]; $_SESSION['user_id'] = $data[$db_table_users_id]; $_SESSION['user_chat_status'] = $data['user_chat_status']; $_SESSION['user_chat_rank'] = $data['user_chat_rank']; $_SESSION['user_chat_reload'] = $data['user_chat_reload']; $_SESSION['user_chat_sort'] = $data['user_chat_sort']; $sql = ("UPDATE `$db_table_users` SET `user_chat_online` = '1', `user_chat_ip` = '".$_SERVER['REMOTE_ADDR']."', `user_chat_session` = '".session_id()."', `user_chat_action` = '".time()."' WHERE `$db_table_users`.`user_id` = $_SESSION[user_id] LIMIT 1"); $sql = mysql_query($sql) or die (mysql_error()); log_write($_SESSION['username'], '<b>[Входит в чат]</b>', null, null, date('H:i:s'), '1'); header('Location: chat.php'); } // Если логин и/или пароль не верные else { die ($lang['user_none_login']); } } ?> PHP: <?php /*************************************\ * chat.php * ---------------------------- * Programm: DoD_Chat 1.2b (MySql) * Date: 27/07/2008 * Author: DragonOfDeath by support [url=http://www.php.ru]www.php.ru[/url] * Contact: [email=DragonOfDeath@bk.ru]DragonOfDeath@bk.ru[/email] \*************************************/ // Инициализируем сессию session_start(); if (!isset($_SESSION['login']) || !$_SESSION['login']) { header('Location: index.php'); } // Подключение дополнительных файлов include_once ('config.php'); include_once ('includes/functions.php'); // Соеденяемся с БД db_connect($db_server, $db_user, $db_passwd, $db_table); mysql_query('SET NAMES CP1251'); $sql = mysql_fetch_array(mysql_query("SELECT * FROM `$db_table_config` WHERE `name_config` = 'title_chat'")); $title = $sql['value_config']; $template = file_get_contents ('template/chat.tpl'); $template = str_replace ('{title_chat}', $title, $template); echo $template; ?> PHP: <?php /*************************************\ * win_main.php * ---------------------------- * Programm: DoD_Chat 1.2b (MySql) * Date: 27/07/2008 * Author: DragonOfDeath by support [url=http://www.php.ru]www.php.ru[/url] * Contact: [email=DragonOfDeath@bk.ru]DragonOfDeath@bk.ru[/email] \*************************************/ // Инициализируем сессию session_start(); if (!isset($_SESSION['login']) || !$_SESSION['login']) { header('Location: index.php'); } // Подключение дополнительных файлов include_once ('config.php'); include_once ('includes/functions.php'); // Соеденяемся с БД db_connect($db_server, $db_user, $db_passwd, $db_table); mysql_query('SET NAMES CP1251'); $sql = ("SELECT * FROM `chat_logs` WHERE `privat` = '' AND `date` = '".date('d-m-Y')."' ORDER BY `id` ".$_SESSION[user_chat_sort]." LIMIT 0 , 30"); $sql = mysql_query($sql) or die (mysql_error()); //Обновление окна Header('Refresh: '.$_SESSION['user_chat_reload']); // Если сообщений нет if (mysql_num_rows ($sql) == 0) { $error = ('Сообщений, пока, нет'); } if (empty($error)) { while($nextrow = mysql_fetch_array($sql)) { $template = file_get_contents ('template/win_main.tpl'); $nextrow['what'] = str_replace($_SESSION['username'],'<b>'.$_SESSION['username'].'</b>',$nextrow['what']); $template = str_replace (array('[if_no_error]','[/if_no_error]','{error}'), '', $template); $template = str_replace ('{time}', $nextrow['time'], $template); $template = str_replace ('{who}', $nextrow['who'], $template); $template = str_replace ('{what}', $nextrow['what'], $template); echo $template; } } else { $template = file_get_contents ('template/win_main.tpl'); $template = preg_replace ("#\[if_no_error\](.+?)\[\/if_no_error\]#is", "", $template); $template = str_replace ('{error}', $error, $template); echo $template; } ?> PHP: <?php /*************************************\ * win_menu.php * ---------------------------- * Programm: DoD_Chat 1.2b (MySql) * Date: 27/07/2008 * Author: DragonOfDeath by support [url=http://www.php.ru]www.php.ru[/url] * Contact: [email=DragonOfDeath@bk.ru]DragonOfDeath@bk.ru[/email] \*************************************/ // Инициализируем сессию session_start(); if (!isset($_SESSION['login']) || !$_SESSION['login']) { header('Location: index.php'); } // Подключение дополнительных файлов include_once ('config.php'); include_once ('includes/functions.php'); $template = file_get_contents ('template/win_menu.tpl'); echo $template; ?> PHP: <?php /*************************************\ * win_main.php * ---------------------------- * Programm: DoD_Chat 1.2b (MySql) * Date: 27/07/2008 * Author: DragonOfDeath by support [url=http://www.php.ru]www.php.ru[/url] * Contact: [email=DragonOfDeath@bk.ru]DragonOfDeath@bk.ru[/email] \*************************************/ // Инициализируем сессию session_start(); if (!isset($_SESSION['login']) || !$_SESSION['login']) { header('Location: index.php'); } // Подключение дополнительных файлов include_once ('config.php'); include_once ('includes/functions.php'); db_connect($db_server, $db_user, $db_passwd, $db_table); mysql_query('SET NAMES CP1251'); // Определение и подключение языка "по-умолчанию" $sql = mysql_fetch_array(mysql_query("SELECT * FROM `$db_table_config` WHERE `name_config` = 'default_lang'")); $lang_def = $sql['value_config']; include_once ('languages/'.$lang_def.'/lang_main.php'); $sql = "SELECT * FROM `$db_table_users` WHERE `$db_table_users_name`='$_SESSION[username]'"; $sql = mysql_fetch_array(mysql_query($sql)) or print($lang['only_read']); if ($sql['user_chat_read'] >= time()) { $time_read = round(($sql['user_chat_read'] - time())/60); $error = $lang['only_read_mess_begin'].' '.$time_read.' '.$lang['minutes']; $template = file_get_contents ('template/win_mess_form.tpl'); $template = preg_replace ("#\[if_no_error\](.+?)\[\/if_no_error\]#is", "", $template); $template = str_replace ('{error}', $error, $template); echo $template; } else { $template = file_get_contents ('template/win_mess_form.tpl'); $template = str_replace (array('[if_no_error]','[/if_no_error]','{error}'), '', $template); $template = str_replace ('{content}', $content, $template); echo $template; } if ($_POST['message'] != '') { log_write($_SESSION['username'], $_POST['message'], $_POST['status'], $_POST['privat'], date(H.':'.i.':'.s)); } ?> PHP: <?php /*************************************\ * win_privat.php * ---------------------------- * Programm: DoD_Chat 1.2b (MySql) * Date: 27/07/2008 * Author: DragonOfDeath by support [url=http://www.php.ru]www.php.ru[/url] * Contact: [email=DragonOfDeath@bk.ru]DragonOfDeath@bk.ru[/email] \*************************************/ // Инициализируем сессию session_start(); if (!isset($_SESSION['login']) || !$_SESSION['login']) { header('Location: index.php'); } // Подключение дополнительных файлов include_once ('config.php'); include_once ('includes/functions.php'); // Соеденяемся с БД db_connect($db_server, $db_user, $db_passwd, $db_table); mysql_query('SET NAMES CP1251'); $sql = ("SELECT * FROM `chat_logs` WHERE `who` = '".$_SESSION['username']."' AND `date` = '".date('d-m-Y')."' AND `privat` != '' OR `privat` = '".$_SESSION['username']."' ORDER BY `id` ".$_SESSION['user_chat_sort']." LIMIT 0 , 15"); $sql = mysql_query($sql) or die (mysql_error()); //Обновление окна Header('Refresh: '.$_SESSION['user_chat_reload']); if (mysql_num_rows ($sql) == 0) { $error = ('Окно привата'); } if (empty($error)) { while($nextrow = mysql_fetch_array($sql)) { $template = file_get_contents ('template/win_privat.tpl'); $template = str_replace (array('[if_no_error]','[/if_no_error]','{error}'), '', $template); $template = str_replace ('{time}', $nextrow['time'], $template); $template = str_replace ('{who}', $nextrow['who'], $template); $template = str_replace ('{privat}', $nextrow['privat'], $template); $template = str_replace ('{what}', $nextrow['what'], $template); echo $template; } } else { $template = file_get_contents ('template/win_privat.tpl'); $template = preg_replace ("#\[if_no_error\](.+?)\[\/if_no_error\]#is", "", $template); $template = str_replace ('{error}', $error, $template); echo $template; } ?> PHP: <?php /*************************************\ * win_user.php * ---------------------------- * Programm: DoD_Chat 1.2b (MySql) * Date: 27/07/2008 * Author: DragonOfDeath by support [url=http://www.php.ru]www.php.ru[/url] * Contact: [email=DragonOfDeath@bk.ru]DragonOfDeath@bk.ru[/email] \*************************************/ // Инициализируем сессию session_start(); // Подключение дополнительных файлов include_once ('config.php'); include_once ('includes/functions.php'); // Соеденяемся с БД db_connect($db_server, $db_user, $db_passwd, $db_table); mysql_query('SET NAMES CP1251'); //Обновление окна Header('Refresh: 30'); $sql = "SELECT * FROM `$db_table_users` WHERE `user_chat_online`='1' ORDER BY `$db_table_users_name` ASC"; $sql = mysql_query($sql) or print($lang['online_error']); while($nextrow = @mysql_fetch_array($sql)) { if ((time() - $nextrow['user_chat_action']) > '900') { $sql1 = ("UPDATE `$db_table_users` SET `user_chat_online` = 0 WHERE `$db_table_users_id` = ".$nextrow[$db_table_users_id]." LIMIT 1"); $sql1 = mysql_query($sql1) or print("Не могу убрать ".$nextrow[$db_table_users_name]." из On-Line<br>"); @Header('Location: index.php'); } $nextrow['user_chat_gender']; $template = file_get_contents ('template/win_user.tpl'); if ($nextrow['user_chat_rank'] == 1 || $nextrow['user_chat_rank'] == 2 || $nextrow['user_chat_rank'] == 3) { $template = str_replace ('{user}', '<i><a href="#" onClick="parent.frames[\'messages\'].document.getElementById(\'privat\').value = this.innerHTML; return false;">'.$nextrow[$db_table_users_name].'</a></i>', $template); } else { $template = str_replace ('{user}', '<a href="#" onClick="parent.frames[\'messages\'].document.getElementById(\'privat\').value = this.innerHTML; return false;">'.$nextrow[$db_table_users_name].'</a>', $template); } if($nextrow['user_chat_gender'] == 1) { $template = str_replace ('{sex}', '<img src="images/sex_m.gif">', $template); } elseif ($nextrow['user_chat_gender'] == 2) { $template = str_replace ('{sex}', '<img src="images/sex_j.gif">', $template); } else { $template = str_replace ('{sex}', '<img src="images/sex_x.gif">', $template); } $template = str_replace ('{karma}', $nextrow['user_chat_karma'], $template); $template = str_replace ('{error}', $nextrow['user_chat_error'], $template); echo $template; } ?> --------------------------------------------------------------------------------------------------------------------------------------- Шаблоны HTML: <!-- chat.tpl --> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=windows-1251"> <meta http-equiv="Content-Language" content="ru"> <link rel=stylesheet href="template/style.css" type="text/css"> <title>{title_chat}</title> </head> <frameset rows="20,*" border="0"> <frame name="menu" marginheight="20" scrolling="no" src="win_menu.php" noresize border="0"> <frameset cols="80%,*" border="0"> <frameset rows="*,80,150" border="0"> <frame name="main" scrolling="auto" src="win_main.php"> <frame scrolling="no" name="messages" src="win_mess.php"> <frame scrolling="auto" name="privat" src="win_privat.php"> </frameset> <frame name="user" src="win_user.php" scrolling="auto" target="_self"> </frameset> </frameset> </html> HTML: <!-- error_mysql.tpl --> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="Content-Language" content="ru"> <meta http-equiv="Content-Type" content="text/html; charset=windows-1251"> <title>Ошибка</title> </head> <body> <p align="center">Нет соединения с базой данных <p align="center"><b>Проверьте параметры в config.php</b> </body> </html> HTML: <!-- index.tpl --> <script language="JavaScript"> <!-- // { if (self.parent.frames.length != 0) self.parent.location="index.php" } // --> </script> <form method="POST" action="index.php"> <table border="0" width="100%"> <tr> <td align="right" width="50%">Логин:</td> <td align="left" width="50%"><input type="text" name="login" size="20"></td> </tr> <tr> <td align="right" width="50%">Пароль:</td> <td align="left" width="50%"><input type="password" name="password" size="20"></td> </tr> <tr> <td align="center" colspan="2"> <input type="submit" value="Отправить" name="submit"><input type="reset" value="Сброс" name="reset"></td> </tr> </table> </form> HTML: <!-- win_main.tpl --> <script language="javascript"> <!-- if (self == parent) { self.window.location='index.php'; } --> </script> <link rel=stylesheet href="template/style.css" type="text/css"> <body class="font_txt"> {error} [if_no_error] <font color="0000FF"> <a target"messages" href="#" onClick="parent.frames['messages'].document.getElementById('message').value = parent.frames['messages'].document.getElementById('message').value + ' см. ' + this.innerHTML + ' ';">[{time}]</a></font> -> <a target"messages" href="#" onClick="parent.frames['messages'].document.getElementById('message').value = parent.frames['messages'].document.getElementById('message').value + this.innerHTML; return false;">{who}:</a> {what}<br> [/if_no_error] </body> HTML: <!-- win_menu.tpl --> <link rel=stylesheet href="template/style.css" type="text/css"> <body class="font_all"> <script language="javascript"> <!-- if (self == parent) { self.window.location='index.php'; } --> </script> <body topmargin="0" leftmargin="0" rightmargin="0" bottommargin="0"> <a href="#" onclick="javascript: window.open('win_setup.php','user_set','width=350, height=200, resizable=no, scrollbars=no, status=no, toolbar=no, menubar=no'); void(0); return false;">Настройки</a> <a href="#" onClick="window.parent.main.location.reload(); return false;">Обновить</a> <a href="#" onclick="javascript: window.open('win_help.php','Help','width=500, height=300, resizable=no, scrollbars=no, status=no, toolbar=no, menubar=no'); void(0); return false;">Помощь</a> <a href="#" onclick="javascript: window.open('win_rulez.php','Rulez','width=500, height=300, resizable=no, scrollbars=no, status=no, toolbar=no, menubar=no'); void(0); return false;">Правила</a> <a href="#" onclick=window.location.href="index.php?act=exit">Выход</a> </body> HTML: <!-- win_mess_form.tpl --> <link rel=stylesheet href="template/style.css" type="text/css"> <body class="font_all"> <script language="javascript"> <!-- if (self == parent) { self.window.location='index.php'; } // --> </script> {error} [if_no_error] <form method="POST" action="" name="post" onsubmit="document.forms[0].submit.disabled=true"> <div align="left"> <table border="0" cellspacing="0" cellpadding="0" width="100%"><tr> <td><div align="center"> <table border="0" width="100%" cellspacing="0" cellpadding="0"><tr><td colspan="2"><p align="center"> <textarea rows="2" name="message" id="message" cols="35" id="message" onKeyPress = "if (event.keyCode==10 || (event.ctrlKey && event.keyCode==13)) {document.post.submit.click();}"> </textarea></td></tr><tr><td align="center"> <select size="1" name="status"> <option selected value="">Интонация</option> <option value="Отлично">Отлично</option> </select> </td><td align="center">Лично:<input type="text" name="privat" size="20"></td></tr> </table></div></td><td><p align="center"> <input type="submit" value="Сказать [Crtl+Enter]" name="submit0" onClick="this.value='Отправка...';"><br> <input type="reset" value="Очистить" name="reset0"></td><td width="100%"> <table border="0" width="100%"> <tr> <td align="center" width="3%"><img border="0" src="images/smile/aa.gif"></td> <td align="center" width="3%"> </td> <td align="center" width="3%"> </td> <td align="center" width="3%"> </td> <td align="center" width="3%"> </td> <td align="center" width="3%"> </td> <td align="center" width="3%"> </td> <td align="center" width="3%"> </td> <td align="center" width="3%"> </td> <td align="center" width="3%"> </td> </tr> <tr> <td align="center" width="3%"> </td> <td align="center" width="3%"> </td> <td align="center" width="3%"> </td> <td align="center" width="3%"> </td> <td align="center" width="3%"> </td> <td align="center" width="3%"> </td> <td align="center" width="3%"> </td> <td align="center" width="3%"> </td> <td align="center" width="3%"> </td> <td align="center" width="3%"> </td> </tr> </table> </td></tr> </table></div> </form> [/if_no_error] </body> Почему-то слетел ctrl+enter HTML: <!-- win_privat.tpl --> <script language="javascript"> <!-- if (self == parent) { self.window.location='index.php'; } --> </script> <link rel=stylesheet href="template/style.css" type="text/css"> <body class="font_txt"> {error} [if_no_error] <a target"messages" href="#" onClick="parent.frames['messages'].document.getElementById('message').value = parent.frames['messages'].document.getElementById('message').value + ' см. ' + this.innerHTML + ' ';">[{time}]</a> > <a target"messages" href="#" onClick="parent.frames['messages'].document.getElementById('privat').value = this.innerHTML; return false;">{who}</a> -> <a target"messages" href="#" onClick="parent.frames['messages'].document.getElementById('privat').value = this.innerHTML; return false;">{privat}</a>: {what}<br> [/if_no_error] </body> HTML: <!-- win_user.tpl --> <link rel=stylesheet href="template/style.css" type="text/css"> <script language="javascript"> <!-- if (self == parent) { self.window.location='index.php'; } --> </script> <body class="font_all"> {sex} {user} "{karma}"-"{error}"<br> </body> Далее вопрос.... файлы входящие во фреймы должны быть польностью оформлены как html или можно только как я указал... типа только значимые части.. Заранее спасибо! PS весь код находится в актуальном состоянии... т.е. ровно то, что на сервере... тестить можно тут... http://vowik.ru/chat (test:test)
SQL-инъекция. Еще одна? о_0 Потенциальная sql-инъекция. Может я пропустил где регистрационные данные обрабатываются, но а что если имя пользователя будет 0'; DELETE FROM `table' WHERE `id`<0 ?
Поправил, но Вот с нулём не понял как исправить... и потом... данные чтения сообщений из базы нельзя перехватить
Зато можно закрыть запрос чтения и начать другой Я про то, что логин (имя пользователя) тоже может быть куском sql-запроса.
это понятно само название таблицы улыбнуло. я сам щас такой везде-интегрируемый форум пишу. у него даже авторизации своей нет.
Ну во-первых в каждом файле повторяется код: PHP: <? // Инициализируем сессию session_start(); // Подключение дополнительных файлов include_once ('config.php'); include_once ('includes/functions.php'); // Соеденяемся с БД db_connect($db_server, $db_user, $db_passwd, $db_table); mysql_query('SET NAMES CP1251'); ?> я бы его вынес куда-нибудь... в некоторых выборках с базы забыл имена таблиц на переменные из конфига заменить. это так, без глубокого анализа но особых ляпов не видно +1
Там в принципе ничего сложного: Есть какая-то переменная last_id, которая хранит id последнего загруженного сообщения, каждую секунду скрипт берем сообщения у которых id > last_id. Кот-то вот так.