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

Форум PHP

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

 

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

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

тема: разница функций
 
 автор: Bvz   (11.04.2010 в 03:07)   письмо автору
 
 

чем отличаются функции mysql_real_escape_string() и mysql_escape_string() что предпочтительнее к использованию

  Ответить  
 
 автор: chexov   (11.04.2010 в 03:27)   письмо автору
 
   для: Bvz   (11.04.2010 в 03:07)
 

тут ссылочка доходчиво описано

  Ответить  
 
 автор: neadekvat   (11.04.2010 в 09:50)   письмо автору
 
   для: Bvz   (11.04.2010 в 03:07)
 

А еще mysql_escape_string() в php 5.3.0 помечена на удаление, что как бэ намекает, какую именно надо использовать функцию.

  Ответить  
 
 автор: Bvz   (11.04.2010 в 11:12)   письмо автору
 
   для: neadekvat   (11.04.2010 в 09:50)
 

а как правильно пользоваться, так?

if(!get_magic_quotes_gpc())
    {
        $name = trim(mysql_real_escape_string($_POST['name']));
    }
else
    {
$name = trim($_POST['name']);
    }

  Ответить  
 
 автор: Trianon   (11.04.2010 в 11:37)   письмо автору
 
   для: Bvz   (11.04.2010 в 11:12)
 

нет.
правильно пользоваться - так как изображено в мануале по этой функции - в примере №1

  Ответить  
 
 автор: Bvz   (11.04.2010 в 11:54)   письмо автору
 
   для: Trianon   (11.04.2010 в 11:37)
 

не совсем понятно, можете разъяснить?

  Ответить  
 
 автор: Trianon   (11.04.2010 в 12:18)   письмо автору
 
   для: Bvz   (11.04.2010 в 11:54)
 

цитируйте пример - поясню.
Или Вы не в курсе, как искать вывести мануал по имени функции?

php.net/имя_функции

  Ответить  
 
 автор: Bvz   (11.04.2010 в 12:30)   письмо автору
 
   для: Trianon   (11.04.2010 в 12:18)
 

<?php
// Connect
$link mysql_connect('mysql_host''mysql_user''mysql_password')
    OR die(
mysql_error());

// Query
$query sprintf("SELECT * FROM users WHERE user='%s' AND password='%s'",
            
mysql_real_escape_string($user),
            
mysql_real_escape_string($password));
?>

  Ответить  
 
 автор: Trianon   (11.04.2010 в 12:33)   письмо автору
 
   для: Bvz   (11.04.2010 в 12:30)
 

да. именно он. А что непонятно-то?

можно обойтись и без sprintf
<?

$query 
"SELECT * FROM users"
  
." WHERE user='".mysql_real_escape_string($user)."'"
  
."   AND password='".mysql_real_escape_string($password)."'",

но, как видите, текст получается более неуклюжим.

  Ответить  
 
 автор: Bvz   (11.04.2010 в 12:38)   письмо автору
 
   для: Trianon   (11.04.2010 в 12:33)
 

ну а например если поступают данные через форму как ее обрабатывать?

  Ответить  
 
 автор: Slo_Nik   (11.04.2010 в 12:51)   письмо автору
 
   для: Bvz   (11.04.2010 в 12:38)
 

так в приме же всё показано. или Вы думаете, что $password может как то взяться не из формы?

  Ответить  
 
 автор: Тень*   (11.04.2010 в 12:53)   письмо автору
 
   для: Slo_Nik   (11.04.2010 в 12:51)
 

А может и не из формы, че

  Ответить  
 
 автор: Bvz   (11.04.2010 в 13:00)   письмо автору
 
   для: Тень*   (11.04.2010 в 12:53)
 

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

т.е.
if(!get_magic_quotes_gpc())
    {
        $name = trim(mysql_real_escape_string($_POST['name']));
    }
else
    {
$name = trim($_POST['name']);
    } 

делать необязательно
достаточно
$name = trim($_POST['name']);

  Ответить  
 
 автор: Slo_Nik   (11.04.2010 в 13:04)   письмо автору
 
   для: Bvz   (11.04.2010 в 13:00)
 

