Почему функция addslashes () не работает с моим массивом в php?

#php #arrays #session #escaping

#php #массивы #сессия #экранирование

Вопрос:

У меня есть ряд переменных сеанса в массиве. Когда я использую кавычки в одной из моих строковых переменных, я пытаюсь добавить косые черты, чтобы в конечном итоге вставить их в базу данных, но функция addslashes () не работает. Вот пример.

В поле комментариев я пишу это:

Это «комментарий»

Я понимаю, что это проблема, поэтому я добавил функцию, прежде чем вводить ее в базу данных, которая выполняется через ряд переменных сеанса, включая переменную comments.

 $strip_fields = array($_SESSION['comments'],$_SESSION['employee_id'],$_SESSION['approved_by'],$_SESSION['delivery_email'],$_SESSION['full_name'],$_SESSION['first_name'],$_SESSION['last_name']);

        foreach($strip_fields as $key => $value) {
            $key = addslashes($key);
        }
  

После запуска этой функции я пытаюсь отобразить переменную комментариев $_SESSION[‘comments’]

Это «комментарий»

Итак, я вижу, что функция addslashes почему-то работает не так, как я ее использую. Почему функция addslashes работает не так, как я ее использую?

ЭТО МОЕ РЕШЕНИЕ (я использовал немного из обоих предложений)

 $strip_fields = array(
            'employee_id', 'approved_by', 'delivery_email', 'full_name', 
            'first_name', 'last_name', 'title', 'title_2', 'dept_div', 
            'dept_div_2', 'email', 'comments', 'special_instructions'
        );

        foreach($strip_fields as $key) {
            $_SESSION[$key] = $conn->real_escape_string($_SESSION[$key]);
        }
  

Ответ №1:

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

Кроме того, вы не должны использовать addslashes для экранирования базы данных, поскольку каждая база данных (или уровень абстракции базы данных) имеет свой собственный способ экранирования данных (например, mysql_real_escape_string или подготовленные инструкции PDO).

Кроме того, $_SESSION и база данных — это разные способы сохранения данных, и вполне может быть, что их смешивание — плохой выбор дизайна.

РЕДАКТИРОВАТЬ ПОСЛЕ КОММЕНТАРИЯ…

Если вы хотите поместить все эти переменные в базу данных, а до этого они были в $_SESSION (что, как указывалось ранее, может быть не лучшей идеей), и вы используете модуль mysql php, тогда вы могли бы сделать что-то вроде:

 $db_names=array(
    "comments",
    "employee_id",
    "approved_by",
    "full_name",
    "first_name",
    "last_name"
);
$clean=array();
foreach($db_names as $name)
    $clean[$name]=mysql_real_escape_string($_SESSION[$db_name]);
mysql_query("
        INSERT INTO comments_table 
        (
            comments,
            employee_id,
            approved_by,
            full_name,
            first_name,
            last_name
        )
        VALUES
        (
            '{$clean["comments"]}',
            '{$clean["employee_id"]}',
            '{$clean["approved_by"]}',
            '{$clean["full_name"]}',
            '{$clean["first_name"]}',
            '{$clean["last_name"]}'
        )
");
  

Однако лучше не использовать модуль mysql, а вместо этого использовать mysqli или PDO. У каждого есть разные (и лучшие, по ряду причин) способы экранирования строк.

Комментарии:

1. 1 за то, что я единственный, кто упомянул, что это addslashes никогда не подходит для подготовки данных для вставки SQL .

2. Согласен. Иногда ответ на заданный вопрос не является правильным ответом. 🙂

3. Я ценю ваш вклад, но на самом деле это не решает мою проблему. Итак, как мне решить эту проблему. Без addslashes я все еще получаю ошибку MySQL при попытке добавить ее в DB, поскольку она содержит кавычки. Вы рекомендуете мне просто использовать mysql_real_escape_string вместо addslashes? Будет ли это работать в созданном мной массиве?

Ответ №2:

Здесь есть несколько ошибок:

  1. Вы копируете значения в $_SESSION в новые переменные.
  2. Вы передаете ключи в addslashes() , но вы поместили значения в значения массива.
  3. foreach() копирует значения из массива в $key и $value , таким образом, вы работаете с копией копии.

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

 $strip_fields = array(
        'comments', 'employee_id', 'approved_by', 'delivery_email', 
        'full_name', 'first_name', 'last_name']
    );

