mysql-real-escape-string: Доступ запрещен в CakePHP

Я пытаюсь очистить ввод с помощью mysql-real-escape-string, прежде чем сохранить данные в своей базе данных с помощью CakePHP. И я получаю следующую ошибку

mysql_real_escape_string () [function.mysql-real-escape-string]: доступ запрещен для пользователя «никто» @ «localhost» (с использованием пароля: НЕТ)

Мой код:

public function admin_videos($id = null) {
        if(!($this->isLogged() && $this->isAuthorized())) {
            $this->redirect(array('controller' => 'users', 'action' => 'login', 'admin' => true));
        }
        if ($this->request->is('post')) {
            $this->request->data['MovieVideo']['video'] = mysql_real_escape_string($this->request->data['MovieVideo']['video']);
            $this->request->data['MovieTrailer']['video'] = mysql_real_escape_string($this->request->data['MovieTrailer']['video']);
            if ($this->Movie->saveAll($this->request->data)) {
                $this->Session->setFlash('The movie has been saved', 'admin/flash_success');
                $this->redirect(array('action' => 'index'));
            } else {
                $this->Session->setFlash('The movie could not be saved. Please, try again.', 'admin/flash_error');
            }
        } else {
          $this->request->data = $this->Movie->find('first', array('conditions' => array('Movie.id' => $id), 'contain' => array('MovieTrailer', 'MovieVideo')));
        }
    }

person Harsha M V    schedule 24.05.2012    source источник
comment
Примечание. Перед использованием mysql_real_escape_string() необходимо соединение с MySQL, иначе генерируется ошибка уровня E_WARNING и возвращается FALSE. Если link_identifier не определен, используется последнее соединение с MySQL.   -  person Ron van der Heijden    schedule 24.05.2012
comment
mysql_real_escape_string не требуется для CakePHP при использовании ORM   -  person Aurimas Ličkus    schedule 24.05.2012


Ответы (4)


Из документов:

CakePHP уже защищает вас от SQL-инъекций, если вы используете методы ORM CakePHP (такие как find() и save()) и правильную нотацию массива (например, array('field' => $value)) вместо необработанного SQL.

Так что забудьте о ручном вызове mysql_real_escape_string().

person Maerlyn    schedule 24.05.2012
comment
Я пытаюсь добавить видеокод Youtube в свою базу данных. Так мне не нужно использовать это? - person Harsha M V; 24.05.2012
comment
Слой пирога ORM уже позаботился о защите вас от атак sqli. - person Maerlyn; 24.05.2012
comment
Если вы находитесь в ситуации, когда вам нужно обойти уровень ORM и вручную очистить данные (например, сложные условия поиска), вы можете использовать Sanitize::escape($value, $connection) или $Model->getDataSource()->value($value) - person gapple; 07.06.2012
comment
Бывают случаи, когда вам нужно создать сложный SQL-запрос вручную и избежать ввода перед выполнением. - person Yaroslav; 25.11.2015

Я думаю, вы не подключились к базе данных mysql. Попробуйте mysql_connect() и mysql_select_db() с правильными учетными данными.

person ErikFWinter    schedule 24.05.2012

mysql_real_escape_string() требует подключения к базе данных в качестве второго параметра, если вы еще не открыли соединение: http://php.net/manual/en/function.mysql-real-escape-string.php

Вы можете попробовать одно из следующих действий:

  • Попробуйте использовать mysql_escape_string (который сейчас устарел)
  • Переключитесь на PDO и используйте функцию кавычек ( http://uk3.php.net/manual/en/pdo.quote.php )
  • Сначала инициализируйте соединение с вашей базой данных и передайте это соединение в mysql_real_escape_string.

Как правило, я бы рекомендовал использовать PDO, так как он лучше объектно-ориентированный и более поддерживается, чем функции mysql_*.

person hobnob    schedule 24.05.2012

В случае сложных запросов, созданных вручную Sanitize::escape() для CakePHP 2.x или для CakePHP 3.x

    $connection = ConnectionManager::get('default');
    $clean_string = $connection->quote('dirty"string--%/\');
person Yaroslav    schedule 25.11.2015