> ....а не с данными, которые поступают в бд

это тоже sql запрос

  Ответить  
 
 автор: Bvz   (11.04.2010 в 13:07)   письмо автору
 
   для: Slo_Nik   (11.04.2010 в 13:04)
 

не понятно, поясните

  Ответить  
 
 автор: Slo_Nik   (11.04.2010 в 14:18)   письмо автору
 
   для: Bvz   (11.04.2010 в 13:07)
 

>я о другом, я правильно понял, что эту функцию надо использовать при составлении sql запроса, а не с данными, которые поступают в бд

sql запрос это на выборку данных, на изменение данных, на удаление данных, на запись данных в базу....

если данные поступают в бд, значит выполняется sql запрос

  Ответить  
 
 автор: Trianon   (11.04.2010 в 13:29)   письмо автору
 
   для: Bvz   (11.04.2010 в 13:00)
 

с данными, поступающими из формы надо делать так.
        $name = get_magic_quotes_gpc() ? stripslashes($_POST['name']) : $_POST['name'];


но это надо делать а) с любыми данными формы.
и б) вне всякой связи как с обращениями к БД, так и с выводом в браузер

Хотя лучше бы magic quotes отключить с гарантией.

  Ответить  
 
 автор: Bvz   (11.04.2010 в 15:48)   письмо автору
 
   для: Trianon   (11.04.2010 в 13:29)
 

а как их отключить?
а с числовыми значениями достаточно intval?

  Ответить  
 
 автор: Slo_Nik   (11.04.2010 в 16:10)   письмо автору
 
   для: Bvz   (11.04.2010 в 15:48)
 

если на локальном компьютере, то достаточно в php.ini magic_quotes_gpc = Off
если это на хосте, то через файл .htaccess, если он разрешён к использованию хостером, в файле написать строку php_flag magic_quotes_gpc Off

  Ответить  
 
 автор: Bvz   (11.04.2010 в 16:20)   письмо автору
 
   для: Trianon   (11.04.2010 в 13:29)
 

я вот так делаю, поправте пожайлуста как правильнее и безопаснее


<?php

//обрабатываем получанные данные
$id intval($_GET['id']);
if (!isset(
$id))
    {
        echo 
"Вы не ввели данные!";
        exit();
    }

//выбираем данные
$aquery mysql_query("SELECT * FROM `category` WHERE `id`=$id");
$a mysql_fetch_assoc($aquery);
?>

<form method="post" name="category" action="edit_category.php?id=<?php echo $id?>">
    
    <b><small>Название категории:</small></b><br />
    <input <?php if($id==2) echo " readonly "?> type="text" name="name" value="<?php echo $a['name']; ?>" size="50" maxlength="50" /><br /><br />

    <b><small>Описание категории:</small></b><br />
    <textarea name="description" rows="20" style="width:100%"><?php echo $a['description']; ?></textarea><br /><br />

    <input type="hidden" name="id" value="<?php echo $id?>" />
    <input type="submit" name="submit" value="Сохранить" />
</form>

<?php
//обрабатываем получанные данные
        
$id intval($_POST['id']);
        if (!isset(
$id))
            {
                echo 
"Вы не ввели данные! ";
                exit();
            }

        if(!
get_magic_quotes_gpc())
            {
                
$name trim(mysql_escape_string($_POST['name']));
                
$description trim(mysql_escape_string($_POST['description']));
            }
        else
            {
                
$name trim($_POST['name']);
                
$description trim($_POST['description']);
            }

        
//обновляем данные
        
$aupdate "UPDATE `category` SET name='$name', description='$description', WHERE `id`=$id";

        if (
mysql_query($aupdate))
            {
                echo 
"Данные успешно обновлены!<br />";
                exit();
            }

        else
            {
                exit (
mysql_error());
            }
    }
?>

  Ответить  
 
 автор: Trianon   (11.04.2010 в 17:14)   письмо автору
 
   для: Bvz   (11.04.2010 в 16:20)
 

