За последние 24 часа нас посетили 62779 программистов и 1771 робот. Сейчас ищут 799 программистов ...

Sql инъекции

Тема в разделе "PHP для новичков", создана пользователем skrippt, 7 апр 2016.

  1. skrippt

    skrippt Новичок

    С нами с:
    7 апр 2016
    Сообщения:
    8
    Симпатии:
    0
    Здравствуйте не могли б вы мне помочь разобраться в защите сайта от Sql инъекций.
    Я защищаю сайт вот таким образом:
    1. Текстовые поля
    Код (Text):
    1.  
    2. $_POST['str']= (string)  $_POST['str'];//Указываем тип
    3. $_POST['str']=addslashes($_POST['str']);//экранируем
    4. $_POST['str']=str_replace("\\","",$_POST['str']);   //удаляем все слешы 
    5. $_POST['str'] = htmlspecialchars($_POST['str'],ENT_QUOTES);//преобразовывеем все html символы
    2. Имена, фамилии города вот так
    Код (Text):
    1.  
    2. $_POST['str']= (string)  $_POST['str'];//Указываем тип
    3. $_POST['str']=addslashes($_POST['str']);//экранируем
    4. $_POST['str']=preg_replace ("/[^a-zа-я0-9А-ЯA-ZЧчСсТтьЬюЮЭэРрыЫФфъЪХхЩщШшЦцУу№\- ]/","",$_POST['str']);
    3. Номера страниц вот так вот
    Код (Text):
    1.  
    2. if (mb_strlen($_GET['n'], 'utf-8')>5)
    3. {$_GET['n']="0";}
    4. //Экранируем
    5. $_GET['n']=addslashes($_GET['n']);
    6. //Убираем все кроме цифр
    7. $_GET['n'] = preg_replace('~[^0-9]+~','',$_GET['n']);
    Правильно ли я все делаю?
    Извиняюсь за глупые вопросы =)
     
  2. Period

    Period Новичок

    С нами с:
    29 дек 2014
    Сообщения:
    148
    Симпатии:
    1
    У вас сайт может работать с любыми базами данных или разработан под одну конкретную?
    Большинство пхп-расширений для доступа к БД имеют свои функции экранирования строк. Лучше использовать именно их, а не изобретать более медленные велосипеды.

    Это лишнее. Чем он ещё может быть?

    Это зачем? А если в тексте есть слэш? Он пропадёт.
    Фильтровать пользовательский ввод вообще считается дурной практикой. Пользовательские данные - священный грааль. Их нельзя менять. Проверить на корректность/некорректность - это всё, что можно с ними делать.

    Тут зависит от задачи. Если это запись в блог, то, скорее всего, пользователь захочет вставлять туда картинки, гиперссылки, видео с ютьюба и т.п. Так что всё гораздо сложнее.
     
  3. mr.akv

    mr.akv Активный пользователь

    С нами с:
    31 мар 2015
    Сообщения:
    1.604
    Симпатии:
    206
  4. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
  5. Evpatiy

    Evpatiy Новичок

    С нами с:
    11 ноя 2015
    Сообщения:
    43
    Симпатии:
    0
    ИМХО борьба с эскуэль инъекциями это как борьба за мир во всем мире.
    Структурированный и протестированный код не оставляет места никаким инъекциям.

    Добавлено спустя 39 секунд:
    Все эти эскуэль инъекшионз придумали маркетологи, чтобы бабла выбить.
     
  6. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Evpatiy ты о чём?
     
  7. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Ну не совсем так. Все текстовые данные перед добавлением в запрос должны быть проэкранированы, просто потому что иначе какой-нибудь незлонамеренно введённый в данные апостроф может порушить запрос. Т.е. экранируем мы не для защиты от SQL-инъекций, по сути, а чтобы вполне легитимные пользовательские данные не нарушили синтаксис нашего запроса. В конце концов, не запрещать же пользователю регистрироваться, если его зовут д'Артаньян! А попутно мы как сладкую плюшку получаем и защиту от SQL-инъекций, поскольку если пользователь захочет назваться
    Код (Text):
    1.  
    2. ' and 1=1; drop users;
    то это замечательное имя просто запишется в базу данных так, как оно введено, и пользователь даже сможет по нему залогиниться к нам. Ну если ему не лень вводить, нам тоже не жалко :)))
     
  8. Basilio

    Basilio Случайный прохожий

    С нами с:
    6 апр 2016
    Сообщения:
    191
    Симпатии:
    54
    Для нормального понимания темы рекомендую как минимум ознакомиться с данной лекцией: https://www.youtube.com/watch?v=Jxgq6eucWY4
    Реально тема довольно большая и сложная, относиться к ней "авось пронесет" нельзя. Не хотите изучать вопрос - учимся работать с любым внятным фреймворком, который возьмет на себя все обработки переменных и подготовку запросов.
     
  9. Period

    Period Новичок

    С нами с:
    29 дек 2014
    Сообщения:
    148
    Симпатии:
    1
    Для ленивых можно раскрыть суть вопроса :) Если я не забываю все строки прогонять через mysqli_real_escape_string, что может произойти? В случае простого поиска через LIKE ещё процент нужно экранировать, но это уже не безопасность, просто работать будет не так, как нужно.
     
  10. Basilio

    Basilio Случайный прохожий

    С нами с:
    6 апр 2016
    Сообщения:
    191
    Симпатии:
    54
    В сферическом случае этого достаточно. На практике же вполне возможно, что вы это где-то забудете, поэтому рекомендуется использовать биндинг параметров - т.е. вы не напрямую вставляете значение параметра в запрос, а передаете обработчику шаблон запроса с метками параметров, и сами параметры в виде php-массива, а далее обработчик сам уже передает параметры в безопасном для обработки виде.
    Например, в случае использования adodb в качестве прослойки для работы с БД это будет выглядеть вот таким образом:
    Код (PHP):
    1. $bindVars = array('A','B','C');
    2. $sql = "SELECT * FROM some_table WHERE col1=? AND col2=? AND col3=?";
    3. $result = $db->execute($sql,$bindVars);
     
  11. mr.akv

    mr.akv Активный пользователь

    С нами с:
    31 мар 2015
    Сообщения:
    1.604
    Симпатии:
    206
  12. Period

    Period Новичок

    С нами с:
    29 дек 2014
    Сообщения:
    148
    Симпатии:
    1
    Подготовленные запросы удобны, когда нужно выполнить один и тот же запрос с разными параметрами. На практике, я не помню, чтобы хоть раз с таким столкнулся. В остальном, они мне не нравятся. Кода больше получается.

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

    В PDO есть подгтовленные запросы с именованными параметрами, но всё равно удобства это не добавляет. Код не становится легче писать или легче читать. Если запрос не существует в целом виде, а генерируется из кусочков - это чистый геморрой. За это я ещё и ORM системы не люблю. Их только через eval прогонять, когда ты не знаешь, какой у тебя будет запрос.
     
  13. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Просто прогонять не достаточно.