mysql_real_escape_string, stripslashes и htmlspecialchars

Когда я публикую переменную в базу данных, я использую mysql_real_escape_string, Таким образом, специальные символы попадают в базу данных, как и должно быть.

Когда я читаю эту переменную из базы данных, я снова использую my sql_real_escape_string вместе с stripslashes:

$var = stripslashes(mysql_real_escape_string($record['rowname']));

иначе это даст мне косую черту перед кавычками.

Когда я использую это $var Я упоминал выше и хочу повторить это, я просто могу echo "$var" потому что он уже был раздет и сбежал, верно?

И кроме того, если я использую stripslashes + mysql_real_escape_string переменной, затем снова поместите эту же переменную в базу данных, mysql_real_escape_string довольно? Или мне нужно stripslashes опять эта переменная?

Обобщенная:

Как я знаю, как это работает:

  1. использование mysql_real_escape КАЖДЫЙ раз при использовании данных с mysql: при чтении запроса через переменные так же, как при отправке переменных в базу данных.
  2. использование stripslashes при выводе экранированных переменных.
  3. Если вы хотите опубликовать stripslashes и снова экранировал переменные в базе данных, вам не нужно лишать его снова.

Я скучаю htmlspecialchars?

РЕДАКТИРОВАТЬ

Так это все неправильно?

    while( $record=mysql_fetch_array($result) ) 
    {
        $custid=mysql_real_escape_string($record['custid']);
        $custsurname=mysql_real_escape_string($record['custsurname']);
        $custmidname=mysql_real_escape_string($record['custmidname']);
        $custforename=mysql_real_escape_string($record['custforename']);
        $custcountry=stripslashes(mysql_real_escape_string($record['custcountry'])); }

2 ответа

Боюсь, вы делаете это неправильно. Ключевым моментом является то, что экранирование зависит от контекста, и вы полностью игнорируете этот факт.

В каждом формате данных есть слова или символы, которым назначены специальные значения в спецификации формата. Например, ' Символ в SQL означает "разделитель строк", ? Символ в URL означает "начальная строка запроса" и < Символ в HTML означает "начальный тег". Вам нужно экранировать, когда вы хотите вставить буквальное слово или символ, то есть вы хотите вставить его как есть и удалить его специальное значение.

Как только вы узнаете об этом, станет ясно, что синтаксис варьируется в зависимости от формата и контекста. < означает "начальный тег" в HTML, но не в SQL или URL. Таким образом, вам нужно использовать метод экранирования, который построен для целевого формата и следует правилам формата.

Если вы делаете mysql_real_escape_string() при чтении данных из базы данных вы говорите "экранируйте мои данные, чтобы их можно было вставить как внутри строки SQL". Ваши данные готовы для использования внутри в виде строки SQL, но повреждены для любого другого использования.

В этом примере, случается, что stripslashes() отменяет большинство из того, что mysql_real_escape_string() сделал так, что вы в конечном итоге с выходом, который в основном не изменился. Но это чистый шанс.

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

1 Примечание: устаревшее расширение mysql устарело в течение нескольких лет, когда стали доступны лучшие альтернативы, и оно больше не является частью языка.

Обновление: небольшое уточнение - побег - это всего лишь синтаксическая хитрость. Вы не изменяете ввод для глаз целевого механизма, который просто видит исходные данные как есть. Таким образом, нет необходимости удалять входные данные при извлечении.

Вам не нужно stripslashes или же mysql_real_escape_string данные, поступающие из базы данных, вам просто нужно экранировать перед запросом, чтобы синтаксический анализатор знал, что такое специальные символы и какие буквенные символы.

stripslashes никогда не следует использовать (как хак для исправления некоторых симптомов), если после экранирования вам понадобится переменная, используйте оригинальную:

$data_safe = mysql_real_escape_string( $data );
//$data can still be used normally

Экранирование предназначено только для определенного контекста. Если контекст является запросом mysql, то вы будете иметь реальный выход mysql только для запроса и ничего больше. Если контекст является выводом html, то перед выводом строки в виде html вы получите htmlescape. Ни в коем случае вы не хотите на самом деле изменить сами данные. Если вы неправильно поймете это, вы увидите O\'Brian а также O&#39;Brian и т.п.

Другие вопросы по тегам