|
|
|
|
function db_record_escape($s){
$s = (get_magic_quotes_gpc())? stripslashes($s):$s;
$s = mysql_escape_string($s);
return $s;
}
|
она правильна?.. или же должно быть так?
function db_record_escape($s)
{
if(!get_magic_quotes_gpc()){
$s = stripslashes($s);
$s = mysql_escape_string($s);
}
return $s;
}
|
ибо я потестил и не заметил разницы.
--
хотя нет разница есть, вторая криво пашет, удалят слеши.
Как же всё таки правильно?) | |
|
|
|
|
|
|
|
для: sl1p
(24.10.2008 в 01:31)
| | На самом деле я бы настойчиво рекомендовал удалять слеши в самом начале скрипта или в месте где инициализируются переменные, т.к. не исключено что входящие данные будут использоваться для вывода на экран. Т.е.:
<?php
function strip_slashes($var)
{
if (get_magic_quotes_gpc()) {
$var = stripslashes($var);
}
return $var;
}
$message = strip_slashes($_GET['message']);
echo "Текст сообщения: " . htmlspecialchars($message);
mysql_query("INSERT INTO tbl SET message = '" . mysql_real_escape_string($message) . "'");
|
Придерживаясь этих простых правил, а именно:
1) Удалять слеши (stripslashes()) из ВСЕХ входящих данных ДО их дальнейшей обработки;
2) Пропускать ВСЕ данные которые ВЫВОДЯТСЯ НА ЭКРАН через ф-ю htmlspecialchars();
3) Во ВСЕ данные которые вставляются в тело SQL-запроса добавлять слеши.
и ваши коды будут надежно защищены от взломщиков! | |
|
|
|
|
|
|
|
для: Евгений Петров
(24.10.2008 в 15:23)
| | ну в общем-то первая функция тоже самое делает.. :) | |
|
|
|
|
|
|
|
для: Евгений Петров
(24.10.2008 в 15:23)
| | Уважаю! | |
|
|
|
|
|
|
|
для: sl1p
(24.10.2008 в 01:31)
| | Обьясню зачем на Вашем примере.
Допустим на сервере т.е. все входящие данные проедворяются слешами. Тогда следующий код:
<?php
// Ваша функция
function db_record_escape($s){
$s = (get_magic_quotes_gpc())? stripslashes($s):$s;
$s = mysql_escape_string($s);
return $s;
}
$message = $_GET['message'];
echo "Текст сообщения: " . htmlspecialchars($message);
mysql_query("INSERT INTO table SET message = '" . db_record_escape($message));
|
корректно занесет данные в базу но выведет данные с предваряющими слешами если таковые есть. Т.е. результатом работы будет что то типа:
Текст сообщения: Сообщение с \'кавычками\'
|
Поэтому в вашем случае кроме функции htmlspecialchars нужно применять для выводимых данных ещё и ф-ю stripslashes, при этом всегда проверяя значение get_magic_quotes_gps, что очень неудобно. | |
|
|
|
|
|
|
|
для: Евгений Петров
(24.10.2008 в 15:30)
| | ну я вот только что и так и так попробовал, тоесть с включёнными кавычками на сервере и нет.
занёс в базу строку:
i'm+i\'m
никаких слешей ничего нет..
в базу точно так и записало. | |
|
|
|
|
|
|
|
для: sl1p
(24.10.2008 в 15:39)
| | В базу да, но если вы выведе это же значение сразу на экран, оно будет с кавычками. | |
|
|
|
|
|
|
|
для: Евгений Петров
(24.10.2008 в 15:44)
| | нет.. вывел, аналогичное.
htmlspecialchars($s); | |
|
|
|
|
|
|
|
для: sl1p
(24.10.2008 в 15:50)
| |
<?php
function db_record_escape($s) {
$s = (get_magic_quotes_gpc()) ? stripslashes($s) : $s;
$s = mysql_escape_string($s);
return $s;
}
$message = $_GET['message'];
$sql = "INSERT INTO tbl SET message = '" . db_record_escape($message) . "'";
echo "magic_quotes: " . (get_magic_quotes_gpc() ? "On" : "Off") . "<br />\n";
echo "Сообщение: " . htmlspecialchars($message) . "<br />\n";
echo "SQL-запрос: " . htmlspecialchars($sql) . "<br />\n";
|
Что у Вас выводит этот код? | |
|
|
|
|
|
|
|
для: sl1p
(24.10.2008 в 15:50)
| | Извиняюсь, вызывать так
?message='Текст с кавычками'
|
| |
|
|
|
|
 4.2 Кб |
