|
|
|
| Приветствую вас коллеги. В общем проблема такая, если скрипты у меня работаю в кодировке ANSI, то в базе данных информация на русском сохраняется и выводится нормально. Но если скрипт сохранен и работает в кодировке UTF-8, то все русское сохраняется и выводится в виде крякозябров, что делать что бы в UTF-8 все работало также как и в ANSI. Сразу скажу что пробовал меня в базе кодировку хранения данных с cp1251_general_ci на utf8_general_ci , но это не помогло. Подскажите пожалуйста решение проблемы.
С уважением к вам и вашему труду HK416!!! | |
|
|
|
|
|
|
|
для: hk416
(18.08.2012 в 18:06)
| | Наверное вы не устанавливаете кодировку соединения:
mysql_query("SET NAMES 'UTF8'"); | |
|
|
|
|
|
|
|
для: confirm
(18.08.2012 в 22:35)
| | Как всегда больше спасибо и респект, помогло, но вот только теперь стоит другая проблема с этими кодировками. В общем практически все переменные которые приходят с сервера в базу, проходят обработку такой ф-ей $a=mysql_real_escape_string(htmlentities($a)); Если её убрать, то с вашим советом все работает, а вот если она стоит, то снова крякозябры. И что делать то есть теперь никакой защиты кроме регулярных выражений ?
С уважением к вам и вашему труду HK416!!! | |
|
|
|
|
|
|
|
для: hk416
(19.08.2012 в 07:30)
| | А htmlentities() у вас значит для защиты вставлено? | |
|
|
|
|
|
|
|
для: confirm
(19.08.2012 в 10:16)
| | htmlentities() как замена htmlspecialchars() от SQL - инъекций. mysql_real_escape_string() от XSS атак. Не известно что теперь делать. | |
|
|
|
|
|
|
|
для: hk416
(19.08.2012 в 11:34)
| | А где вы прочли, что htmlentities() и htmlspecialchars(), это функции выполняющие роль защиты от SQL - инъекций и при этом первая надежнее второй? | |
|
|
|
|
|
|
|
для: confirm
(19.08.2012 в 11:37)
| | В книжке по PHP5. Там сказано что 1 больше специальных символов экранирует чем вторая, и самую простую инъекцию,"!'or 1=1 or'!" , они блокируют. Я не говорю что закончил работу в этом направлении, просто мне не понятно, что вообще теперь делать, если такая фигня с кодировкой. Что вы скажите по этому поводу? | |
|
|
|
|
|
|
|
для: hk416
(19.08.2012 в 12:14)
| | Эту книжку в помойку, если в ней написано, что данные функции служат для защиты. Эти функции просто выполняют определенные операции, результаты которых вам могут быть необходимы в тех или иных ситуациях. Если же там такого не написано, а это вы так трактуете назначение данных функций, то это плохо, так как в данном случае вы только будет вредить себе применяя их, что у вас и происходит.
Если вы трактуете эти функции как защита от sql-инъекций, то что тогда у вас делает функция mysql_real_escape_string() в коде?
Допустим у вас дома есть небольшая кладовая, в которой лежат и безопасные старые детские игрушки, и потенциально опасные лопата, топор... При этом самой кладовой все равно, что в нее поместили, вреда от любых из этих предметов ей не будет.
Когда же вы помещаете эти предметы в кладовую, чтобы не повредить руки, вы же не станете каждый предмет заколачивать в ящики, вам достаточно будет одеть перчатки. Можно конечно поместить каждый предмет в ящик, но это будет крайне неудобно впоследствии - чтобы найти нужный предмет в кладовой, придется проделать много работы.
Выезжаете на дачу со своей лопатой, и для того, чтобы обезопасить пассажиров автобуса, вам достаточно поместить в чехол ее клинок, деревянная ручка при этом не может порезать кого либо.
Вот так и с базой - она может хранить все что угодно, ей глубоко все равно, чего вы в нее поместите. Если вы все символы преобразуете в html-мнемоники, то это уже ваши проблемы, вы сами их себе определили, а не требования sql. Перчатки в sql - это mysql_real_escape_string(), а ящик htmlentities() - это уже морока по вашей собственной инициативе. А то, что выводится из базы на страницу, может быть не обязательно опасным, а просто вносить путаницу в html-код, вот для этого и нужно "зачехлить" такие элементы, только их, а не все.
Чехол в html - это htmlspecialchars(), и к понятию "безопасность" относится косвенно, в зависимости от контекста применения. | |
|
|
|
|
|
|
|
для: confirm
(19.08.2012 в 12:43)
| | Не на самом деле я знаю что делают обе эти функции, и знаю как конкретно они защищают, а именно они экранируют определенное количество символов, что бы не дать произойти данным атакам. Но во первых походу дела из-за кодировок, фиг знает будут ли теперь они работать, во вторых не от всех атак эти функции помогут, я об этом осведомлен, и продолжаю над этим работать. С английским языком это экранирование работало, с русским выдает крякозябр. Проверил к стати htmlspecialchars(), все заработало. Правда в просто ПХП сайте все выводит как и заходило, а вот JS через Аякс, берет и выводит прямо как есть в базе то есть не <script type="text/javascript"> alert(rrr); </script> а сразу <script type="text/javascript"> alert(rrr); </script>, интересно с чем это связано?
К стати вот описание http://php.net/manual/ru/function.htmlentities.php, не так кардинально, она отличается от своей старшей сестры, но видать у неё немного другой характер поведения, в котором я видать ещё не разобрался.
К стати даже на сайте, на чьем форуме мы сидим вот тут http://www.softtime.ru/dic/id_group=1&id_dic=28, есть слова Если вам нужно преобразовать все возможные сущности, используйте htmlentities().
В общем теперь надо разбираться, в различие вывода, просто ПХП форума, и Аяксовой версии форума.
С уважением к вам и вашему труду HK416!!! | |
|
|
|
|
|
|
|
для: hk416
(19.08.2012 в 14:43)
| | Как-то в разделе JavaScript я написал вам код, на который вы ответили, что написали свой, короче и просто замечательный. Я не стал отвечать на глупость сказанную вами, так как проще написать нельзя, просто в силу того, что язык не позволяет этого сделать.
Ситуация повторяется - я вам говорю, что вы не понимаете назначений функций вообще, если пишите такую гадость mysql_real_escape_string(htmlentities($a)), и потом задаете вопрос почему крякозябры. Вы пишите "Не на самом деле я знаю что делают обе эти функции, и знаю как конкретно они защищают", и при этом удивляетесь "С английским языком это экранирование работало, с русским выдает крякозябр". И где же ваше понимание и знание этих функций?
А это - "Проверил к стати htmlspecialchars(), все заработало. Правда в просто ПХП сайте все выводит как и заходило, а вот JS через Аякс, берет и выводит прямо как есть в базе то есть не <script type="text/javascript"> alert(rrr); </script> а сразу <script type="text/javascript"> alert(rrr); </script>, интересно с чем это связано?"???
А с тем и связано, что вот так себя ведет htmlspecialchars(), вот хочется ей заменять символ < на < и другие, вот хоть убей ее. Вот для того она и служит, чтобы применять ее там, где не должно быть подобных символов, кроме вами прописанных.
htmlentities() вообще все, что имеет html мнемоники, заменит на них. Вот потому и с английским ОК, а с русским задница.
Последний раз говорю - htmlspecialchars(), htmlentities(), это не защита, это просто инструменты, которые можно применить и в качестве защиты, но чтобы такое делать, нужно хорошо понимать, и знать, что ни делают. Вот понимания и знания у вас как раз и нет, хотя вы заявляете обратное. А если я не прав, и вы знаете, значит разбирайтесь со своими ошибками сами, я же вам сказ все, больше нечего. | |
|
|
|
|
|
|
|
для: confirm
(19.08.2012 в 15:22)
| | Как-то в разделе JavaScript я написал вам код, на который вы ответили, что написали свой, короче и просто замечательный. Я не стал отвечать на глупость сказанную вами, так как проще написать нельзя, просто в силу того, что язык не позволяет этого сделать.
По поводу того раза, при всём уважении, поверьте на слово, я написал ещё проще, вы тогда иcпользовали оператор Event, а мне и этого не пришлось делать. Функция обработчик с помощью оператора this определяла по какому посту было сделано нажатие, а потом также как и у ваc с помощью getAttribute, по моему гораздо проще и понятнее. Не нужен никакой объект Event.
function deletepost()
{
if(this.getAttribute('id')!="del") return;
var delete_post=this.parentNode.getAttribute('id');
var max = document.getElementById(this.parentNode.getAttribute('id'));
if(max!=null)
max.parentNode.removeChild(max);
}
|
А вот так происходит подписка объектов на эту функцию
var max = document.getElementsByTagName('P');
for(var i=0; i<max.length; i++)
max.onclick = deletepost;
|
[i]Я не стал отвечать на глупость сказанную вами, так как проще написать нельзя, просто в силу того, что язык не позволяет этого сделать.
Оказывается можно сделать проще, и язык позволяет. Хоть мне по справедливости и не понравилось это высказывание, вы все равно мне помогли не раз.
Последний раз говорю - htmlspecialchars(), htmlentities(), это не защита, это просто инструменты, которые можно применить и в качестве защиты, но чтобы такое делать, нужно хорошо понимать, и знать, что ни делают. Вот понимания и знания у вас как раз и нет, хотя вы заявляете обратное. А если я не прав, и вы знаете, значит разбирайтесь со своими ошибками сами, я же вам сказ все, больше нечего.
Я не по не маю к чему вот это казуистика? Если я не знаю что такое защита, так расскажите что это такое. Признаюсь только начал этим заниматься. Но и вы если начали давать понять, что вы гений, а я Быдла, так расскажите мне несведущему, что же тогда это такое. У меня знаний значит нет. а как я пойму, есть ли у вас знания если вы ими не поделитесь? Я например знаю как с помощью XSS атаки и механизма Сессий, завладеть чужим паролем, и логином, и вот только сейчас начну учиться ставить от этого заслонку.
Лично от себя добавлю, что при всём уважении к вашим знаниям, я благодарен за те решения которые я у вас спрашивал, но я не люблю когда дело ведется в таком тоне. И ф-ю удаления на JS я написал проще чем у вас.
С уважением к вам и вашему труду HK416!!! | |
|
|
|
|
|
|
|
для: hk416
(19.08.2012 в 17:15)
| | По поводу этого скрипта, я вам уже говорил, что это глупость полнейшая. Я не буду вам тут объяснять почему, сами, в будущем, еще разберетесь. Вы просто поверхностно знаете JavaScript, и слишком уверены в своей правоте - этот подход не проще, это подход глупый, еще раз повторяю.
Защита веб-приложения понятие обширное, и двумя словами как о насморке этого не расскажешь.
Но могу и по-порядку о вашем случае:
1. Пусть вы сделали корректно, то есть преобразовали в html-внемоники валидный для utf код, и поместили в базу, но вы можете задаться вопросом, что в данном случае база будет содержать? Насколько удобно будет производить поиск в этом тексте, а тем более редактировать такой текст?
2. Функция htmlspecialchars() необходима при выводе данных из базы, для того, чтобы возможные html-включения и программный код в этом тексте отображался как текст. При этом, если держать в базе свои данные как html код, то данная функция превратит его в нерабочий.
3. Функция htmlspecialchars() не является функцией защиты, как и не служат для защиты html-теги code и xmp, которые просто указывают браузеру, что заключенный в них программный код нужно отображать как обычный текст.
4. Не понимание последствий применения функций, вами применяемых, неизбежно порождает проблемы, что у вас и происходит.
Я не буду вас переубеждать - считаете что вы правы, ну это ваше право. Но лучше все-таки вникнуть в работу функций и понять почему у вас проблемы. | |
|
|
|
|
|
|
|
для: confirm
(19.08.2012 в 17:45)
| | Благодарю вас именно за такой ответ, так как конкретно с вами не хочу идти на конфликт, так как по факту по многим вопросам именно вы мне помогли, так что медленно но верно буду разбираться. Подведу итог этой темы тем что, скажу спасибо за решение с вопросом о установление кодировки соединения, и хорошо все то что хорошо кончается. В общем до следующего раза.
С уважением к вам и вашему труду HK416!!! | |
|
|
|
|
 193 байт |
|
|
для: hk416
(19.08.2012 в 20:41)
| | Так я вам вроде бы как ответил и на второй вопрос - почему у вас до сих пор кракозябры. Причина в htmlentities().
Беда в том, да и не только ваша беда в этом, вы ведь не первый кому о подобном говорят, и не только я, что вы по каким-то причинам втемяшели себе, что данные функции, это функции вопросов безопасности. Как следствие этого и втыкаете их где непопадя, даже туда, где им места быть не должно.
Значит с вашей стороны есть непонимание их задач, и где они полезны или необходимы. Если вам такое сказали, значит полезно углубиться в них, понять их истинное назначение.
Вот это будет полезно, а утверждать при таких ляпах, что я дока и все понимаю, и при этом вновь спрашивать о причинах....
Достаточно написать вот такой код:
<?
echo htmlentities('слово');
| увидеть на экране вот такое:, а просмотрев код страницы, вот такое:
�лово
| чтобы понять в чем проблема, и получить ответ на два вопроса:
а) для защиты ли служит эта функция?
б) а нужно ли хранить в базе в таком виде?
И об этом я вам столько перемолотил слов, а вы вместо.... | |
|
|
|
|