Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Предохранение при записи в базу данных
 
 автор: sl1p   (24.10.2008 в 01:31)   письмо автору
 
 

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;
}


ибо я потестил и не заметил разницы.
--
хотя нет разница есть, вторая криво пашет, удалят слеши.
Как же всё таки правильно?)

  Ответить  
 
 автор: Евгений Петров   (24.10.2008 в 15:23)   письмо автору
 
   для: 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-запроса добавлять слеши.
и ваши коды будут надежно защищены от взломщиков!

  Ответить  
 
 автор: sl1p   (24.10.2008 в 15:29)   письмо автору
 
   для: Евгений Петров   (24.10.2008 в 15:23)
 

ну в общем-то первая функция тоже самое делает.. :)

  Ответить  
 
 автор: BinLaden   (24.10.2008 в 23:38)   письмо автору
 
   для: Евгений Петров   (24.10.2008 в 15:23)
 

Уважаю!

  Ответить  
 
 автор: Евгений Петров   (24.10.2008 в 15:30)   письмо автору
 
   для: sl1p   (24.10.2008 в 01:31)
 

Обьясню зачем на Вашем примере.
Допустим на сервере
magic_quotes On
т.е. все входящие данные проедворяются слешами. Тогда следующий код:

<?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, что очень неудобно.

  Ответить  
 
 автор: sl1p   (24.10.2008 в 15:39)   письмо автору
 
   для: Евгений Петров   (24.10.2008 в 15:30)
 

ну я вот только что и так и так попробовал, тоесть с включёнными кавычками на сервере и нет.

занёс в базу строку:
i'm+i\'m

никаких слешей ничего нет..

в базу точно так и записало.

  Ответить  
 
 автор: Евгений Петров   (24.10.2008 в 15:44)   письмо автору
 
   для: sl1p   (24.10.2008 в 15:39)
 

В базу да, но если вы выведе это же значение сразу на экран, оно будет с кавычками.

  Ответить  
 
 автор: sl1p   (24.10.2008 в 15:50)   письмо автору
 
   для: Евгений Петров   (24.10.2008 в 15:44)
 

нет.. вывел, аналогичное.
htmlspecialchars($s);

  Ответить  
 
 автор: Евгений Петров   (24.10.2008 в 15:58)   письмо автору
 
   для: 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";


Что у Вас выводит этот код?

  Ответить  
 
 автор: Евгений Петров   (24.10.2008 в 15:59)   письмо автору
 
   для: sl1p   (24.10.2008 в 15:50)
 

Извиняюсь, вызывать так

?message='Текст с кавычками'

  Ответить  
 
 автор: sl1p   (24.10.2008 в 16:13)   письмо автору
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("^","&#94;",$s);
return $s;
}
$out_nick = html_escape($row['nick']);
--

аттач >>>

может база чтото мудрит..

  Ответить  
 
 автор: Евгений Петров   (24.10.2008 в 16:21)   письмо автору
 
   для: sl1p   (24.10.2008 в 16:13)
 

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

  Ответить  
 
 автор: sl1p   (24.10.2008 в 16:25)   письмо автору
 
   для: Евгений Петров   (24.10.2008 в 16:21)
 

в том то и дело что ничего.

magic_quotes: On
Сообщение: 'Текст с кавычками'
SQL-запрос: INSERT INTO tbl SET message = '\'Текст с кавычками\''

но то что в аттаче без изменений.

  Ответить  
 
 автор: Евгений Петров   (24.10.2008 в 16:27)   письмо автору
 
   для: sl1p   (24.10.2008 в 16:25)
 

Хм, как ничего? Как минимум первая строка должна стать:
magic_quotes: On
Как максимум должно быть:
magic_quotes: On
Сообщение: \'Текст с кавычками\'
SQL-запрос: INSERT INTO tbl SET message = '\'Текст с кавычками\''

  Ответить  
 
 автор: Евгений Петров   (24.10.2008 в 16:30)   письмо автору
 
   для: sl1p   (24.10.2008 в 16:25)
 

Вы скрипт точно без изменений мой запускали?

  Ответить  
 
 автор: sl1p   (24.10.2008 в 16:30)   письмо автору
 
   для: Евгений Петров   (24.10.2008 в 16:30)
 

точно)

хотя вот да, почемуто если прямиком обработать текст из базы тоесть не писать его в переменную,а типа такого:
echo htmlspecialchars(sql lala..);

если же засунуть в переменную и обработать её, тогда слеши есть.

  Ответить  
 
 автор: Евгений Петров   (24.10.2008 в 16:33)   письмо автору
 
   для: sl1p   (24.10.2008 в 16:30)
 

А если так?
<?php 

echo "<pre>" print_r($_GETtrue) . "</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";

  Ответить  
 
 автор: sl1p   (24.10.2008 в 16:36)   письмо автору
 
   для: Евгений Петров   (24.10.2008 в 16:33)
 

Array
(
[message] => \'Текст с кавычками\'
)

magic_quotes: On
Сообщение: \'Текст с кавычками\'
SQL-запрос: INSERT INTO tbl SET message = '\'Текст с кавычками\''

  Ответить  
 
 автор: Евгений Петров   (24.10.2008 в 16:44)   письмо автору
 
   для: sl1p   (24.10.2008 в 16:36)
 