в каком плане - поправить?
Я показал, как правильнее.

  Ответить  
 
 автор: Bvz   (11.04.2010 в 17:26)   письмо автору
 
   для: Trianon   (11.04.2010 в 17:14)
 

ну в плане как подправить сей код с вашей точки зрения?

  Ответить  
 
 автор: Trianon   (11.04.2010 в 17:28)   письмо автору
 
   для: Bvz   (11.04.2010 в 17:26)
 

я показал, как подправить.
Именно этот код я подправлять буду лишь при наличии весьма убедительных доводов.
Потому что Вы можете сделать это сами.

  Ответить  
 
 автор: Bvz   (11.04.2010 в 17:56)   письмо автору
 
   для: Trianon   (11.04.2010 в 17:28)
 

так?


<?php

//обрабатываем получанные данные
        
$id intval($_POST['id']);
        if (!isset(
$id))
            {
                echo 
"Вы не ввели данные! ";
                exit();
            }

        if(
get_magic_quotes_gpc())
            {
                
$name trim(stripslashes($_POST['name']));
                
$description trim(stripslashes($_POST['description']));
            }
        else
            {
                
$name trim($_POST['name']);
                
$description trim($_POST['description']);
            }

        
//обновляем данные
        
$aupdate "UPDATE `category` SET name='$name', description='$description', WHERE `id`=$id";

        if (
mysql_query($aupdate))
            {
                echo 
"Данные успешно обновлены!<br />";
                exit();
            }

        else
            {
                exit (
mysql_error());
            }
    }
    
?> 

  Ответить  
 
 автор: Trianon   (11.04.2010 в 18:02)   письмо автору
 
   для: Bvz   (11.04.2010 в 17:56)
 

почему trim в обработке magic quotes?

куда делась mysql_real_escape_string при формировании запроса?

  Ответить  
 
 автор: Bvz   (11.04.2010 в 18:05)   письмо автору
 
   для: Trianon   (11.04.2010 в 18:02)
 

trim - для удаления пробелов в конце и начале строки, там текстовые данные, а mysql_real_escape_string() не использовал, т.к. $id число, или я не совсем правильно понял

  Ответить  
 
 автор: Trianon   (11.04.2010 в 18:08)   письмо автору
 
   для: Bvz   (11.04.2010 в 18:05)
 

удаление пробелов не имеет отношения к magic quotes.
Не пытайтесь оптимизировать скрипт раньше чем его напишете.
А если оптимизируете, не нарушайте при этом логику - почему trim упоминается два раза?

В контексте оператора $aupdate = ... не заметно , что $id именно число.
но я спрашивал даже не об этой переменной, а о name и о description .
Сейчас у Вас SQL-инъекция чистоганом.

  Ответить  
 
 автор: Bvz   (11.04.2010 в 18:16)   письмо автору
 
   для: Trianon   (11.04.2010 в 18:08)
 


<?php

//обрабатываем получанные данные
        
$id intval($_POST['id']);
        if (!isset(
$id))
            {
                echo 
"Вы не ввели данные! ";
                exit();
            }

        if(
get_magic_quotes_gpc())
            {
                
$name stripslashes($_POST['name']);
                
$description stripslashes($_POST['description']);
            }
        else
            {
                
$name $_POST['name']);
                
$description $_POST['description'];
            }
                
$name trim($name);
                
$description trim($description);
                
        
//обновляем данные
        
$aupdate "UPDATE `category` SET name='".mysql_real_escape_string($name)."', description='".mysql_real_escape_string($description}."', WHERE `id`='."mysql_real_escape_string($id)."'";

        if (
mysql_query($aupdate))
            {
                echo 
"Данные успешно обновлены!<br />";
                exit();
            }

        else
            {
                exit (
mysql_error());
            }
    }
    
?> 


но $id - число оно вначале обрабатывается как intval, как его в запрос добавлять?

  Ответить  
 
 автор: Trianon   (11.04.2010 в 18:30)   письмо автору
 
   для: Bvz   (11.04.2010 в 18:16)
 