|
|
для: Евгений Петров
(24.10.2008 в 15:59)
| | magic_quotes: Off
Сообщение: 'Текст с кавычками'
SQL-запрос: INSERT INTO tbl SET message = '\'Текст с кавычками\''
хм странно, честно пишу в базу и при выводе получаю:
обработка при записи:
$_POST[$i]=db_record_escape(trim($v));
--
обработка при выводе:
function html_escape($s){
$s=htmlspecialchars($s);
$s=str_replace("^","^",$s);
return $s;
}
$out_nick = html_escape($row['nick']);
--
аттач >>>
может база чтото мудрит.. | |
|
|
|
|
|
|
|
для: sl1p
(24.10.2008 в 16:13)
| | Все правильно, в запросе кавычки должны быть экранированы - MySQL при добавлении будет уберет их.
А теперь включите magic_quotes и посмотрите что поменялось. | |
|
|
|
|
|
|
|
для: Евгений Петров
(24.10.2008 в 16:21)
| | в том то и дело что ничего.
magic_quotes: On
Сообщение: 'Текст с кавычками'
SQL-запрос: INSERT INTO tbl SET message = '\'Текст с кавычками\''
но то что в аттаче без изменений. | |
|
|
|
|
|
|
|
для: sl1p
(24.10.2008 в 16:25)
| | Хм, как ничего? Как минимум первая строка должна стать:
magic_quotes: On
Как максимум должно быть:
magic_quotes: On
Сообщение: \'Текст с кавычками\'
SQL-запрос: INSERT INTO tbl SET message = '\'Текст с кавычками\''
|
| |
|
|
|
|
|
|
|
для: sl1p
(24.10.2008 в 16:25)
| | Вы скрипт точно без изменений мой запускали? | |
|
|
|
|
|
|
|
для: Евгений Петров
(24.10.2008 в 16:30)
| | точно)
хотя вот да, почемуто если прямиком обработать текст из базы тоесть не писать его в переменную,а типа такого:
echo htmlspecialchars(sql lala..);
если же засунуть в переменную и обработать её, тогда слеши есть. | |
|
|
|
|
|
|
|
для: sl1p
(24.10.2008 в 16:30)
| | А если так?
<?php
echo "<pre>" . print_r($_GET, true) . "</pre>\n";
function db_record_escape($s) {
$s = (get_magic_quotes_gpc()) ? stripslashes($s) : $s;
$s = mysql_escape_string($s);
return $s;
}
$message = $_GET['message'];
$sql = "INSERT INTO tbl SET message = '" . db_record_escape($message) . "'";
echo "magic_quotes: " . (get_magic_quotes_gpc() ? "On" : "Off") . "<br />\n";
echo "Сообщение: " . htmlspecialchars($message) . "<br />\n";
echo "SQL-запрос: " . htmlspecialchars($sql) . "<br />\n";
|
| |
|
|
|
|
|
|
|
для: Евгений Петров
(24.10.2008 в 16:33)
| | Array
(
[message] => \'Текст с кавычками\'
)
magic_quotes: On
Сообщение: \'Текст с кавычками\'
SQL-запрос: INSERT INTO tbl SET message = '\'Текст с кавычками\'' | |
|
|
|
|
|
|
|
для: sl1p
(24.10.2008 в 16:36)
| | Во! Другое дело. Видите, мы поменяли всего одну настройку PHP а результаты выполнения разные. Это неправильно когда пользователь вводит какие то данные а они выводятся ему со слешами.
Поэтому лучше если есть такая возможность отключать magic_quotes, а если нету то пропускать входящие данные через stripslashes вручную и дальше работать с данными как если бы magic_quotes были выключены. | |
|
|
|
|
|
|
|
для: Евгений Петров
(24.10.2008 в 16:44)
| | я просто не могу понять смысл:
$s = (get_magic_quotes_gpc())? stripslashes($s):$s;
зачем тогда это нужно когда при включённых, нет слешей?... и зачем это использовать при записи в бд вообще:)
и когда они включены нужно добавить в html_escape()
$s = (get_magic_quotes_gpc())? stripslashes($s):$s;?
насколько я понял:)
но получается,если например я был на одном хостинге где кав. были включены, и там записывалось в бд. и вдруг перешёл туда где они отключены. Откуда мне тогда знать что слешы в записи это сама запись а не предотвращение?) | |
|
|
|
|
|
|
|
для: sl1p
(24.10.2008 в 16:48)
| | Включенные кавычки это избытки прошлого, это сделали для безопасности а в итоге это стало жутко мешать.
В PHP5 помоему по умолчанию magic_quotes выключены. Поэтому я рекомендую работать с кодом так как будто magic_quotes выключены а вначале файла если они включены - убирать их. Это не путает при работе с данными.
> и когда они включены нужно добавить в html_escape()
не путайте, html_escape используется абсолютно для других целей. Данные в базе должны храниться как есть - т.е. БЕЗ кавычек и в виде обычного текста (т.е. например 5 > 3 а НЕ 5 > 3). Т.е. НЕ нужно перед занесением в базу данных пропускать их через htmlspecialchars. Это нужно только при выводе в браузер, чтобы он не воспринял текст как html-код.
Пример:
Допустим у нас есть строка:
символ '>' означает 'больше'
Эта строка приходит в скрипт через _POST.
Если magic_quotes = On то нам нужно сразу вырезать оттуда слеши, если Off - ничего не делаем и работаем дальше.
На данном этапе у нас есть строка БЕЗ кавычек, и нам в теперь дальнейшем все равно какое значение параметра magic_quotes.
Теперь нам нужно занести значение в базу. Мы ВСЕГДА пропускаем данные через mysql_escape_string.
В итоге в БД строка будет храниться в первоначальном виде, т.е.
символ '>' означает 'больше'
Теперь извлекаем из базы эту строку и выводим её. Но для того чтобы символ > не воспринялся как открывающая скобка тега пропускаем данные через htmlspecialchars и на выходе получим
символ '>' означает 'больше'
а браузер покажет
символ '>' означает 'больше' | |
|
|
|
|
|
|
|
для: Евгений Петров
(24.10.2008 в 17:11)
| | ну это вроде понятно,но в функции ж db_record_escape есть код который удаляет слешы в случае включённых кавычек.. почему тогда выводит со слешами?... | |
|
|
|
|
|
|
|
для: sl1p
(24.10.2008 в 23:20)
| | Потому что вы не переприсваиваете значение переменной, вы подставляете результат работы этой ф-ии в запрос. | |
|
|
|
|
|
|
|
для: Евгений Петров
(25.10.2008 в 00:10)
| | я очень извиняюсь, но не совсем понял...
тоесть если я буду не сразу в sql применять функцию а сначала переменную "обделаю", тогда стрип будет работать или как?) | |
|
|
|
|
|
|
|
для: sl1p
(25.10.2008 в 00:12)
| | Стоп, брр.. )
<?php
function db_record_escape($s) {
$s = (get_magic_quotes_gpc()) ? stripslashes($s) : $s;
$s = mysql_escape_string($s);
return $s;
}
|
здесь возвращается со слешами потому что строка пропускается через mysql_escape_string. Или вы не это имели в виду? | |
|
|
|
|
|
|
|
для: Евгений Петров
(25.10.2008 в 01:08)
| | хм это, так может юзать mysql_escape_string, только если включены?.. | |
|
|
|
|
|
|
|
для: Евгений Петров
(24.10.2008 в 16:44)
| | Чтобы ничего не переписывать создайте файлик с примерно следующим содержимым:
<?php
function stripdata(&$var)
{
if(is_array($var))
{
foreach ($var as $key => $value) {
stripdata($var[$key]);
}
} else {
$var = stripslashes($var);
}
}
if (get_magic_quotes_gpc())
{
stripdata($_GET);
stripdata($_POST);
stripdata($_COOKIE);
stripdata($HTTP_GET_VARS);
stripdata($HTTP_POST_VARS);
stripdata($HTTP_COOKIE_VARS);
}
|
И вызывайте его во всех файлах в самом начале работы (либо в каком нибудь общем файле, например config.php).
Будет примерно то же самое как если бы magic_quotes были выключены.
Все что вам остается это только изменить вашу ф-ю на
function db_record_escape($s) {
return mysql_escape_string($s);
}
|
| |
|
|
|
|
|
|
|
для: sl1p
(24.10.2008 в 16:30)
| | >хотя вот да, почемуто если прямиком обработать текст из базы тоесть не писать его в переменную,а типа такого:
>echo htmlspecialchars(sql lala..);
>
>если же засунуть в переменную и обработать её, тогда слеши есть.
Не осилил ) Пример можно? | |
|
|
|
|
|
|
|
для: Евгений Петров
(24.10.2008 в 16:34)
| | - | |
|
|
|