За последние 24 часа нас посетили 19940 программистов и 1001 робот. Сейчас ищут 306 программистов ...

Помогите с sql инъекциями

Тема в разделе "PHP для новичков", создана пользователем Ondottr, 25 июн 2018.

  1. Ondottr

    Ondottr Новичок

    С нами с:
    24 ноя 2017
    Сообщения:
    46
    Симпатии:
    5
    Сделал вот такую защиту от инъекций

    PHP:
    1. class check {
    2.  
    3.     public function checkVar($var, $count)
    4.     {
    5.         if(!empty($var)) {
    6.             if(!ctype_digit($var) or strlen($var) > $count) {
    7.                 exit();
    8.             }
    9.         }
    10.     }
    11.     public function checkStr($var, $count)
    12.     {
    13.         if(!empty($var)) {
    14.             if(!ctype_alpha($var) or strlen($var) > $count) {
    15.                 exit();
    16.             }
    17.         }
    18.     }
    19.  
    20.  
    21. }
    22.  
    23.  
    24. $check->checkVar($id_building, 5);
    25. $result = $mysqli->query("SELECT * FROM `all_buildings` WHERE `id` = '$id_building");
    Как по мне этого достаточно, но, хочется увидеть мнение знающих людей, что не так и как сделать лучше.
     
    #1 Ondottr, 25 июн 2018
    Последнее редактирование: 25 июн 2018
  2. Sergey_Tsarev

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

    С нами с:
    17 мар 2016
    Сообщения:
    502
    Симпатии:
    105
    Подготовленные запросы лучше.
     
  3. AIMON

    AIMON Новичок

    С нами с:
    8 дек 2017
    Сообщения:
    7
    Симпатии:
    1
    ASUS нравится это.
  4. username

    username Новичок

    С нами с:
    6 июл 2017
    Сообщения:
    225
    Симпатии:
    17
  5. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.553
    Симпатии:
    1.754
    @Ondottr, просто всё подготовленными запросами, и не надо никаких проверок делать. Тем более строки бывают в многобайтных кодировках.
     
  6. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.072
    Симпатии:
    1.237
    Адрес:
    там-сям
  7. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.989
    Симпатии:
    759
    готовый класс для работы с БД:
    PHP:
    1. class MySQLi {
    2.     private $connection;
    3.  
    4.     public function __construct($hostname, $username, $password, $database, $port = '3306') {
    5.         $this->connection = new \mysqli($hostname, $username, $password, $database, $port);
    6.  
    7.         if ($this->connection->connect_error) {
    8.             throw new \Exception('Error: ' . $this->connection->error . '<br />Error No: ' . $this->connection->errno);
    9.         }
    10.  
    11.         $this->connection->set_charset("utf8");
    12.         $this->connection->query("SET SQL_MODE = ''");
    13.     }
    14.  
    15.     public function query($sql) {
    16.         $query = $this->connection->query($sql);
    17.  
    18.         if (!$this->connection->errno) {
    19.             if ($query instanceof \mysqli_result) {
    20.                 $data = array();
    21.  
    22.                 while ($row = $query->fetch_assoc()) {
    23.                     $data[] = $row;
    24.                 }
    25.  
    26.                 $result = new \stdClass();
    27.                 $result->num_rows = $query->num_rows;
    28.                 $result->row = isset($data[0]) ? $data[0] : array();
    29.                 $result->rows = $data;
    30.  
    31.                 $query->close();
    32.  
    33.                 return $result;
    34.             } else {
    35.                 return true;
    36.             }
    37.         } else {
    38.             throw new \Exception('Error: ' . $this->connection->error  . '<br />Error No: ' . $this->connection->errno . '<br />' . $sql);
    39.         }
    40.     }
    41.  
    42.     public function escape($value) {
    43.         return $this->connection->real_escape_string($value);
    44.     }
    45.    
    46.     public function countAffected() {
    47.         return $this->connection->affected_rows;
    48.     }
    49.  
    50.     public function getLastId() {
    51.         return $this->connection->insert_id;
    52.     }
    53.    
    54.     public function connected() {
    55.         return $this->connection->ping();
    56.     }
    57.    
    58.     public function __destruct() {
    59.         $this->connection->close();
    60.     }
    61. }
    от инъекций:
    для IDшников - (int)$var
    в остальных случаях - метод escape