Теперь нужно исправить синтаксические ошибки,
а также сделать так, чтобы листинг по ширине влезал в печатный лист.
Мне до кнопки "ответить" не добраться.

  Ответить  
 
 автор: Bvz   (11.04.2010 в 18:46)   письмо автору
 
   для: Trianon   (11.04.2010 в 18:30)
 

я правда не вижу ошибок, подскажите?
а как уменьшить листинг по ширине?

вот нашел такое решение


<?php
// функция для экранировки спецсимволов
function escape_string($str) {
   if( 
get_magic_quotes_gpc() ) // если режим магических кавычек включен
      
$str stripslashes($str); // очищаем строку от обратных слешей, которые добавили магические ковычки
   
return mysql_real_escape_string($str); // возвращаем экранированную строку
}

// и где-то её использование
$id intval($_POST['id']);
$name escape_string($_POST['name']);
$description escape_string($_POST['description']);
$name trim($name);
$description trim($description);
//обновляем данные
$sql "UPDATE `category` SET name='{$name}', description='{$description}' WHERE id={$id}";

mysql_query($sql) or die(mysql_error());
?>

  Ответить  
 
 автор: Trianon   (11.04.2010 в 19:41)   письмо автору
 
   для: Bvz   (11.04.2010 в 18:46)
 

понятно.
не в коня корм.


Что я могу сказать?
В разделе "задачи" 21-я - Ваша..
Решите - поймете.

  Ответить  
 
 автор: Bvz   (11.04.2010 в 20:35)   письмо автору
 
   для: Trianon   (11.04.2010 в 19:41)
 

в вашем решении этой задачи есть такая функция


function unmq($arg)
{
    return $arg === null ? null :
              (get_magic_quotes_gpc()? stripslashes($arg): $arg);



а сам sql запрос формируется так


$add   = unmq(@$_POST['name']);
$name = $add;
       $esc_name = "'".mysql_escape_string($name)."'";
       $sql = "SELECT id FROM guests WHERE guestname = $esc_name"; 


но сейчас вы предлагаете так делать

$add   = unmq(@$_POST['name']);
$name = $add;
       $sql = "SELECT id FROM guests WHERE guestname = '".mysql_escape_string($name)."'"; 

я вас правильно понял?
а почему в функцию unmq нельзя добавить mysql_escape_string?

  Ответить  
 
 автор: Slo_Nik   (11.04.2010 в 21:00)   письмо автору
 
   для: Bvz   (11.04.2010 в 20:35)
 

наверное потому что противоположные задачи у этих функций?

  Ответить  
 
 автор: Trianon   (11.04.2010 в 21:53)   письмо автору
 
   для: Bvz   (11.04.2010 в 20:35)
 

>в вашем решении этой задачи есть такая функция
>
>

>function unmq($arg)
>{
>    return $arg === null ? null :
>              (get_magic_quotes_gpc()? stripslashes($arg): $arg);
>} 
>

>
>а сам sql запрос формируется так
>
>

>$add   = unmq(@$_POST['name']);
>$name = $add;
>       $esc_name = "'".mysql_escape_string($name)."'";
>       $sql = "SELECT id FROM guests WHERE guestname = $esc_name"; 
>

>
>но сейчас вы предлагаете так делать
>

>$add   = unmq(@$_POST['name']);
>$name = $add;
>       $sql = "SELECT id FROM guests WHERE guestname = '".mysql_escape_string($name)."'"; 
>

>я вас правильно понял?

Если Вы уже ловите настолько тонкие различия как сейчас процитировали, то тогда скажу, что верхний вариант идеологически более корректен. И ему я бы отдал предпочтение.

>а почему в функцию unmq нельзя добавить mysql_escape_string?

А вот этот вопрос показывает, что нихрена подобного не происходит, и до ловли тонких различий - как до Шанхая пешком.
Почему нельзя? Можно. Только скрипт работать перестанет. Вернее, начнет работать с ошибками.

  Ответить  
 
 автор: Bvz   (11.04.2010 в 22:06)   письмо автору
 
   для: Trianon   (11.04.2010 в 21:53)
 

спасибище!!! оставлю пока так (пока полностью не догоню как все это работает)


>function unmq($arg)
>{
>    return $arg === null ? null :
>              (get_magic_quotes_gpc()? stripslashes($arg): $arg);
>} 

>$add   = unmq(@$_POST['name']);
>$name = $add;
>       $esc_name = "'".mysql_escape_string($name)."'";
>       $sql = "SELECT id FROM guests WHERE guestname = $esc_name"; 


а какие ошибки могут возникать?
а с числовыми значениями как поступать?
и когда можно trim использовать?
и что брать mysql_escape_string или mysql_real_escape_string?

  Ответить  
 
 автор: Slo_Nik   (11.04.2010 в 18:07)   письмо автору
 
   для: Bvz   (11.04.2010 в 17:56)
 

ну а где же обработка данных функцией mysql_real_escape_string()? ведь Вас же интересовало именно это.
если "магические кавычки" включены, Вы убираете экранирующие слеши и..... дальше что? данные идут в запрос не обработаные....

если "магические кавычки" отключены, то данные так же не обрабатываются перед подстановкой в запрос.

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

Вы спрашивали как отключить "магические кавычки", вот и отключайте, и данные обрабатывайте с учётом этого.

  Ответить  
 
 автор: Тень*   (11.04.2010 в 21:58)   письмо автору
 
   для: Trianon   (11.04.2010 в 13:29)
 

Стоит учесть, что $_POST['name'] может быть массивом.

  Ответить  
 
 автор: Trianon   (11.04.2010 в 22:04)   письмо автору
 
   для: Тень*   (11.04.2010 в 21:58)
 

В смысле можно некрасиво получить диагностик на экран? Да, конечно.
Это Cheops мой ляп проглядел :)

  Ответить  
 
 автор: Тень*   (11.04.2010 в 22:07)   письмо автору
 
   для: Trianon   (11.04.2010 в 22:04)
 

