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

Форум PHP

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

 

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

вид форума:
Линейный форум Структурный форум

тема: запрет на прямой доступ к файлу
 
 автор: Bvz   (11.12.2008 в 13:05)   письмо автору
 
 

а только через переадресацию или после заполнения формы как сделать?

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

Отдавать файл скриптом, а уж перадресация или форма, это уже второе. Ищите в этом разделе, примеров много, зачем повторять.

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

а по каким словам искать ))

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

сделал так
Можно в главной странице, перед вызовом конструкций include, объявить константу
<?php
define("INCLUDE", 1);
?>

а в начале каждого включаемого файла проверять определена константа или нет.
<?php
if(!defined("INCLUDE")) exit();
?>

не работает
так тоже


в индекс.пхп перед инклудом пишем.
define ('MAIN', TRUE);
в инклуденом файле в самом начале пишем
if (!defined('MAIN')) die ('Wrong url'); -

при любом раскладе запрещает доступ к странице и все ((

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

Че к чему? :) Вас что интересует, как запретить прямой доступ к файлу, или как проверить, что условие к доступу получено?

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

Меня интересует 2 вопроса
1. запрет на прямой доступ к файлу
2. запрет на прямой доступ к файлу, который обрабатывает и записывает данные из заполненной формы, как я понял это разные функции.

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

1. Запрет на прямой доступ (получение), например, для скачивания - отдавать файл посредством скрипта, а не по прямой ссылке, например.
2. Если это и есть файл на который вы ограничиваете доступ, и доступ для скачивание, то см. 1.

Вы лучше "на пальцах расскажите" чего хотите, или покажите то, что у вас есть, но не получается.

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

есть файл index.php в нем есть форма


<form name="message" action="insert.php" method="post">
форма
</form>


при заполнении формы происходит переадресация в файл insert.php, где происходит обработка данных и запись их в БД.

я хочу запретить прямой доступ в файл insert.php, только из index.php, иначе пишутся пустые поля при непосредственном обращении к нему

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

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

  Ответить  
 
 автор: 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:43)   письмо автору
 
   для: Bvz   (11.12.2008 в 15:05)
 

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

  Ответить  
 
 автор: 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 в 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: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 в 17:10)   письмо автору
 
   для: Bvz   (11.12.2008 в 16:36)
 

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

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

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

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

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

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

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

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

  Ответить  
Rambler's Top100
вверх

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