Альтернатива mysql_real_escape_string

1. Момору (28.03.2013 / 15:54)
Привет всем!
Не далее чем вчера у меня неожиданно образовалась острая потребность фильтровать все полученные данные еще до открытия SQL соединения.
Естественно попытка все пропустить через mysql_real_escape_string(str)
приведет к вполне ожидаемому результату - ошибке. Следовательно ее надо заменить альтернативной функцией. Первое что, мне пришло в голову это - addslashes(str) которая,аналогично mysql_real_escape_string() экранирует все, как двойные, так и одинарные кавычки. На ней и решил остановится. Но, как говорится: Одна голова хорошо, а две во сто крат лучше. И постольку - поскольку я отнюдь не страдаю излишней самоуверенностью то решил обратится к коллективному разуму и узнать Ваше профессиональное мнение по поводу всей выше описанной затеи.
Имеется в ассортименте следующий код который по мнению пользователей портала dcms.su и моему мнению должен работать безукоризненно и совершенно безопасно не зависимо от ситуации и поставленных задач.
То есть, ниже описаная конструкция приведет к полной фильтрации с учетом экранирования всего лишнего?
<?php
		function escape_string($str)
		{
			if(is_numeric($str))
			 $str = (int)$str;
			else
			{
				$str = urldecode($str);
				if(preg_match('#\r\n|\r|\n#', $str))
				 $str = preg_replace('#\r\n|\r|\n#', ' ', $str);
				$str = addslashes(trim($str));
			}
			return $str;
		}
		$_GET = array_map('escape_string', $_GET);
		$_POST = array_map('escape_string', $_POST);
	?>
И в следующий код уже никак нельзя будет сделать SQl иньекцию?
<?php
		if($db -> query("INSERT INTO `tabla` (`id`, `name`) VALUES ('".$_POST['id']."', '".$_POST['name']) !== false)
		 print 'Запись осуществлена';
	?>

Я всем Вам безгранично за ранее благодарен. Помните, для меня мнение каждого из Вас драгоценно)

2. Момору (28.03.2013 / 16:57)
Никто не в курсе чель?

3. Владислав (28.03.2013 / 17:09)
2. JaKazanova, а зачем фильтровать строку через (int) если ты уже проверил число это или нет?
а второй велосипед можно заменить простым mysql_escape_string

Добавлено через 01:37 сек.
а, ну еще можно !== FALSE заменить на простую проверку вида if( ! $db->query("...

4. Михаил (28.03.2013 / 17:23)
Не далее чем вчера у меня неожиданно образовалась острая потребность фильтровать все полученные данные еще до открытия SQL соединения.
зачем?

Добавлено через 02:07 сек.
То есть, ниже описаная конструкция приведет к полной фильтрации с учетом экранирования всего лишнего?
Что именно и с какой целью ты хочешь экранировать, если у тебя нет подключения к базе, от чего защищаешься?

5. Момору (28.03.2013 / 18:22)
3. byvlad, спасибо, друг)
Первое как, говорится чтоб наверника)
Второе же, думаю большой роли не играет. Ведь и то, и другое в принципе проверка на одно и то же.
Важно твое конкретное мнение, слив оба представленных кода в один и проанализировав их как следует, можно ли с полной уверенностью сказать, что конструкция
		<?php
			if($db -> query("INSERT INTO `tabla` (`id`, `name`) VALUES ('".$_POST['id']."', '".$_POST['name']."')")
			 print 'Запись воспроизведена';
		?>
	
Будет полностью безопасна и не требует дополнительной фильтрации?
Именно это меня и интересует, а в синтаксических конструкциях я как нибудь разберусь сам) Волнует вопрос безопасности!
PS
За ранее благодарен

Добавлено через 01:49 сек.
4. Flyd, прочтите пост №1 внимательнее, будьте добры) Там все подробно описано и даже более чем. Спасибо

6. Александр (28.03.2013 / 18:52)
Это почему mysql_real_escape_string должна возвращать ошибку?, этой функции не нужно подключение к бд.

7. Момору (28.03.2013 / 19:07)
6. Муз-ТВ, Вы в этом полностю уверены? У меня сложилось совершенно противоположное мнение и оно к сожалению истинно ибо проверено на практике. Включите показ ошибок и Вы убедитесь в этом воочию

8. Виталий (28.03.2013 / 19:23)
http://www.php.su/functions/?mysql-escape-string посмотри сюда
функция идентична и не использует подключения

P.s. юзай pdo, он экранирует спец. символы автоматически

9. Владислав (29.03.2013 / 10:45)
6. Муз-ТВ, как раз таки _real требует подключения к БД, а обычный не требует.

Добавлено через 02:04 сек.
$_GET = array_map('mysql_escape_string', $_GET); 
$_POST = array_map('mysql_escape_string', $_POST);
если работать с великами, то этого будет достаточно)

Добавлено через 02:37 сек.
а вообще PDO решает все вопросы)

10. Михаил (29.03.2013 / 14:40)
JaKazanova (28 Марта 2013 / 18:22)
4. Flyd, прочтите пост №1 внимательнее, будьте добры) Там все подробно описано и даже более чем. Спасибо
В посте нет ответа на вопрос зачем фильтровать до подключения к базе

11. Петр (01.04.2013 / 05:46)
JaKazanova Первое что, мне пришло в голову это - addslashes(str) которая,аналогично mysql_real_escape_string() экранирует все, как двойные, так и одинарные кавычки. На ней и решил остановится.
Если ты используешь, кодировку UTF-8 или любую однобайтовую, то addslashes достаточно. Обычно, правда, цифровые параметры фильтруют отдельно, но, в принципе, можно все входные данные помещать в кавычки.

12. Вантуз-мен (01.04.2013 / 06:25)
mysql_escape_string устарела давно ее выпиливают из PHP
а так помимо обратного слеша есть куда более опасные символы которые могут не только привести к взлому путем sql инъекции (нулевой байт итд) но и поломать таблицу
насколько я знаю символы окончания строк и перевода кареток не опасны для mysql в отличии от sqlite

URL: https://visavi.net/topics/37292