Обрабокта переменных - как делать не надо

pilot911

Новичок
делай так




PHP:
	function addSlashesOnArray(&$theArray)	{
		if (is_array($theArray))	{
			reset($theArray);
			while(list($Akey,$AVal)=each($theArray))	{
				if (is_array($AVal))	{
					addSlashesOnArray($theArray[$Akey]);
				} else {
					$theArray[$Akey] = addslashes($AVal);
				}
			}
			reset($theArray);
		}
	}


	if (!get_magic_quotes_gpc())	{
 		addSlashesOnArray($_GET);
		addSlashesOnArray($_POST);
	}
 

HraKK

Мудак
Команда форума
TC никогда не далай так.
pilot911
Прочитайте пост выше. К вам он тоже теперь относится.
 

pilot911

Новичок
Автор оригинала: HraKK
TC никогда не далай так.
pilot911
Прочитайте пост выше. К вам он тоже теперь относится.
я делаю так - по-первых, слешую все входящие данные через

PHP:
addSlashesOnArray(&$theArray)
во-вторых в каждом запросе все, что не подпадает под intval() пропускаю через

PHP:
function fullQuoteStr($str)	{
         return sprintf("'%s'", mysql_escape_string($str));
}
 

HraKK

Мудак
Команда форума
Ну что тут сказать, гений. Делаешь, хорошо, только других дурному не учу плз. ок?
 

pilot911

Новичок
ну а в чем разница. брать ли поля в кавычки или вот так заключать строки в кавычки ?


function fullQuoteStr($str) {
return sprintf("'%s'", mysql_escape_string($str));
}

?
 

dimagolov

Новичок
pilot911, разница в том, что слешовать от нефиг делать входящее не нужно. нужно наоборот удалять слеши если стоит magic_quotes_gpc, чтобы эти лишние слеши не мешали в дальнейшем.
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Черт. Восемь пулевых ранений в голову, мозг не задет.
Очевиднее и понятнее примера, что ***** процитировал, имхо, подобрать нельзя. Однако, похоже некоторые умеют читать, но забывают осмыслить прочитанное....
 

fixxxer

К.О.
Партнер клуба
давайте я угадаю - а при чтении из базы stripslashes? ага? я же угадал? правда?
 

pilot911

Новичок
значит слешить входящие геты и посты нет необходимости

просто используем fullQuoteStr в запросах для строковых полей и значений, не прошедших intval() и floatval() ?
 

dimagolov

Новичок
pilot911, а ты потом из базы на страничку что-то выводишь?

п.с. вообще ***** дал замечательный текст, его просто понять и осознать надо.
 

fixxxer

К.О.
Партнер клуба
pilot911
с таким же успехом можно например делать всему gpc base64_encode, а при извлечении из базы base64_decode. ;) необходимость - такая же.

нет никаких "опасных символов", вот текст выше хороший, я попробую по другому объяснить.
плохих или хороших данных не бывает. фамилия Д'Артаньян ничем не хуже фамилии Иванов.
все проблемы от несоблюдения синтаксиса.

простой пример.
файлы /etc/passwd в unix системах хранят учетные записи пользователей, в виде полей разделенных символом двоеточия.
получается, что двоеточие воспринимается не как часть данных, а как управляющий символ.
все хорошо, но что делать если в имени пользователя двоеточие?
для этого придумали ставить перед служебными символами обратный слэш. то есть сам обратный слэш является особым спецсимволом, который указывает, что следующий за ним символ - не служебный.
очень простой и эффективный подход всего с одним частным случаем (в отличие от идиотического виндового csv с кавычками, где их множество, ну это я так).
теперь берем sql. sql это грубо говоря тоже набор управляющих инструкций и данных, записанных в особом синтаксисе. и тут все то же самое.
и абсолютно все injection-атаки основаны на том, что строятся данные, часть которых будет воспринята как управляющие инструкции.
соблюдай синтаксис - и не будет проблем.
 

dimagolov

Новичок
дополню. html это тоже набор инструкций для броузера. и чтобы не нажить проблем всего то нужно следить, чтобы данные, которые выводятся не были восприняты как управляющие символы.
 

pilot911

Новичок
со всем согласен, но на конкретном примере, достаточно ли будет все значения строковых полей (все, что не обработано intval() ) обертывать вот этой функцией

PHP:
function fullQuoteStr($str) {
     return sprintf("'%s'", mysql_escape_string($str));
}
или недостаточно ?
 

fixxxer

К.О.
Партнер клуба
не надо значения полей обертывать от нефиг делать
надо правильно составлять sql запросы

$query = "select * from Table where name=" . fullQuoteStr($_GET['name']);
mysql_query($query)

так - нормально. опять же есть особые случаи. like, limit/offset. всегда надо включать голову.
 

Фанат

oncle terrible
Команда форума
Там у Cеленита еще ссылочка была, http://phpfaq.ru/slashes =)

а жалко что товарищ так быстро сдался...
addSlashesOnArray, да еще мэджик квотес, да еще пару раз отредактировать любой текстик... вот была бы лепота! =)
 

fixxxer

К.О.
Партнер клуба
мне все таки кажется что там был стрипслэшес, и у него все работало =)
 
Сверху