|
|
|
|
|
|
|
|
|
|
Есть такой тип взлома форумов как SQL Injection. На человеческом языке это называется внедрение вредоносного кода в запрос, в результате чего злоумышленник может или вывести из строя форум, или получить некоторую важную информацию для дальнейшего взлома.
На самом деле то что вываливается при ошибке базы в IPB на экран нужно только администратору форума. Согласитесь, что для простого пользователя это совершенно не нужная информация, с другой стороны для злоумышленника это возможность посмотреть на полный запрос, вызвавший ошибку, и составить на его основе вредоносный запрос.
Как будем избавлятся от излишней информативности IPB при ошибках базы? Очевидно, что нужно запретить IPB выдавать расширенное сообщение об ошибке, заменив его чем то вроде: «Возникли некоторые проблемы в работе форума. Попробуйте зайти позже.» Но как быть администратору форума, ему то нужно знать где и из-за чего произошла ошибка!?! Мы поступим просто, будем высылать сообщение об ошибке на некоторый администраторский e-mail, с детальной информацией о ней.
Открыть файл /sources/Drivers/mySQL.php
В самом его начале после строчки
<?php
добавить
error_reporting(E_ALL & ~E_NOTICE & ~E_WARNING);
Это позволит нам избавится от вывода ошибок PHP если сервер база отвалится и т.д.
Далее заменяем строчки:
if ( !mysql_select_db($this->obj['sql_database'], $this->connection_id) ) { echo ("ERROR: Cannot find database ".$this->obj['sql_database']); }
на
if (!$this->connection_id) { $this->fatal_error('ERROR: Link-ID == false, connect failed'); return false; } if ( !mysql_select_db($this->obj['sql_database'], $this->connection_id) ) { $this->fatal_error("ERROR: Cannot find database ".$this->obj['sql_database']); return false; }
Таким образом мы отключаем ошибки, возникающие при коннекте к серверу базы (первый if) и ошибки при выборе базы форума на сервере (второй if)
Находим строчки:
$the_error .= "\n\nmySQL error: ".mysql_error()."\n";
$the_error .= "mySQL error code: ".$this->error_no."\n";
$the_error .= "Date: ".date("l dS of F Y h:i:s A");
$out = "<html><head><title>Invision Power Board Database Error</title>
<style>P,BODY{ font-family:arial,sans-serif; font-size:11px; }</style></head><body>
<br><br><blockquote><b>There appears to be an error with the {$INFO['board_name']} database.</b><br>
You can try to refresh the page by clicking <a href=\"javascript:window.location=window.location;\">here</a>, if this
does not fix the error, you can contact the board administrator by clicking <a href='mailto:{$INFO['email_in']}?subject=SQL+Error'>here</a>
<br><br><b>Error Returned</b><br>
<form name='mysql'><textarea rows=\"15\" cols=\"60\">".htmlspecialchars($the_error)."</textarea></form><br>We apologise for any inconvenience</blockquote></body></html>";
echo($out);
die("");
удаляем их, теперь IPB об ошибках будет молчать как партизан. Частично задача решена, продолжаем дальше.
Там же заменим строчки:
if ($this->return_die == 1)
{
$this->error = mysql_error();
$this->error_no = mysql_errno();
$this->failed = 1;
return;
}
на
$this->error = mysql_error();
$this->error_no = mysql_errno();
if ($this->return_die == 1)
{
$this->failed = 1;
return;
}
а ниже этих строк добавим
$message = "Database error in:\r\n{$the_error}\r\n\r\n";
$message .= 'mySQL error: ' . $this->error . "\r\n\r\n";
$message .= 'mySQL error number: ' . $this->error_no . "\r\n\r\n";
$message .= 'Script URI: '. $_SERVER['REQUEST_URI'] . "\r\n";
$message .= 'Date: ' . date('l dS of F Y h:i:s A') . "\r\n";
$message .= 'IP Address: ' . $_SERVER['REMOTE_ADDR'] . "\r\n";
$mail_headers = "From: \"".$INFO['email_tech']."\" <".$INFO['email_tech'].">\n";
$mail_headers .= "To: ".$INFO['email_tech']."\n";
$mail_headers .= "Subject: Database error!\n";
$mail_headers .= "Content-Type: text/plain; charset=\"windows-1251\"\n";
$mail_headers .= "X-Priority: 3\n";
$mail_headers .= "X-Mailer: IPB PHP Mailer\n";
@mail ($INFO['email_tech'], 'Database error!', $message , $mail_headers);
echo "<html><head><title>System Error</title>";
echo "</head>\r\n";
echo "<body>\r\n";
echo "<b>Возникли некоторые проблемы в работе форума.</b><br />\r\n";
echo "Попробуйте зайти позже. Либо нажмите кнопку<a href=\"javascript:window.location=window.location;\">обновить</a> в вашем браузере.";
echo "<p>Приносим извинения за причиненные неудобства.</p>";
echo "\r\n\r\n</body></html>";
exit;
Файл mySQL.php готов к дальнейшему использованию. Осталось только внести изменения в файл ./conf_global.php Найти:
$INFO['email_out']='admin@domain.com';
Добавить ПОСЛЕ
$INFO['email_tech']='tech_admin@domain.com';
e-mail адреса не забудьте поменять на свои параметр email_tech прописывает ящик, на который будут отправляться сообщения об ошибках базы.
Чтобы не выводились ошибки достаточно удалить строчки: файл ips_kernel\class_db_mysql.php
$the_error .= "\n\nmySQL error: ".mysql_error()."\n"; $the_error .= "mySQL error code: ".$this->error_no."\n"; $the_error .= "Date: ".date("l dS of F Y h:i:s A"); $out = "<html><head><title>Invision Power Board Database Error</title> <style>P,BODY{ font-family:arial,sans-serif; font-size:11px; }</style></head><body> <br><br><blockquote><b>There appears to be an error with the {$INFO['board_name']} database.</b><br> You can try to refresh the page by clicking <a href=\"java script:window.location=window.location;\">here</a>, if this does not fix the error, you can contact the board administrator by clicking <a href='mailto:{$INFO['email_in']}?subject=SQL+Error'>here</a> <br><br><b>Error Returned</b><br> <form name='mysql'><textarea rows=\"15\" cols=\"60\">".htmlspecialchars($the_error)."</textarea></form><br>We apologise for any inconvenience</blockquote></body></html>"; echo($out);
вместо них добавить (перед die(»»); ):
echo "<html><head><title>Технические работы</title>";
echo "</head>\r\n";
echo "<body>\r\n";
echo "<b>Форум на техническом обслуживании</b><br />\r\n";
echo "Попробуйте зайти позже. Либо нажмите кнопку<a href=\"java script:window.location=window.location;\"> обновить</a> в вашем браузере.";
echo "<p>Приносим извинения за причиненные неудобства.</p>";
echo "\r\n\r\n</body></html>";
Работает на DokuWiki |