За последние 24 часа нас посетили 17575 программистов и 1622 робота. Сейчас ищут 1494 программиста ...

Проверка запросов, безопасность запросов к БД

Тема в разделе "PHP и базы данных", создана пользователем Den1s, 19 авг 2008.

Статус темы:
Закрыта.
  1. Den1s

    Den1s Активный пользователь

    С нами с:
    10 авг 2008
    Сообщения:
    19
    Симпатии:
    0
    Адрес:
    Siberia
    Дело такое: вот думаю как рациональнее сделать проверку и делать ли её вообще. Может кто сталкивался с подобной ситуацией, посоветуйте пожалуста.

    Запросы передаются скрипту методом GET, скрипт уже делает выборку из базы по переданным параметрам. Вот думаю, как сделать так, чтобы перед запросом на вывод результата, делать проверку на наличие переданного параметра в таблице БД, если не существует то 404. Все передаваемые параметры цифровые, перед запросом к базе как лучше обрабатывать, чтобы обезопасить от SQL-иньекций?
     
  2. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Боян
    Проверять is_numeric()
     
  3. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Два варианта. Либо проверять, что это число и вываливаться в противном случае. Либо приводить к числовому типу принудительно.
     
  4. Den1s

    Den1s Активный пользователь

    С нами с:
    10 авг 2008
    Сообщения:
    19
    Симпатии:
    0
    Адрес:
    Siberia
    на данный момент вся моя проверка сводится к:

    Код (Text):
    1. $id = htmlentities($_GET[id]);
    2. if (!preg_match("|^[\d]+$|", $id)) {
    3. header ("location: index.php");
    4. }
    может еще добавить что то, или изменить.

    Но как вот мне проверять, присутствует ли значение в базе.. подключаться и перебирать все значения чтоли.
     
  5. lexa

    lexa Активный пользователь

    С нами с:
    22 июл 2007
    Сообщения:
    1.746
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Сказали же, is_numeric:
    Код (Text):
    1. if (is_numeric($_GET['id']))
    2.     echo 'Йа число!';
    Сказали же, приводить к числовому типу:
    Код (Text):
    1. $id = (int)$_GET['id'];
    Да, перебирать. Уникальные поля перебираются быстро. Индексированные медленнее, но тоже быстро.
    Код (Text):
    1. $sql = 'select 1 from таблица where id = "'.$id.'" limit 1';
    limit 1, ибо хз чё у тебя там с полями.
     
  6. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Это работает конечно, но с точки зрения педанта это не правильно (это накладывает ограничения к числам а так-же нарушило бы типизацию если бы она в РНР была)
     
  7. lexa

    lexa Активный пользователь

    С нами с:
    22 июл 2007
    Сообщения:
    1.746
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    А если бы у бабушки был хрен, то она была бы дедушкой. ;)

    В PHP нет типизации (что шикарно). Про ограничение я не понял, а то как бы ответил! :)
     
  8. Den1s

    Den1s Активный пользователь

    С нами с:
    10 авг 2008
    Сообщения:
    19
    Симпатии:
    0
    Адрес:
    Siberia
    вобщем подумал, а зачем приводить к числовому типу, может просто использовать ctype_digit()
     
  9. Den1s

    Den1s Активный пользователь

    С нами с:
    10 авг 2008
    Сообщения:
    19
    Симпатии:
    0
    Адрес:
    Siberia
    сделал так:

    Код (Text):
    1.  
    2. if (isset($_GET[id])){
    3.     $id = $_GET[id];
    4.  
    5.     if (empty($id)){
    6.         header ("location: index.php");
    7.         }
    8.  
    9.     if (!ctype_digit($id)) {
    10.         echo $error;
    11.         exit;
    12.         } else {
    13.             $row = mysql_query ("SELECT id FROM table WHERE id=$id LIMIT 1", $db);
    14.             $arrow = mysql_fetch_array($row);
    15.  
    16.             if ($arrow == false){
    17.                 echo $error;
    18.                 exit;
    19.                 }
    20.             }
    21. }
    Вроде работает, может есть какие то серьезные ошибки.. выслушаю и приму к сведению.
     
  10. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
  11. lexa

    lexa Активный пользователь

    С нами с:
    22 июл 2007
    Сообщения:
    1.746
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Vladson,

    1) Ыгыгы. Да, определённо для id int auto_increment и домашней странички этого мало.
    2) Сними очки и брось гитару, у меня же написано в посте и про is_numeric(). ;)
     
  12. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    1 - Числовые значения используются не только для "id int auto_increment"
    2 - Вторая причина (123ksdi8398hv) так-же важна

    Одень очки и возьми гитару, у меня про него написано раньше чем у тебя

    Для опытных программистов шикарно, а новичков это только приучивает к раздолбайству
     
  13. NOmeR1

    NOmeR1 Активный пользователь

    С нами с:
    11 май 2008
    Сообщения:
    97
    Симпатии:
    0
    Скорее всего наоборот :D
     
  14. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Да нет, не наоборот, именно по началу привыкаешь к таким приёмам как приведение к числовому типу, а потом (когда начинаешь работать не с простой выборкой по ID, а со всякими другими числами) отвыкнуть очень сложно, долгое время уходит на то чтоб понять почему нифига не пашет...
     
  15. lexa

    lexa Активный пользователь

    С нами с:
    22 июл 2007
    Сообщения:
    1.746
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    1) А тут - да и это очевидно, когда ты без очков и без гитары.
    2) Ну, да. Важна для количества псевдо-аргументов.

    А я!.. А я!... А я написал про is_numeric() ещё в 1996!!111111
     
  16. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    lexa
    Когда кончаются аргументы надо просто молчать, а не нести пургу...
     
  17. lexa

    lexa Активный пользователь

    С нами с:
    22 июл 2007
    Сообщения:
    1.746
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Vladson, самокритично. Жаль, ты сразу к этому выводу не пришёл.
     
Статус темы:
Закрыта.