что значат апострофы в php запросах к mysql?

Тема в разделе "PHP", создана пользователем satih, 14 июл 2010.

Статус темы:
Закрыта.
Модераторы: latteo
  1. satih

    satih

    Регистр.:
    19 сен 2008
    Сообщения:
    429
    Симпатии:
    710
    Нубовский вопрос, но одназначного ответа не нашел. В запросах к мускулу при передаче значений параметров, можно записать
    PHP:
    mysql_query("update table1 set col1 = 'x1', col2 = 'x2'");
    можно
    PHP:
    mysql_query("update table1 set col1 = x1, col2 = x2");
    тоже самое и с insert и остальными функциями. какой функционал у апострофа -> ' <- кроме как разделитель для удобства?
     
  2. chang

    chang

    Регистр.:
    20 ноя 2009
    Сообщения:
    363
    Симпатии:
    117
    все символы заключенные в кавычки интерпретируются как строка

    а если строку не заключать в кавычки то парсер SQL попытается ее интерпретировать иначе

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

    да и ИМХО нет никакого удобства в подобном разделении
     
  3. gres_18

    gres_18 Pythonобандерівець®

    Регистр.:
    26 апр 2009
    Сообщения:
    407
    Симпатии:
    206
    Защита от SQL Injection. Первая линия обороны :)
     
  4. satih

    satih

    Регистр.:
    19 сен 2008
    Сообщения:
    429
    Симпатии:
    710
    можно линки где что-то написано по каким либо доводам? а то даже незнаю с чего начинать гугль рыть для документации где нужны а где неважно.

    спасибо, посмотрел насчет защиты, намек понял.

    ------------------------------------------------------------------------------

    только что проверил
    PHP:
    mysql_query("update s3 set id = '3'");
    PHP:
    mysql_query("update s3 set id = 4");
    оба выполнились
     
  5. chang

    chang

    Регистр.:
    20 ноя 2009
    Сообщения:
    363
    Симпатии:
    117
    satih
    PHP:
    mysql_query("update table1 set col1 = x1, col2 = x2"); 
    здесь вы присваиваете строку col1 = x1
    PHP:
    mysql_query("update s3 set id = 4"); 
    а здесь присваиваете число
    первый запрос явно не выполнился ( возможно и при каких-то специфических настройках СУБД и будет работать, но в теории не должен)

    ну а второй выполнятся так как там простое число ....



    походу наглядный вариант зачем оно надо ....
    в таблице есть 2 поля col1, и col2

    к первому хотим присвоить следующую строку;
    "qwe , sss = ddd + 333";


    делаем это без кавычек
    PHP:
    mysql_query("update table1 set col1 = qwe , sss = ddd + 333, col2 = x2"); 
    и таким образом у нас вместо обновления двух столбцов идет обновление троих col1 , sss, col2 ... а колонки sss в таблице то и нет ....


    а если делать запрос с кавычками то в поле col1 запишется строка "qwe , sss = ddd + 333"; ....


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

    если же кавычки нет, то "SQL" попытается каким-то образом обработать символы, ....
    попробует определить не являются ли символы каким-то математическим выражением ...
    PHP:
    mysql_query("update s3 set id = 4 +2 * 3"); 
    какими-то функциями ....
    может позапросом .. ..
    PHP:
    mysql_query("update s3 set id = SELECT id from t2 limit 1"); 
    и так далее
     
    satih нравится это.
  6. satih

    satih

    Регистр.:
    19 сен 2008
    Сообщения:
    429
    Симпатии:
    710
    супер, ответ исчерпывающий, спасибо, пошел курить мускул дальше
     
  7. diavolic

    diavolic

    Регистр.:
    17 мар 2010
    Сообщения:
    522
    Симпатии:
    102
    дополню. например, имеем для идентификации пользователя следующую конструкцию, где переменная user_id передается при помощи GET (НАПРИМЕР!:(

    PHP:
    $res mysql_db_query ($dbase"select * from auth_table where id=$user_id");
    if (!
    $res)
          
    do_authentication();
    else
          
    do_righ_user();
    т.е. если по идентификатору выборка из базы состоялась, выводим нормальную страницу (do_righ_user), если нет, то заставляем ввести логин-пароль и запрещаем все остальное (do_authentication)

    Теперь представим, что некто скормил сценарию переменную:

    Код:
    http://server.com/script.php?user_id=0%20OR%201%3D1
    (что в декодированном состоянии соответствует
    Код:
    http://server.com/script.php?user_id=0 OR 1=1
    )

    В результате в сценарии запрос будет выглядеть как select * from auth_table where id=0 OR 1=1. И получается что пользователь "проваливается" на нормальную страницу без авторизации, ибо данный запрос всегда вернет какие то строки, т.е. будет соответствовать ситуации авторизованного пользователя.
    С другой стороны, если бы мы взяли в апострофы select * from auth_table where id='$user_id', сервер при формировании запроса выше, получил бы выборку select * from auth_table where id='0 OR 1=1' и вернул бы пустой ответ, что и соответствовало бы штатной ситуации неавторизованного пользователя.

    вот как то так вкратце.
     
  8. a_n_d_y

    a_n_d_y

    Регистр.:
    26 мар 2006
    Сообщения:
    465
    Симпатии:
    61
    diavolic, твой ример конечно хорош, но не доказывает преимущество применения кавычек ибо айди пользователя скорее всего integer, а для него лучше не использовать кавычки. В твоем случае надо все таки надо валидацию входящих данных провести и простая проверка на число послала бы такого умника (пытавшегося обмануть нас) на три буквы еще до запроса к базе ;)
     
  9. diavolic

    diavolic

    Регистр.:
    17 мар 2010
    Сообщения:
    522
    Симпатии:
    102
    разумеется где то там вверху подразумевалось наличие как минимум addslashes

    кстати, может тебя это удивит, но в маське обращение к целым числам возможно и даже нужно делать при помощи апострофов
     
  10. horpah

    horpah

    Регистр.:
    21 июн 2010
    Сообщения:
    199
    Симпатии:
    55
    Чтобы защититься от SQL-инъекций, все внешние параметры должны быть перед включением в SQL-запрос и обработаны с помощью mysql_real_escape_string($var, $conn) и заключены в одиночные кавычки. Не игнорируй 2-й необязательный параметр $conn, т.к. с некоторыми кодироваками вся защита может свестись на ноль. А чтобы не забывать это делать при каждом SQL запросе - напиши как минимум функцию, а то и класс по работе с БД, которые и кавычки расставят, и mysql_real_escape_string выполнят.
    У меня сейчас запросы выглядят так query('SELECT * FROM `tablename` WHERE f1={?} AND f2={?} AND id={?}',$param1, $param2, $param3); где на место плейсхолдера {?} (может быть любым, как придумаешь) ставится уже обработанный параметр.

    И будет тебе счастье.
     
Статус темы:
Закрыта.