Как передать апострофы из текстовых областей в MySQL с помощью PHP

У меня есть текстовая область, в которую пользователи также добавляют заметки. На следующей странице я использую $_POST[Comments], чтобы показать, что было напечатано. У меня есть кнопка редактирования, чтобы вернуться и посмотреть, что было напечатано, и отредактировать заметки, но когда я показываю $_POST[Comments], он показывает все до апострофа.

Пример:

Первоначально набрано: Let's try this.

При редактировании: Let

Теперь, когда я передаю его на сервер для добавления SQL, я использую следующую функцию для защиты от SQL-инъекций.

function keepSafe($value) {
        if (get_magic_quotes_gpc()) {
            $value = stripslashes($value);
        }
        if (!is_numeric($value)) {
            $value = "'" . mysqli_real_escape_string($value) . "'";
        }
        return $value;
    }

Ниже показано, что я использую для форматирования ввода для вставки SQL.

$Comments = str_replace("\n","<br />",$_POST['CustComments']);
    $Comments = keepSafe($_POST['Comments']);

Мне нужно иметь возможность видеть все апострофы в разделе примечаний при редактировании перед отправкой. И я хочу удостовериться, что когда я отправляю, это SQL-инъекция предотвратила безопасный код.


person JukEboX    schedule 04.12.2012    source источник
comment
Сначала вы используете $_POST['CustComments'], а затем $_POST['Comments'] в своем последнем примере, если это имеет значение (для вас должно быть). Кроме того (не для конкретного ответа), вы должны заменить \r\n вместо просто \n (с точки зрения Windows). Также (не для конкретного ответа) вы должны использовать подготовленные операторы вместо вставки прямой переменной (поскольку вы используете mysqli).   -  person newfurniturey    schedule 05.12.2012
comment
Похоже, вы получаете пример кода из очень старого источника. Волшебные кавычки давно удалены из PHP. Что касается того, как правильно с этим справиться, то для этого и нужны подготовленные операторы.   -  person GordonM    schedule 06.04.2016


Ответы (2)


Проблема с апострофом:

Вероятно, вы используете такой ввод:

<input type='text' value='<?php echo $value;?>'/>

Проблема в том, что если значение имеет апостроф, это происходит:

<input type='text' value='Let's play'/>

Таким образом, тег значения заканчивается из-за апострофа в вашей переменной.

Чтобы исправить это, просто используйте htmlspecialchars с ENT_QUOTES:

<?php 
 $value = htmlspecialchars("Let's play", ENT_QUOTES);
?>
<input type='text' value='<?php echo $value; ?>'/>

Таким образом, апостроф будет закодирован и его можно будет редактировать в вашей форме.

О внедрении SQL:

Просто используйте подготовленные операторы mysqli, и все будет в порядке. Чтобы также обезопасить себя от XSS, всегда htmlspecialchars вводите данные пользователем в выводе HTML. Еще лучше отфильтровать входные данные только до того, что вам нужно, и сохранить только отфильтрованные входные данные в базу данных.

person Green Black    schedule 04.12.2012
comment
Позвольте мне добавить это. Как сохранить апостроф в текстовой области в БД с помощью вставки myqsql - person JukEboX; 05.12.2012
comment
Вам нужно использовать подготовленные вкладыши. Или вы можете использовать mysqli_real_escape_string( "let's play" ); (я рекомендую подготовленное заявление. Вы можете найти все об этом в ссылке, которую я предоставил в моем awnser) - person Green Black; 05.12.2012
comment
Если вы можете дать мне еще немного намека на это, поскольку я еще не полностью знаком с новым mysqli. - person JukEboX; 05.12.2012

Используйте функцию htmlspecialchars() при создании тега textarea:

<textarea><?=htmlspecialchars($_POST['Comments'])?></textarea>
person Geo    schedule 04.12.2012
comment
Апостроф не имеет значения в текстовых полях. И только htmlspecialchars не кодирует апостроф. Вам нужно ENT_QUOTES. Кстати: <?= это плохая практика, так как она будет работать только с включенными короткими тегами <?php echo лучше. - person Green Black; 05.12.2012
comment
Джон, хорошие моменты. Просто мои привычки, наверное. Никогда не было проблем. - person Geo; 05.12.2012