Как правильно заэкранировать апостроф

VANHALEN

Новичок
Здравствуйте!
Есть форма.
Поле header - текстовая строка, поле content - текстовое поле с редактором tinymce/
Перед вставкой в базу делаю так
PHP:
		$header = mysql_real_escape_string($_POST['header']);
		$content = mysql_real_escape_string($_POST['content']);
		$query = "UPDATE `static_content` SET `header`='$header', `content` = '$content' WHERE `id` =".$_POST['id']." LIMIT 1";
		$res = mysql_query($query) or die(mysql_error()); 
		view ();
Типу убираю всякую дрянь. НО! Сразу после сохранения идёт моя функция view (); ну типо показать после сохранения. Так вот. В текстовом редакторе всё нормально, а в заголовке, всё, что после апострова - отсутствует напроч. Причём в базе всё есть. С обычными двойными кавычками всё нормально. Соответственно если обновить ещё раз, не меняя заголовка, всё, что после апострофа удалиться и из базы. Как быть? А вдруг статья о рок'н роле?

Пробовал через
PHP:
$header = str_ireplace("'", "\'", $_POST['header']);
та же ситуация. В базе есть, в поле нет.

Пробовал использовать mysql_real_escape_string до вывода. Ситуёвна ещё хуже. В базе есть, а вполе на месте аопстрова обратный слешь, а после него опять ничего нет.
 

Gremboloid

инженера Гр...
htmlspecialchars перед выводом в поле формы

$_POST['id'] тоже надо экранировать перед тем как вставлять его значение в запрос
 

VANHALEN

Новичок
$_POST['id'] тоже надо экранировать перед тем как вставлять его значение в запрос
Зачем это ещё? У меня id приходит вообще из поля hidden, а приходит туда из базы и служит только идентификатором, чтобы запросу понятно было, какую запись обновлять.

Спасибо за htmlspecialchars. К этому полю вполне применим, так как заголовок - простой текст, без всяких html'ов. Только зачем его 2 раза то переделывать? Я поставил перез вставкой в базу.. Если туда запишется нормально, то и в поле редактирования выдаст нормално.

Окончательный вариант
PHP:
$header = mysql_real_escape_string($_POST['header']);
$header = htmlspecialchars($header, ENT_QUOTES);
$content = mysql_real_escape_string($_POST['content']);
$query = "UPDATE `static_content` SET `header`='$header', `content` = '$content' WHERE `id` =".$_POST['id']." LIMIT 1";
$res = mysql_query($query) or die(mysql_error()); 
view ();
 

Absinthe

жожо
Ответь, с какой целью это нужно пользователю?
Я полагаю, что такой говнокод в какой-то книжке предлагали, т.к. сомнительно, что много людей своим "умом" до такого дошли - много раз видел.

Потому что это SQL-inj, чтобы при приеме на работу они, при просмоьтре кода, звонко хихикая, не покачивали пальчиком и не показывали тебе на дверку.

Только зачем его 2 раза то переделывать?
Что такое "переделывать"?

Если туда запишется нормально, то и в поле редактирования выдаст нормално.
Советую учить HTML, причем самые основы(начиная с синтаксиса).
 

Фанат

oncle terrible
Команда форума
Спасибо за htmlspecialchars. К этому полю вполне применим, так как заголовок - простой текст, без всяких html'ов.
для непростого текста тоже подойдёт, где надо.

только вызывать эту функцию надо не перед вставкой в базу, а перед выводом.

Зачем это ещё? У меня id приходит вообще из поля hidden, а приходит туда из базы и служит только идентификатором,
mysql_real_escape_string к этой переменной применять бессмысленно, но и оставлять как есть - тоже нельзя.
слышал когда-нибудь об SQL инъекциях?
 

Фанат

oncle terrible
Команда форума
написано.
в том-то и дело, что написано. в запросе.
 

VANHALEN

Новичок
or die(mysql_error());
Ответь, с какой целью это нужно пользователю?
Я полагаю, что такой говнокод в какой-то книжке предлагали, т.к. сомнительно, что много людей своим "умом" до такого дошли - много раз видел.
Ну это как раз с того времени, когда я только начинал. Запросы уже свои научился давно составлять, а вот конструкция осталась. Хотя впринципе оно там действительно нахер не нжно.

А вообще у меня ребята куда более серьёзные проблеммы начались..
<img src="\" alt="\&quot;\&quot;" width="\&quot;764\&quot;" height="\&quot;1000\&quot;" />
Это как вообще понимать? Перебдели? И что мне теперь делать? Картинки запретить пользователю вставлять?
Это как раз ответ от mysql_real_escape_string. И самое ужасное, что на разных серверах по разному.. Дома всё отлично, в реале впиндюривает туда слеши и вместо кавычек сами видели что.

Так-же херятся стили и прочее.. Вывод - на конкретном серваке метод в данном абсолютно неприменим.

Здесь уже была одна похожая тема Видимое не один я такой. У кого-то ещё слеши записываются в базу данных после mysql_real_escape_string().

Цитата из FAQ
Следует специально отметить: добавленные слеши НЕ идут в базу. Они нужны только в запросе. При попадании в базу слеши отбрасываются. Соответственно, распространенной ошибкой является применение stripslashes при получении данных из базы.
Ну а как они там оказались то?
 

VANHALEN

Новичок
Ну а как они там оказались то?
Сам себе отвечаю. На реальном серваке magic_quotes_gpc - On. На локальном выключено. Прав ли я и что теперь делать?
mysql_real_escape_string я не просто так стал использовать. Запрос спотыкался при некоторых условиях... Например когда делаешь текст жирным, а потом ещё цвет ему меняешь.
 

Absinthe

жожо
Прав ли я и что теперь делать?
Отключить magic_quotes_gpc.
Если у тебя апач, то https://www.google.com/search?client=opera&rls=ru&q=magic_quotes_gpc+.htaccess

Запрос спотыкался при некоторых условиях...
Значит неправильный запрос (неправильность может заключаться и в неправильном экранировании).
 

VANHALEN

Новичок
Отключить magic_quotes_gpc
Да, я кстати уже до этого посмотрел что можно.. Не знаю, стоит ли запариваться. Я ещё не видел на хостинге заказчика настройки, может у него там уже отключено. А вообще вроде где-то видел универсальный вариант отключать с помощью скрипта и хранить в сессии.
Сразу впрос в догонку, htacsess в корень сайта, или в корень админки?
 

VANHALEN

Новичок
Вери сенькью. На хостинге заказчика magic_quotes_gpc отключил в настройках.. Работает, как часы, толко заводить не надо :)
 
Сверху