Как сделать пуленепробиваемый GET/POST запрос/передачу данных

Тема в разделе "Как сделать...", создана пользователем m1ko, 7 дек 2014.

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

    m1ko Создатель

    Регистр.:
    15 авг 2010
    Сообщения:
    42
    Симпатии:
    3
    Здравствуйте ребят, как сделать пуленепробиваемый GET/POST запрос/передачу данных?

    От подмены значений допустим я сделал проверку.
    Допустим в GET передается &nick=nick123 не важно что это будет, значения буквы+цифры,
    понятно что одни цифры можно было бы засунуть в intval, но есть еще и буквы, интересует как защититься от XSS и SQL инъекций

    Хватит ли такого кода для GET/POST ?


    Код:
        function filt($value) {
            $value = strip_tags($value);
            $value = htmlentities($value, ENT_QUOTES, "UTF-8");
            $value = htmlspecialchars($value, ENT_QUOTES);
            return $value;
        }
    Добавление в базу идет таким образом из POST
    Код:
        function newPosition($nick) {
            $queryPosition1 = "INSERT INTO positions (uid, nick) VALUES ('', '$nick')";
            $newPosition1 = mysql_query($queryPosition1) or die (mysql_error());
    } 
    И хотелось бы шифровать GET запросы что бы за место &nick=nick21 было &nick=kj4k2jh3kj5h21lk34 что нибудь такое.

    Не кидайте в меня камнем))) в интернете много информации и везде разная, нужно действительно достоверная и правильная инфа как правильно писать, очень нужно!
     
  2. Jensi

    Jensi Писатель

    Регистр.:
    1 дек 2014
    Сообщения:
    2
    Симпатии:
    1
    1. Используй регулярки для проверки гет и пост.
    2. urlencode/urldecode

    С телефона не могу написать регулярку, не удобно:(
     
    m1ko нравится это.
  3. m1ko

    m1ko Создатель

    Регистр.:
    15 авг 2010
    Сообщения:
    42
    Симпатии:
    3
    За второй пункт Like, видел этот вариант, нужно от SQL инъекций еще фильтрацию на всякий случай
     
  4. Шумадан

    Шумадан Хабарра!!11

    Регистр.:
    6 фев 2008
    Сообщения:
    1.723
    Симпатии:
    2.098
  5. m1ko

    m1ko Создатель

    Регистр.:
    15 авг 2010
    Сообщения:
    42
    Симпатии:
    3
    Блин я когда начал учить php, PDO не было, вроде бы научился чуть писать и тут DPO и теперь не могу врубить в него, привык по старинке писать..
     
    Шумадан нравится это.
  6. Q_BASIC

    Q_BASIC

    Регистр.:
    30 ноя 2013
    Сообщения:
    352
    Симпатии:
    223
    Мини туториал по PDO:
    Подключение:
    PHP:
    $db = new PDO('mysql:host=localhost;dbname=testdb;charset=utf8''username''password');
    Самый простой запрос:
    PHP:
    $row $db->query('SELECT * FROM `table`');
    Получение записей:
    PHP:
    while($fetch $row->fetch()){
            
    print_r($fetch);
    }
    Запрос с защитой от инъекции:
    PHP:
    $select $db->prepare('SELECT * FROM `table` WHERE `name`=:name'); // Подготовка запроса
    $data['name'] = $_POST['name']; // данные для запроса (массив)
    $row $select->execute($data); // Выполнение запроса
    Это всё что необходимо знать...
     
    m1ko и Шумадан нравится это.
  7. dandandan

    dandandan

    Регистр.:
    7 авг 2008
    Сообщения:
    975
    Симпатии:
    255
    http://dklab.ru/lib/HTTP_UrlSigner/
    не совсем так, как вы хотите, но будет цифровая подпись. т.е. ручками уже нельзя будет поменять параметр.
     
  8. Jensi

    Jensi Писатель

    Регистр.:
    1 дек 2014
    Сообщения:
    2
    Симпатии:
    1
  9. Denixxx

    Denixxx

    Регистр.:
    7 фев 2014
    Сообщения:
    247
    Симпатии:
    191
    Проверку переданных данных нужно делать в зависимости от потребности.
    Я предпочитаю не просто проверять, но вырезать невалидную инфу.
    Тогда запрос типа ?module=3"hack'9 будет работать как ?module=39 при verify($_GET['module'],3) :
    Код:
    function verify($data,$mode=0)
    {
        switch ($mode)
        {
            case 1:
                return preg_replace("/[^a-z0-9A-Z]+/",'',$data); // числа, буквы
                break;
            case 2:
                return preg_replace("/[^a-zA-Z]+/",'',$data); // буквы
                break;
            case 3:
                return preg_replace("/[^0-9]+/",'',$data); // числа
                break;
            case 4:
                return preg_replace("/[^a-z0-9A-Z\-_\.]+/",'',$data); // числа, буквы, тире, прочерк, точка
                break;
            case 5:
                return preg_replace("/[^ [:punct:]".('a-zA-Z')."0-9]+/",'',$data); // соотв. текущему языку алфавит + цифры и знаки препинания
                break;
            default:
                return preg_replace("/[~@\+\?\%\/\;=\*\>\<\"\'\-]+/",'',$data); // блек-лист в крайнем случае.
                break;
        }
    }
    
     
  10. stealthdebuger

    stealthdebuger Механик

    Administrator
    Регистр.:
    25 авг 2008
    Сообщения:
    624
    Симпатии:
    1.379
    Более удачным решением было бы не "вырезать невалидную инфу", а отсекать подобные запросы, уведомляя администратора сайта о попытке "взлома".
    Использовать $ в конце искомой строки и настоятельно рекомендую вам ограничивать длину "валидной" строки.
     
    m1ko нравится это.
Статус темы:
Закрыта.