В каждом блоге/статье/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)).'")');
Это будет сгенерировано исключение, которое будет захват обработчик исключений, и, самое главное, я запретил вставлять ложные положительные значения в базу данных, обеспечивая согласованность данных.
У меня пропало что-то? Я играю в безопасности, или я параноик? :)
Никто, кто заботится о безопасности, даже не рекомендует * вызов * mysql_real_escape_string! Просто не делай этого, дети. – Cheekysoft