1. PHP / Говнокод #19462

    −112

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    /**
    	 * Compile Bindings
    	 *
    	 * @access	public
    	 * @param	string	the sql statement
    	 * @param	array	an array of bind data
    	 * @return	string
    	 */
    	function compile_binds($sql, $binds)
    	{
    		if (strpos($sql, $this->bind_marker) === FALSE)
    		{
    			return $sql;
    		}
    
    		if ( ! is_array($binds))
    		{
    			$binds = array($binds);
    		}
    
    		// Get the sql segments around the bind markers
    		$segments = explode($this->bind_marker, $sql);
    
    		// The count of bind should be 1 less then the count of segments
    		// If there are more bind arguments trim it down
    		if (count($binds) >= count($segments)) {
    			$binds = array_slice($binds, 0, count($segments)-1);
    		}
    
    		// Construct the binded query
    		$result = $segments[0];
    		$i = 0;
    		foreach ($binds as $bind)
    		{
    			$result .= $this->escape($bind);
    			$result .= $segments[++$i];
    		}
    
    		return $result;
    	}

    Ковыряю легаси.
    Кодигнайтер первый.
    Типа биндинг параметров в SQL запросе (вне зависимости от драйвера бд).
    Полез я позырить с какого хера оно не ругается на не равное кол-во переданных параметров и плейсхолдеров к ним, т.к. просто забыл дописать в запрос WHERE id = ? при живом переданном айдишнике.

    Запостил: deep, 15 Февраля 2016

    Комментарии (5) RSS

    • показать все, что скрытоСпециально для минусующих ебанашек:

      Биндинг параметров подразумевает "РАЗДЕЛЬНУЮ" отправку на сервер БД текста запроса с плейсхолдерами и самих даных. В бинарном виде, клиентский запрос, пропущенный через биндинг параметров (prepared statement) выглядит примерно так:

      <текст запроса с плейсхолдерами><данные1><данные2><данные N>

      Такой подход реально защищает от SQL-инъекций, т.к. данные находятся не в тексте запроса.

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

      Кроме того, по коду видно, что, если я не поставил плейсхолдер, но воткнул данные для бинда, то мои данные будут проигнорированы, если я передал больше параметров, лишние будут проигнорированы, если я передал больше плейсхолдеров, обратно в строку соберется не весь текст запроса, и будет синтаксически не верным, а ошибкой ответит сам сервер, а не драйвер.
      Ответить
    • показать все, что скрытопросто плюс за то, что кто-то такое использует при работе с базой. ЧТО ЭТО???
      Ответить

    Добавить комментарий