foreach($strip_fields as $key) {
    $_SESSION[$key] = addslashes($_SESSION[$key]);
}
  

Комментарии:

1. Спасибо за вашу помощь. Я опубликовал то, что сделал выше.

Ответ №3:

НЕ ИСПОЛЬЗУЙТЕ addslashes() ДЛЯ ЭКРАНИРОВАНИЯ ЗНАЧЕНИЙ ДЛЯ SQL-ЗАПРОСА! (извините за крик)

В случае MySQL ваш выбор mysql_real_escape_string() но у других движков есть свои собственные escape-функции. addslashes() удивительно легко «обмануть», если вы пытаетесь выполнить атаку с использованием SQL-инъекции.

Лучшее, что вы могли бы сделать, это не экранировать $_SESSION саму себя, а создать копию и использовать array_map() вместе с mysql_real_escape_string() . Таким образом, вы также можете сохранить исходную версию без экранирования.

 $escaped_SESSION=array_map('mysql_real_escape_string', $_SESSION);
  

Другие уже объясняли, почему foreach это не лучший выбор для манипулирования вашим массивом. Она работает с копией массива, на котором вы ее запускаете. array_map() применит обратный вызов ко всем элементам вашего массива и вернет результирующий массив.

Ответ №4:

 $array = array('comment' => $_SESSION['comment'], 'employee_id' => $_SESSION['employee_id']);  // other keys of session

foreach(array_keys($array) as $value){
    $array[$value] = addslashes($array[$value]);
}
  

используйте $array вместо использования $ _SESSION.

Комментарии:

1. Она по-прежнему работает с копиями исходных значений из $_SESSION .

2. Используйте foreach ($array as $key => $value) вместо создания нового массива, содержащего ключи с помощью array_keys() . Или используйте ссылку с foreach ($array as amp;$value) $value = addslashes($value); .

Ответ №5:

Вам нужно сохранить результирующее значение обратно в значение, которое вы повторяете

 $strip_fields = array($_SESSION['comments'],$_SESSION['employee_id'],$_SESSION['approved_by'],$_SESSION['delivery_email'],$_SESSION['full_name'],$_SESSION['first_name'],$_SESSION['last_name']);

    foreach($strip_fields as $key => $value) {
        $strip_fields[$key] = addslashes($value); // Store it back into the strip_fields var
    }
  

Также, как отметил @Gaurav, вы хотите очистить данные массива, а не индекс / ключ.

Комментарии:

1. Это перезапишет 0-е, 1-е, 2-е и т.д. значения из, $_SESSION поскольку $strip_fields они не содержат соответствующих ключей.

2. Я редактировал свой ответ, когда вы отвечали. Я обновил свой код после понимания его структуры массива. Я понимаю, что это не обновляет SESSION var, но я использовал то, что он написал, думая, что он может использовать это в другом месте. Решение Дэвида корректно изменяет SESSION var

3. Это не сработает. Вы не можете изменить $strip_fields из foreach .

4. @bazmegakapa Уверен, что вы можете. Хотя $value это явно копия (а не ссылка), вы не можете обновить значение и повлиять на него в оригинале. Однако, явно обновляя фактический массив по заданному индексу, это приведет к принудительному обновлению. Если бы вы хотели сделать это ссылкой, вы могли бы включить amp; , но я не хотел делать это более техническим. foreach($strip_fields as $key => amp;$value){$value = addslashes($value); }

5. Да, вы правы. Тем не менее, то, что вы написали в своем ответе, неверно, потому что это не работает. Таким образом, это не ответ на этот вопрос. Пожалуйста, отредактируйте и «сделайте это техническим» настолько, насколько это необходимо, чтобы дать рабочий ответ :).