2012-04-25 5 views
3

В каждом блоге/статье/Q & A Я прочитал, никто не предложил проверить значение, возвращаемое mysql_real_escape_string().Зачем нужно возвращать mysql_real_escape_string()

Как я вижу, эта проверка очень важна для обеспечения согласованности данных, потому что если эта функция завершится неудачно, значение, вставленное в базу данных, будет ложным: это логическое значение FALSE, отличное как строка, в результате чего пустая строка, а не то, что вы ожидаете.

Согласно документации:

Returns the escaped string, or FALSE on error. 

A MySQL connection is required before using mysql_real_escape_string() otherwise an error of level E_WARNING is generated, and FALSE is returned. If link_identifier isn't defined, the last MySQL connection is used. 

Предупреждение хорошо, если вы идете в журналы, чтобы посмотреть, что случилось, но не помешало бы это не происходило.

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

Эта функция будет выполнена, если:

  • разработчик не подключиться к базе данных перед вызовом этой функции
  • подключение к базе данных не удалось перед вызовом этой функции
  • память о сервере (где MySQL клиент находится) является низким и не может скопировать строку для выхода
  • ...

Это Exemple «нормальной» использования:

$db = mysql_connect() or die('Cannot connect to database'); 
$value = mysql_real_escape_string($_POST['value'], $db); 
mysql_query('insert into tablex (value) values ("'.$value.'")', $db) or die('Cannot insert data in database'); 

Я использую что-то вроде этого (в утра OO обертку для MySQL):

class mywrapper{ 
    // ... [code ...] 

    // $this->db is the mysql link identifier 
    public function escape($string) 
    { 
     if(mysql_real_escape_string($string, $this->db) === false) 
     { 
      throw new Exception('Some message'); 
     } 
    } 
} // end class  

    // I'm calling it as 
    // $myWrapper->insert('insert into tablex (value) values ("'.($myWrapper->escape($value)).'")'); 

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

У меня пропало что-то? Я играю в безопасности, или я параноик? :)

+0

Никто, кто заботится о безопасности, даже не рекомендует * вызов * mysql_real_escape_string! Просто не делай этого, дети. – Cheekysoft

ответ

0

Нет, я не думаю, что вы параноик. (Или мы оба параноидально)

Я думаю также, что это определенно хорошая практика, чтобы избежать отправки nothing в запросе MySQL (довольно много, как вы не хотели бы, чтобы послать переменную nothing значных $_POST).

-1

я отметил проблемы, которые вы упомянули:

Это Exemple "нормальной" использования:

$ дб = mysql_connect();

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

Если вы потеряете соединение, тем временем ваш запрос не удастся, поэтому не имеет значения, что вы отправили (2).

mysql_real_escape_string делается на стороне клиента, поэтому использование памяти сервера mysql не является проблемой (3).

+0

mysql_real_escape_string() был важен ... :) Я изменился, поэтому он выглядит как «нормальное» использование. –

+0

Уважаемый незнакомец, спасибо за то, что выложили пару моих ответов в пакете. –

2

В каком-то смысле вы что-то упускаете, так как это no longer recommended to use the mysql_ Семейство функций. Вместо этого используйте mysqli или PDO. Обе из них предоставляют параметризованные запросы, которые автоматически вытеснят ваши входные данные для вас.

+0

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

+0

@RaduMaris Да, я ценю это. Я собирался добавить это как комментарий, но со всеми ссылками, которые, как я думал, будет лучше читать как ответ (и вы не указали, что знаете о других расширениях ...) – liquorvicar