Причём тут он?

  Ответить  
 
 автор: Trianon   (11.04.2010 в 22:31)   письмо автору
 
   для: Тень*   (11.04.2010 в 22:07)
 

Он же мой ответ в 21 задаче оценивал?

  Ответить  
 
 автор: Trianon   (11.04.2010 в 13:26)   письмо автору
 
   для: Slo_Nik   (11.04.2010 в 12:51)
 

пуркуа бы и не па?

  Ответить  
 
 автор: tvv123456   (11.04.2010 в 13:19)   письмо автору
 
   для: Trianon   (11.04.2010 в 12:33)
 

а мне вот интересно:
Если включены магические кавычки, то как лучше:
почистить переменную от слешей которые поставили магические кавычки а затем применить mysql_real_escape_string()

<?
if (get_magic_quotes_gpc()) {
        
$name stripslashes($_POST['name']);
    }
    
// Если переменная - число, то экранировать её не нужно
    // если нет - то окружем её кавычками, и экранируем
    
if (!is_numeric($name)) {
        
$name "'" mysql_real_escape_string($_POST['name']) . "'";
    }


или

Положиться на магические кавычки и пропустить обработку функцией mysql_real_escape_string()


<?
if(!get_magic_quotes_gpc()) 
    { 
        
$name mysql_real_escape_string($_POST['name']); 
    }


???????????????

  Ответить  
 
 автор: Trianon   (11.04.2010 в 13:30)   письмо автору
 
   для: tvv123456   (11.04.2010 в 13:19)
 

марш решать 21 задачу.

  Ответить  
 
 автор: tvv123456   (11.04.2010 в 13:31)   письмо автору
 
   для: Trianon   (11.04.2010 в 13:30)
 

Да все понял из вашего ответа: автор: Trianon (11.04.2010 в 13:29)
Хотел затереть сообщение но не успел

  Ответить  
 
 автор: Trianon   (11.04.2010 в 13:58)   письмо автору
 
   для: tvv123456   (11.04.2010 в 13:31)
 

нет. Вы не поняли. Вы поверили :)
Вот решите задачу в полноте объема - тогда поймете.

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

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