|
|
|
|
|
для: Atom
(27.02.2005 в 19:01)
| | Я тут немного переделал:
<?php
chdir("../");
include"includes/config.php";
include"includes/utils.php";
$url_host = parse_url($HTTP_REFERER );
$referer=$url_host[host];
$referer=str_replace("www.", "", $referer);
$h_referer="http://".$referer;
if($h_referer!=$siteurl)
{
include"includes/header.php";
print"<br><br><center><b>Зачем тебе ломать этот сайт? Вали отсюда!</b></center>";
include"includes/footer.php";
exit();
}
$name=trim($_POST['name']);
$email=trim($_POST['email']);
$c_text=trim($_POST['c_text']);
$id=trim($_POST['id']);
if(empty($id)) # Если неопределена переменная id, то форма отправлена с чужого сайта...
{
include"includes/header.php";
echo"<br><br><center>Хакер? ха ха...</center>";
include "includes/footer.php";
exit();
}
if($id!="")
{
if(strspn($id,"0123456789") != strlen($id)) # Если переменная id содержит, что-то кроме цифор
{
include"includes/header.php";
echo"<br><br><center>Ой, что-то неполучилось взломать сайт :)</center>";
include "includes/footer.php";
exit();
}
}
if (empty($name)){ # Ввёл ли пользователь имя?
include"includes/header.php";
echo"<br><br><center><b>Введите ваше имя!</b></center>";
include "includes/footer.php";
exit();
}
if(strlen($name) > "40") # Оно больше 40 символов?
{
include"includes/header.php";
echo "<br><br><center><b>Ваше имя привышает 40 символов!</b></center>";
include "includes/footer.php";
exit;
}
if(preg_match("/<.*?(script|object|iframe|applet|meta|style|form).*?>/", $name)) # Хочет хакнуть сайт через скрипты?
{
include"includes/header.php";
print"<br><br><center>Хакер? ха ха...</center>";
include"includes/footer.php";
exit();
}
if (preg_match("/[^(\w)|(\x7F-\xFF)|(\s)]/",$name)) {
include"includes/header.php";
echo "<br><br><center><b>В имени можно использовать только буквы русского и латинского алфавита, цифры, знак _ и пробел.</b></center>";
include"includes/footer.php";
exit;
}
if (empty($c_text)){ # Ввёл ли пользователь текст комментария
include"includes/header.php";
echo"<br><br><center><b>Вы забыли ввести текст комментариев!</b></center>";
include "includes/footer.php";
exit();
}
if ($email != "") # Правильно ли ввёл пользователь e-mail
{
if (preg_match("/[^(\w)|(\@)|(\.)]/",$email))
{
include"includes/header.php";
print"<br><br><center><b>Неверно введен е-mail. Введите e-mail в виде <i>email@email.ru</i></b></center>\n";
include "includes/footer.php";
exit;
}
}
if(strlen($email) > "40") # Он больше 40 символов?
{
include"includes/header.php";
echo "<br><br><center><b>Ваш e-mail привышает 40 символов!</b></center>";
include "includes/footer.php";
exit;
}
if(strlen($c_text) > "5000") # Текст комментария привышает 5000 символов?
{
include"includes/header.php";
echo "<br><br><center><b>Текст комментариев привышает 5000 символов!</b></center>";
include"includes/footer.php";
exit;
}
/* Обработаем имя, e-mail и текст комментария */
$name=htmlspecialchars(addslashes($name));
$email=htmlspecialchars(addslashes($email));
$c_text=addslashes($c_text);
if (!get_magic_quotes_gpc())
{
$name = mysql_escape_string($name);
$email = mysql_escape_string($email);
$c_text = mysql_escape_string($c_text);
}
mysql_query("UPDATE news SET comm=comm+1 WHERE id='".$id."'");
$query = "INSERT INTO news_commentaries (cid, id, name, email, c_text, date) values (NULL, '".$id."', '".$name."', '".$email."', '".$c_text."', now())";
mysql_query($query, $db);
if($save!="")
{
setcookie("comm_name", $name, time() + 3600*24*14);
if($email!="")
{
setcookie("comm_email", $email, time() + 3600*24*14);
}
}
header("Location: ".$siteurl."/news/".$id.".html");
?>
|
P.S. c_text обрабатывается htmlspecialchars толькл при выводе в браузер ))) | |
|
|
|
|
|
|
|
для: imi
(27.02.2005 в 17:38)
| | Ой, точно, я код невнимательно читал.
Кст, вопрос к Храптору.
Конкретизируйте, пожалуйста, в каких случаях mysql_escape_string не спасает от sql инъекций? | |
|
|
|
|
|
|
|
для: Atom
(27.02.2005 в 16:14)
| | Доктор, я, кажется, разговариваю на другом языке :)))
Итак, берем укороченную версию скрипта, адаптированного для тестов:
$text= (isset($HTTP_POST_VARS['text']))? $HTTP_POST_VARS['text']:'';
if (!get_magic_quotes_gpc())
{
$text = mysql_escape_string($text);
}
echo $text;
echo '<form method="post"><input name="text"><input type="submit"></form>';
|
Теперь выделяем из поста ХРраптора предлагаемый кусок кода и вставляем в форму, жмем кнопку.
Что происходит? что-то экстраординарное? Выдается test@mail.com; print \"\";
т.е. не выполнилась ни инструкция PHP, ни javascript.
Я чего-то не понимаю?
P.S. Приятно удивлен вашим терпением :) На других форумах давно бы уже облили грязью... | |
|
|
|
|
|
|
|
для: imi
(27.02.2005 в 16:08)
| | Обычно средствами JavaScript вытаскивают конфидициальную информацию из cookie (логины, пароли) и отправляют её на хост злоумышленника. | |
|
|
|
|
|
|
|
для: imi
(27.02.2005 в 16:08)
| | Мдя....
А тот код, который не показал Раптор, но покажет другой, менее благонастроенный человек опасен.
К примеру
print system("что-то плохое");
очень опасно. | |
|
|
|
|
|
|
|
для: Atom
(27.02.2005 в 15:23)
| | Вопрос - какой код? Тот код, который показал ХРраптор - безопасен. | |
|
|
|
|
|
|
|
для: imi
(27.02.2005 в 14:52)
| | Дыра в том, что если человек введет имеил, и после имейла свой код, то скрипт пропустит этот код. | |
|
|
|
|
|
|
|
для: cheops
(27.02.2005 в 14:50)
| | Это понятно. Я не могу понять, где же в первоначальном скрипте дыра... | |
|
|
|
|
|
|
|
для: imi
(27.02.2005 в 14:15)
| | Приведённое выше постом регулярное выражение не допустит уже такого взлома, так как в нём явно указаны границы слова, после e-mail уже что-то написать не получится. | |
|
|
|
|
|
|
|
для: cheops
(27.02.2005 в 14:06)
| | Спасибо за ответы.
Но один вопрос остался-таки неотвеченным... Каких символов не хватает в посте ХРраптора? Где дыра? | |
|
|
|
|