Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум (новые сообщения вниз) Структурный форум

тема: запрет на прямой доступ к файлу

Сообщения:  [1-10]   [11-18] 

 
 автор: Bvz   (11.12.2008 в 18:38)   письмо автору
 
   для: sim5   (11.12.2008 в 17:21)
 

ну начитался статей про xss-атаки вот и сделал ))

Безопасное программирование на PHP

  Ответить  
 
 автор: sim5   (11.12.2008 в 17:21)   письмо автору
 
   для: Bvz   (11.12.2008 в 17:17)
 

Какого "вредоносного кода"? Ну если даже это "страшный" JS, то запишите его "как есть" в базу, а при выводе на страницу примените htmlspecialchars(). Будет работать JS-скрипт у вас? Код выполняется на странице, а не в базе.

  Ответить  
 
 автор: Bvz   (11.12.2008 в 17:17)   письмо автору
 
   для: sim5   (11.12.2008 в 17:10)
 

спасибо! вот теперь я понимаю смысл Ваших последних сообщений, т.к. Вы объяснили зачем )))
а как насчет вредоносного кода, он не повредит, если я буду делать как Вы сказали?

  Ответить  
 
 автор: sim5   (11.12.2008 в 17:10)   письмо автору
 
   для: Bvz   (11.12.2008 в 16:36)
 

Я конечно же не буду разбираться со всеми вашими скриптами, мне просто некогда это делать. Я не могу грамотно и красиво растолковать вам все о MySQL как это может Trianon (надеюсь, что он сделает для вас это), но скажу кратко - база, как это вам не покажется странным, может содеражать в себе какую угодно "крамолу", а уже при выводе из базы надо применить htmlspecialchars, а перед записью в нее - mysql_escape_string().
В базу писать нужно только тогда, когда все проверено и не содержит ошибок, а у вас она происходит по условию - if($_SERVER['REQUEST_METHOD']=='POST')... Ну как мне вам не отослать в вашу таблицу кучу пустых полей? Не вижу я тут гарантированной проверки.
А насчет почты - читайте, я прикрепил для вас.

  Ответить  
 
 автор: Bvz   (11.12.2008 в 16:36)   письмо автору
7 Кб
 
   для: sim5   (11.12.2008 в 16:20)
 

>1. Что-то я у вас не наблюдаю работы AJAX, ну коли проверяте, и не допускаете полей пустых, то не видно условия, что все ОК и пишем в базу.

вот index.php
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />

    <link rel="stylesheet" type="text/css" media="screen" href="css/guestbook.css" />
    <link rel="stylesheet" type="text/css" media="screen" href="css/screen.css" />

    <script src="script/jquery.js" type="text/javascript"></script>
    <script src="script/jquery.validate.js" type="text/javascript"></script>

    <script src="script/cmxforms.js" type="text/javascript"></script>

        <script type="text/javascript">
        $(document).ready(function() {
            $("#commentForm").validate();
        });
        </script>

        <style type="text/css">
        #commentForm { width: 500px; background-color: #044f9b; padding-left: 10px;}
        #commentForm label { width: 250px; }
        #commentForm label.error, #commentForm input.submit { margin-left: 253px; }
        </style>

<title></title>
</head>

<body>
<div class="content">
<?php
include "db/dbconnect.php";
$num 5;

$page $_GET['page'];

