Безопасность в кодеигниторе - PullRequest
4 голосов
/ 04 августа 2011

Добрый день,

У меня есть некоторые сомнения по поводу безопасности в CodeIgniter, первое:

У меня есть контроллер: news.php, и в нем у меня есть методcall view

Пример:

class News extends CI_Controller{

    public function view( $id )
    {
        $this->load->model('news_model');
        $this->news_model->get_by_id( $id );
        // ...
    }
}

Эта форма работы безопасна?нет риска внедрения SQL по URL?принимая во внимание, что эта страница доступна так mywebpage / news / number_id.Было бы интересно отфильтровать через intval () или ненужно?

Мой второй вопрос:

По умолчанию фильтр CodeIgniter xss может публиковать и получать, но неизвестно, способ фильтрации HTML по CodeIgniter,Я создал помощника в CodeIgniter, есть какой-то способ, подобный тому, который есть в родном CodeIgniter?

function remove_xss_html($string){

    if( is_array( $string ) ){

    $return_array = array();

        foreach( $string as $item )
        {
            if(!get_magic_quotes_gpc())
            {
                $return_array[] =  addslashes( htmlspecialchars( strip_tags( $item ) ) );
            }
            else
            {
                $return_array[] =  htmlspecialchars( strip_tags( $item ) );
            }
        }
            return $return_array;
    }
    else
    {
        return htmlspecialchars( strip_tags( $string ) );
    }
}

, и третий и последний вопрос:

Если я отправлю переменную $ this-> input-> post ('my_var') напрямую в базу данных без фильтра, я рискую впрыскивать sql?CodeIgniter или фильтры так безопасно?

ВАЖНО: Мой английский не очень хорош, я использовал гугл переводчик и исправлял то, что мог.

Спасибо всем ...

Ответы [ 2 ]

6 голосов
/ 05 августа 2011

Если вы используете класс Active Record для взаимодействия с БД, данные будут автоматически экранированы:

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

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

Несколько советов по вашей функции:

public function view( $id )
{
    $this->load->model('news_model');
    $this->news_model->get_by_id( $id );
    // ...
}

Если $id отсутствует в URL, вы получите уведомление об ошибке.Установите значение по умолчанию:

public function view( $id = NULL )

Затем проверьте значение в вашем контроллере.Пример:

if ( ! $id)
{
    redirect('somwhere/else');
}

Кроме того, убедитесь, что вы получили результат, прежде чем продолжить (я предполагаю, что ваша модель возвращает false здесь, если запись не найдена):

$record = $this->news_model->get_by_id( $id );
if ( ! $record) // redirect with error message or something

Можно проверитьтип или целостность $id столько, сколько вы хотите, но для простоты я бы просто передал это модели и вернул false, если запись не была найдена.

0 голосов
/ 05 августа 2011

Даже если вы не используете активные записи, обеспечивается автоматическое экранирование.Вам просто нужно запросить БД следующим образом:

$data=array($id, $name);
$this->db->query("SELECT * FROM table WHERE id=? OR name=?", $data);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...