"PHP" / Говнокод #19462 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 deep, (Updated )

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

  • Специально для минусующих ебанашек:

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

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

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

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

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

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

Я, guest, находясь в здравом уме и твердой памяти, торжественно заявляю:

    А не использовать ли нам bbcode?


    8