$result = @mysql_query("SELECT COUNT(*) FROM guestbook");
$posts = @mysql_result($result,0);
    if(!isset(
$posts) || $posts == 0) {
        echo 
"&#205;&#229;&#242; &#241;&#238;&#238;&#225;&#249;&#229;&#237;&#232;&#233;";
    }
    else {
        
$total intval(($posts 1) / $num) + 1;
        
$page intval($page);

        if(empty(
$page) or $page 0$page 1;

        if(
$page $total$page $total;

        
$start $page $num $num;
        
$result = @mysql_query("SELECT * FROM guestbook LIMIT $start$num");

        while ( 
$postrow[] = @mysql_fetch_array($result));

    for(
$i 0$i $num$i++)
        {
        if (isset(
$postrow[$i]['id_guestbook'])) {
            echo 
"<table class=\"message\" bgcolor=\"#044f9b\" width=\"100%\" cellpadding=\"10px\" cellspacing=\"0\" border=\"0\" >
                  <tr><td bgcolor=\"#024181\" id=\"name\"><strong>&#232;&#236;&#255;:   </strong><i>"
.$postrow[$i]['name']."</i></td></tr>
                   <tr><td id=\"city\"><strong>&#227;&#238;&#240;&#238;&#228;: </strong><i>"
.$postrow[$i]['city']."</i></td></tr>
                  <tr><td id=\"message\"><strong>&#241;&#238;&#238;&#225;&#249;&#229;&#237;&#232;&#229;: </strong><br /><i>"
.$postrow[$i]['message']."</i></td></tr>
                  <tr><td id=\"d_m\"><strong>&#238;&#242;: </strong><br /><i>"
.$postrow[$i]['date_message']."</i></td></tr>
                  <tr><td id=\"answer\"><strong>&#238;&#242;&#226;&#229;&#242;:      </strong><br /><i>"
.$postrow[$i]['answer']."</i></td></tr>
                  <tr><td id=\"d_a\"><strong>&#238;&#242;:      </strong><br /><i>"
.$postrow[$i]['date_answer']."</i></td></tr>
                  </table>"
;
        }
    }
    echo 
"</div>

    <div align=\"center\" class=\"pag\">"
;
    if (
$page != 1$pervpage '<a class="pag" href= ./guestbook.php?page=1><<</a>
                                 <a class="pag" href= ./guestbook.php?page='
. ($page 1) .'><</a> ';//&#236;&#229;&#237;&#255;&#229;&#236; &#237;&#224; &#237;&#243;&#230;&#237;&#251;&#229; &#241;&#242;&#240;&#224;&#237;&#232;&#246;&#251;

    
if ($page != $total$nextpage ' <a class="pag" href= ./guestbook.php?page='. ($page 1) .'>></a>
                                       <a class="pag" href= ./guestbook.php?page=' 
.$total'>>></a>';//&#236;&#229;&#237;&#255;&#229;&#236; &#237;&#224; &#237;&#243;&#230;&#237;&#251;&#229; &#241;&#242;&#240;&#224;&#237;&#232;&#246;&#251;

    
if($page 0$page2left ' <a class="pag" href= ./guestbook.php?page='. ($page 2) .'>'. ($page 2) .'</a> ';//&#236;&#229;&#237;&#255;&#229;&#236; &#237;&#224; &#237;&#243;&#230;&#237;&#251;&#229; &#241;&#242;&#240;&#224;&#237;&#232;&#246;&#251;
    
if($page 0$page1left ' <a class="pag" href= ./guestbook.php?page='. ($page 1) .'>'. ($page 1) .'</a> ';//&#236;&#229;&#237;&#255;&#229;&#236; &#237;&#224; &#237;&#243;&#230;&#237;&#251;&#229; &#241;&#242;&#240;&#224;&#237;&#232;&#246;&#251;

    
if($page <= $total$page2right ' <a class="pag" href= ./guestbook.php?page='. ($page 2) .'>'. ($page 2) .'</a>';//&#236;&#229;&#237;&#255;&#229;&#236; &#237;&#224; &#237;&#243;&#230;&#237;&#251;&#229; &#241;&#242;&#240;&#224;&#237;&#232;&#246;&#251;
    
if($page <= $total$page1right ' <a class="pag" href= ./guestbook.php?page='. ($page 1) .'>'. ($page 1) .'</a>';//&#236;&#229;&#237;&#255;&#229;&#236; &#237;&#224; &#237;&#243;&#230;&#237;&#251;&#229; &#241;&#242;&#240;&#224;&#237;&#232;&#246;&#251;

    
echo $pervpage.$page2left.$page1left.'<b> &nbsp;' .$page'&nbsp; </b>'.$page1right.$page2right.$nextpage;//&#236;&#229;&#237;&#255;&#229;&#236; &#237;&#224; &#237;&#243;&#230;&#237;&#251;&#229; &#241;&#242;&#240;&#224;&#237;&#232;&#246;&#251;
    
}
?>
</div>

<div class="content">
    <form class="cmxform" id="commentForm" neme="guestbook" method="post" action="insert.php">
        <p align="center">&#199;&#224;&#228;&#224;&#233;&#242;&#229; &#241;&#226;&#238;&#233; &#226;&#238;&#239;&#240;&#238;&#241;:</p>
        <p>
        <label for="cname">&#200;&#236;&#255; (&#238;&#225;&#255;&#231;&#224;&#242;&#229;&#235;&#252;&#237;&#238;)</label>
        <input id="cname" name="name" class="required" minlength="2" />
        </p>
        <p>
        <label for="ccity">&#195;&#238;&#240;&#238;&#228; (&#238;&#225;&#255;&#231;&#224;&#242;&#229;&#235;&#252;&#237;&#238;)</label>
        <input id="ccity" name="city" class="required" minlength="2" />
        </p>
        <p>
        <label for="cemail">E-Mail (&#238;&#225;&#255;&#231;&#224;&#242;&#229;&#235;&#252;&#237;&#238;)</label>
        <input id="cemail" name="email" class="required email" />
        </p>
        <p>
        <label for="ccmessage">&#194;&#224;&#248; &#226;&#238;&#239;&#240;&#238;&#241; (&#238;&#225;&#255;&#231;&#224;&#242;&#229;&#235;&#252;&#237;&#238;)</label>
        <textarea id="cmessage" name="message" class="required" minlength="22" ></textarea>
        </p>
        <p>
        <input class="submit" type="submit" value="&#206;&#242;&#239;&#240;&#224;&#226;&#232;&#242;&#252;"/>
        </p>
    </form>
</div>
</body>
</html>


>В вашем примере - взяли, от-htmlspecialchars-сили, заменили кавычки и айда на запись, и где же проверка?

проверка чего?

Кстати, а так ли нужен htmlspecialchars перед записью в базу? Как в прочем и о кавычках.

насколько я понял что нужен, эту идею я взял здесь на форуме и в скрипте гостевой книги, который рекомендуют, если нет поясните за тем я здесь

>2. А если я вам пришлю адрес as karabas@as, на этот адрес прийдет письмо?
>
нет не придет, здесь Вы правы!

>ПОЧТА! То что отправляется ваша почта, это еще совсем не означает, что ее прочитает получатель! IF (mail(...)) echo "OK", это еще не означает, что действительно ОК! Почитайте о почте.

а вто и insert.php

        <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
        <html xmlns="http://www.w3.org/1999/xhtml">
        <head>
        <meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
        <link rel="stylesheet" type="text/css" media="screen" href="css/guestbook.css" />
        <title>Гостевая книга</title>
        </head>

        <body>
        <?php

        
// подключаемся к БД
        
include "db/dbconnect.php";

        
// проверяем на прямой доступ
        // если данные пришли из формы обрабатываем их
        
if($_SERVER['REQUEST_METHOD']=='POST') {

            
// обрабатываем введеные данны для защиты от нежелательных скриптов
            
$name $_POST['name'];
            
$name htmlspecialchars(stripslashes($name));
            
$name str_replace("'","`",$name);
            
$city $_POST['city'];
            
$city htmlspecialchars(stripslashes($city));
            
$city str_replace("'","`",$city);
            
$email $_POST['email'];
            
$message $_POST['message'];
            
$message htmlspecialchars(stripslashes($message));
            
$message str_replace("'","`",$message);
            
$d_m date('c');

            
// формируем sql запрос
            
$insert_query="INSERT into guestbook values(
            '',
            '"
.$name."',
            '"
.$city."',
            '"
.$email."',
            '"
.$message."',
            '"
.$d_m."',
            '',
            ''
            )"
;

            
// записываем полученные данные в БД
            
if (mysql_query($insert_query))
            {

                
// отсылаем письмо администратору о добавлении нового сообщения
                
if($sendmail)
                {
                    
$theme "Новое сообщение на сайте!";
                    
$letter "$message";
                    
mail($adminmail$theme$letter"Content-type:text/plain; Charset=windows-1251\r\n");
                }

                
// сообщаем о добавлении нового сообщения и передаресуем пользователя на страницу гостевой книги
                
echo "Данные успешно добавлены! Страница будет перезагружена через 5 секунд!" ;
                echo 
"<br /><a href='guestbook.php'>Нажмите ссылку, если Ваш браузер не поддерживает автоматическую переадресацию!</a>";
                echo 
"<meta http-equiv='refresh' content='5; url=guestbook.php'>";//меняем на нужную страницу
            
}

            
// при ошибке обработки и записи в БД сообщаем пользователю
            
else
            {
                echo 
"Произошла ошибка при отправке Вашего сообщения!<br />";
                echo 
"<a href='guestbook.php'>Вернуться!</a>";//меняем на нужную страницу
            
}
        }

        
// проверяем на прямой доступ
        // если прямое обращение к файлу переадресовываем на страницу сообщений
        
else {
            echo 
"Вы не ввели данные! Страница будет перезагружена через 5 секунд!" ;
            echo 
"<br /><a href='guestbook.php'>Нажмите ссылку, если Ваш браузер не поддерживает автоматическую переадресацию!</a>";
            echo 
"<meta http-equiv='refresh' content='5; url=guestbook.php'>";//меняем на нужную страницу
        
}
        
?>
        </body>
    </html>


прикрепляю сам скрипт

  Ответить  
 
 автор: sim5   (11.12.2008 в 16:20)   письмо автору
122.5 Кб
 
   для: Bvz   (11.12.2008 в 16:01)
 

1. Что-то я у вас не наблюдаю работы AJAX, ну коли проверяте, и не допускаете полей пустых, то не видно условия, что все ОК и пишем в базу. В вашем примере - взяли, от-htmlspecialchars-сили, заменили кавычки и айда на запись, и где же проверка? Кстати, а так ли нужен htmlspecialchars перед записью в базу? Как в прочем и о кавычках.

2. А если я вам пришлю адрес as karabas@as, на этот адрес прийдет письмо?

ПОЧТА! То что отправляется ваша почта, это еще совсем не означает, что ее прочитает получатель! IF (mail(...)) echo "OK", это еще не означает, что действительно ОК! Почитайте о почте.

  Ответить  
 
 автор: Bvz   (11.12.2008 в 16:01)   письмо автору
 
   для: sim5   (11.12.2008 в 15:43)
 

>Во-первых, чтобы не получать и не записывать пустого в базу, нужно проверять - заполены ли вообще поля.
я для этого взял скрипт на AJAX jQuery plugin: Validation верхнюю
он пока не заполнишь корректно не отправит форму

>Во-вторых, нужно проверять поля на ошибки, поле адреса, это уж обязательно!
на какие ошибки?

>В третьих - при наличии ошибок ввода пользователем, нужно сообщать ему об этом, возвращая ему форму и сообщения об ошибках.
это делает скрипт сразу же при заполнении
верхняя форма попробуйте пустые поля отправить
И в четвертых - так почту не отправляют (для русской кодировки).
а как я спрашивал здесь мне сказали так, по крайней мере она уходит и приходит

я включил проверку IF($_SERVER['REQUEST_METHOD']=='POST')
и вроде пустые поля теперь не пишутся - я правильно сделал?

  Ответить  
 
 автор: sim5   (11.12.2008 в 15:43)   письмо автору
 
   для: Bvz   (11.12.2008 в 15:05)
 

Во-первых, чтобы не получать и не записывать пустого в базу, нужно проверять - заполены ли вообще поля. Во-вторых, нужно проверять поля на ошибки, поле адреса, это уж обязательно! В третьих - при наличии ошибок ввода пользователем, нужно сообщать ему об этом, возвращая ему форму и сообщения об ошибках. И в четвертых - так почту не отправляют (для русской кодировки).

  Ответить  
 
 автор: Bvz   (11.12.2008 в 15:05)   письмо автору
 
   для: sim5   (11.12.2008 в 15:00)
 

спасибо, а как правильно обработать поля?
я делаю так


        <?php

        
include "db/dbconnect.php";

        
$name $_POST['name'];
        
$name htmlspecialchars(stripslashes($name));
        
$name str_replace("'","`",$name);
        
$city $_POST['city'];
        
$city htmlspecialchars(stripslashes($city));
        
$city str_replace("'","`",$city);
        
$email $_POST['email'];
        
$message $_POST['message'];
        
$message htmlspecialchars(stripslashes($message));
        
$message str_replace("'","`",$message);
        
$d_m date('c');

        
$insert_query="INSERT into guestbook values(
        '',
        '"
.$name."',
        '"
.$city."',
        '"
.$email."',
        '"
.$message."',
        '"
.$d_m."',
        '',
        ''
        )"
;

        if (
mysql_query($insert_query))
        {

            if(
$sendmail)
            {
                
$theme "Новое сообщение на сайте!";
                
$letter "$message";
                
mail($adminmail$theme$letter"Content-type:text/plain; Charset=windows-1251\r\n");
            }

            echo 
"Данные успешно добавлены! Страница будет перезагружена через 5 секунд!" ;
            echo 
"<br /><a href='guestbook.php'>Нажмите ссылку, если Ваш браузер не поддерживает автоматическую переадресацию!</a>";
            echo 
"<meta http-equiv='refresh' content='5; url=guestbook.php'>";
        }

        else
        {
            echo 
"Произошла ошибка при отправке Вашего сообщения!<br />";
            echo 
"<a href='guestbook.php'>Вернуться!</a>";
        }

        
?>

  Ответить  
 
 автор: sim5   (11.12.2008 в 15:00)   письмо автору
 
   для: Bvz   (11.12.2008 в 14:45)
 

Ну юмор :) Форма в любом случае должна обращаться к файлу обработчику, в данном случае это insert.php. Его не зачем скрывать (хотя при некоторых условиях, можно и обойти это). Если хотите через index.php, тоже нет проблем, проверяйте в index.php, если пришел запрос от формы, подключайте файл обработчик, или переадресовывайте на него, что в общем не так важно. А поля пустые не потому, что к этому файлу идет обращение, а потому, что вы неверно обрабатываете и запысываете данные из формы.

  Ответить  

Сообщения:  [1-10]   [11-18] 

Форум разработан IT-студией SoftTime
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования