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

Форум MySQL

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

 

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

вид форума:
Линейный форум (новые сообщения вниз) Структурный форум

тема: Предохранение при записи в базу данных

Сообщения:  [1-10]    [11-20]  [21-29] 

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

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

  Ответить  
 
 автор: Евгений Петров   (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 в 00:12)   письмо автору
 
   для: Евгений Петров   (25.10.2008 в 00:10)
 

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

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

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

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

Уважаю!

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

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

  Ответить  
 
 автор: Евгений Петров   (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;' означает 'больше'
а браузер покажет
символ '>' означает 'больше'

  Ответить  
 
 автор: Евгений Петров   (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);  
}

  Ответить  
 
 автор: 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 в 16:44)   письмо автору
 
   для: sl1p   (24.10.2008 в 16:36)
 

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

  Ответить  

Сообщения:  [1-10]    [11-20]  [21-29] 

Форум разработан IT-студией SoftTime
Rambler's Top100
вверх

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