CodeIgniter URL - PullRequest
       9

CodeIgniter URL

1 голос
/ 22 декабря 2009

Любой из вас, кто работал с CI, знает, что он использует сегментный подход для URL, например:

1002 *

Давайте предположим, что я создал следующий URL, чтобы отправить нам контактинформация о форме:

index.php/contact/submit_contact

Теперь есть одна вещь, которая кажется неправильной.Что если плохой парень увидит исходный код моей страницы контактов и посмотрит на атрибут действия формы?Он может просто скопировать и вставить в адресную строку браузера напрямую, и моя форма будет отправлена ​​с пустыми значениями.

Еще одна плохая вещь, которую он может сделать и, скорее всего, сделает, это подделка кросс-сайтов CSFR.

Как избежать этой проблемы.

Примечание: Я знаю, что мне нужно проверить свою форму по пустым значениям и не отправлять ее, если поля пусты, но я ищудля лучшего общего решения этой проблемы.

Ответы [ 4 ]

11 голосов
/ 22 декабря 2009

Нет лучшего решения этой проблемы. Каждая веб-страница, которую вы когда-либо создавали, должна предполагать, что все вводимые пользователем данные являются враждебными, и обрабатывать их соответствующим образом.

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

Даже если вы используете Javascript для проверки формы и предотвращения ее отправки, если она не верна, вам все равно придется повторить проверку на стороне сервера, поскольку любой может отключить Javascript перед отправкой формы, заполненной неверными значениями.

2 голосов
/ 23 декабря 2009

Одно не очень крутое решение - использовать капчу. Они не позволят кому-либо просто отправлять свои действия в форме, но также будут раздражать ваших пользователей.

http://codeigniter.com/wiki/captcha/

1 голос
/ 27 августа 2011

Вот некоторые подробности о решении zombat с примерами кода.

У меня обычно есть форма сообщения на тот же контроллер / метод. Затем я позволяю $ this-> form_validation-> run () обрабатывать всю грязную работу. Если присутствуют данные $ _POST, валидатор проверяет правила. Если он проходит, я перенаправляю их на страницу успеха, в противном случае та же страница отображается с ошибками проверки, отображаемыми в заполненной форме.

class Contact extends CI_Controller {

    function __construct() {
        parent::__construct();
    }

    function index() {
        /*
            the foreach() line makes each field visible
            to form_validation so we can reliably
            repopulate (using set_value, set_checkbox,
            etc) fields that have no validation rules

            example: since 'phone' has no rules, we would
            not be able to repopulate that field if
            validation failed
        */
        foreach ($_POST as $key => $value) $this->form_validation->set_rules($key, '', '');
        $this->form_validation->set_rules('first_name', 'First Name', 'required|min_length[2]');
        $this->form_validation->set_rules('last_name', 'Last Name', 'required|min_length[2]');
        $this->form_validation->set_rules('email', 'Email Address', 'required|strtolower|valid_email');
        if ($this->form_validation->run() == FALSE) {
            $this->load->view('contact_form');
        } else {
            /*
                save form data, email it, etc
                then redirect the user so they
                cannot re-submit the same data
            */
            redirect('contact/success');
        }
    }

    function success() {
        $this->load->view('contact_success');
    }

}

Пример HTML для приложения / views / contact_form.php

<form method="post" action="<?php echo current_url(); ?>">
    <table>
        <tr>
            <td>First Name</td>
            <td><?php echo form_input('first_name', set_value('first_name')); ?>
            <?php echo form_error('first_name'); ?></td>
        </tr>
        <tr>
            <td>Last Name</td>
            <td><?php echo form_input('last_name', set_value('last_name')); ?>
            <?php echo form_error('last_name'); ?></td>
        </tr>
        <tr>
            <td>Email Address</td>
            <td><?php echo form_input('email', set_value('email')); ?>
            <?php echo form_error('email'); ?></td>
        </tr>
        <tr>
            <td>Phone Number</td>
            <td><?php echo form_input('phone', set_value('phone')); ?>
            <?php echo form_error('phone'); ?></td>
        </tr>
        <tr>
            <td>&nbsp;</td>
            <td><button type="submit">Send Message</button></td>
        </tr>
    </table>
</form>

Я абсолютно не беспокоюсь о том, что CSFR или XSS будут делать это таким образом.

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

1 голос
/ 22 декабря 2009

Инструмент проверки формы CodeIgniter прост в использовании и автоматически обрабатывает большинство распространенных случаев.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...