Во! Другое дело. Видите, мы поменяли всего одну настройку PHP а результаты выполнения разные. Это неправильно когда пользователь вводит какие то данные а они выводятся ему со слешами.
Поэтому лучше если есть такая возможность отключать magic_quotes, а если нету то пропускать входящие данные через stripslashes вручную и дальше работать с данными как если бы magic_quotes были выключены.

  Ответить  
 
 автор: sl1p   (24.10.2008 в 16:48)   письмо автору
 
   для: Евгений Петров   (24.10.2008 в 16:44)
 

я просто не могу понять смысл:
$s = (get_magic_quotes_gpc())? stripslashes($s):$s;
зачем тогда это нужно когда при включённых, нет слешей?... и зачем это использовать при записи в бд вообще:)

и когда они включены нужно добавить в html_escape()
$s = (get_magic_quotes_gpc())? stripslashes($s):$s;?

насколько я понял:)

но получается,если например я был на одном хостинге где кав. были включены, и там записывалось в бд. и вдруг перешёл туда где они отключены. Откуда мне тогда знать что слешы в записи это сама запись а не предотвращение?)

  Ответить  
 
 автор: Евгений Петров   (24.10.2008 в 17:11)   письмо автору
 
   для: sl1p   (24.10.2008 в 16:48)
 

Включенные кавычки это избытки прошлого, это сделали для безопасности а в итоге это стало жутко мешать.
В PHP5 помоему по умолчанию magic_quotes выключены. Поэтому я рекомендую работать с кодом так как будто magic_quotes выключены а вначале файла если они включены - убирать их. Это не путает при работе с данными.

> и когда они включены нужно добавить в html_escape()

не путайте, html_escape используется абсолютно для других целей. Данные в базе должны храниться как есть - т.е. БЕЗ кавычек и в виде обычного текста (т.е. например 5 > 3 а НЕ 5 &gt; 3). Т.е. НЕ нужно перед занесением в базу данных пропускать их через htmlspecialchars. Это нужно только при выводе в браузер, чтобы он не воспринял текст как html-код.

Пример:

Допустим у нас есть строка:
символ '>' означает 'больше'

Эта строка приходит в скрипт через _POST.
Если magic_quotes = On то нам нужно сразу вырезать оттуда слеши, если Off - ничего не делаем и работаем дальше.

На данном этапе у нас есть строка БЕЗ кавычек, и нам в теперь дальнейшем все равно какое значение параметра magic_quotes.

Теперь нам нужно занести значение в базу. Мы ВСЕГДА пропускаем данные через mysql_escape_string.

В итоге в БД строка будет храниться в первоначальном виде, т.е.
символ '>' означает 'больше'

Теперь извлекаем из базы эту строку и выводим её. Но для того чтобы символ > не воспринялся как открывающая скобка тега пропускаем данные через htmlspecialchars и на выходе получим
символ '&gt;' означает 'больше'
а браузер покажет
символ '>' означает 'больше'

  Ответить  
 
 автор: sl1p   (24.10.2008 в 23:20)   письмо автору
 
   для: Евгений Петров   (24.10.2008 в 17:11)
 

ну это вроде понятно,но в функции ж db_record_escape есть код который удаляет слешы в случае включённых кавычек.. почему тогда выводит со слешами?...

  Ответить  
 
 автор: Евгений Петров   (25.10.2008 в 00:10)   письмо автору
 
   для: sl1p   (24.10.2008 в 23:20)
 

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

  Ответить  
 
 автор: sl1p   (25.10.2008 в 00:12)   письмо автору
 
   для: Евгений Петров   (25.10.2008 в 00:10)
 

я очень извиняюсь, но не совсем понял...
тоесть если я буду не сразу в sql применять функцию а сначала переменную "обделаю", тогда стрип будет работать или как?)

  Ответить  
 
 автор: Евгений Петров   (25.10.2008 в 01:08)   письмо автору
 
   для: 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. Или вы не это имели в виду?

  Ответить  
 
 автор: sl1p   (25.10.2008 в 02:00)   письмо автору
 
   для: Евгений Петров   (25.10.2008 в 01:08)
 

хм это, так может юзать mysql_escape_string, только если включены?..

  Ответить  
 
 автор: Евгений Петров   (24.10.2008 в 16:57)   письмо автору
 
   для: Евгений Петров   (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);  
}

  Ответить  
 
 автор: Евгений Петров   (24.10.2008 в 16:34)   письмо автору
 
   для: sl1p   (24.10.2008 в 16:30)
 

>хотя вот да, почемуто если прямиком обработать текст из базы тоесть не писать его в переменную,а типа такого:
>echo htmlspecialchars(sql lala..);
>
>если же засунуть в переменную и обработать её, тогда слеши есть.

Не осилил ) Пример можно?

  Ответить  
 
 автор: sl1p   (24.10.2008 в 16:37)   письмо автору
 
   для: Евгений Петров   (24.10.2008 в 16:34)
 

-

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования