C, PHP, VB, .NET

Дневникът на Филип Петров


Архив за ноември, 2008

* Предотвратяване на препълване на буфера

Публикувано на 30 ноември 2008 в раздел ОСУП.

Това е както един от трудните за реализиране проблеми, така и един от най-трудните за предотвратяване. Има няколко основни правила, които трябва да имаме предвид:

1. Не вярвайте на готовите библиотеки. Ето ви един непълен списък на вградени функции от С, които са доказано уязвими:
strcpy(), strcat(), printf(), sprintf(), vsprintf(), gets(), scanf(), fscanf(), sscanf(), vscanf(), vsscanf(), vfscanf(), realpath(), getopt(), getpass(), streadd(), strecpy(), strtrns() и др.
Ето ви и един eлементарен пример:

	char buf[10];
	gets(buf);

Въведете повече от 10 символа и ще видите неприятен резултат. Прочети още…

.

 


* Валидиране на типовете данни при SQL

Публикувано на 30 ноември 2008 в раздел ОСУП.

Дотук разгледахме най-често срещаният проблем, позволяващ вмъкване на нежелан SQL код – лошо филтриране на входните данни. Отбелязахме, че е по-добре да даваме множество от позволени стойности на входните данни, а не просто да забраняваме непозволените символи. За да обясним защо ще демонстрираме чрез пример, в който няма да използваме кавички при изпълнение на заявката. Нека например изпращаме следната заявка:

	$sql = "SELECT * FROM stats WHERE id=$id"

В случая полето с име „id“ е от тип int и поради тази причина не е нужно ограждането на стойността в кавички. Ако подадем например числото „5“ ще се генерира следната заявка към базата от данни: Прочети още…

.

 


* Вмъкване на нежелан SQL код

Публикувано на 29 ноември 2008 в раздел ОСУП.

Вмъкването на нежелан SQL код е уязвимост на приложението, при което атакуващият взима пълен или поне частичен контрол над базата данни на клиента. Почти при всички случаи това се дължи на не добре филтрирани входни данни или лош контрол върху множеството от стойности. Всъщност този пробив в сигурността е подмножество на една по-обширна тема, а именно филтриране на входните данни. Преди да започнем ще отбележим основното „лекарство“ за борба с тези атаки, а именно: никога не вярвайте на данни подадени от потребителя и винаги правете обстоятелствена проверка върху тях. Прочети още…

.

 


* Вектори (std::vector)

Публикувано на 29 ноември 2008 в раздел С/С++.

Досега се стараехме да не използваме готови библиотеки, класове и обекти. За шаблонният клас vector обаче си заслужава да се отдели специално внимание. Векторите са изключително удобен и ефективен заместител на стандартните масиви, като значително спестява ресурси при редица операции. Чрез него имаме възможност за създаване на т.нар. „динамични масиви“.

Първата стъпка е да прибавим класа чрез #include. Вектор се дефинира по следния начин:

#include <vector>
//...
std::vector<тип> v;

Синтаксисът изисква указване на типа елементи във вектора. Често е удобно да използваме typedef при дефиниране на вектори. Например: Прочети още…

.

 


* Шаблони

Публикувано на 29 ноември 2008 в раздел С/С++.

Шаблоните помагат когато искаме да напишем универсална функция, която да може да работи с всякакви типове данни. Синтаксисът е следния:

	template <class <име-на-класа>>;
	<декларация на функция>

Следният пример демонстрира как може да напишем една функция „max“ връщаща по-голямото от две числа, като може да ѝ подадем различни типове данни: Прочети още…

.

 


* Предефиниране на операции

Публикувано на 29 ноември 2008 в раздел С/С++.

В С++ всяка съществуваща унарна или бинарна операция, в която участва поне един обект от даден клас, може да бъде предефинирана от програмиста. Това дава възможност класовете да бъдат интерпретирани, като нови типове данни, които могат да се използват по начин аналогичен на базовите типове. Предефинирането на операции се осъществява чрез операторни функции. Операторната функция е член-функция или приятелска функция на класа, за който тя е дефинирана. Общата форма на една член-функция оператор е следната:

	<тип-резултат> <име-на-клас>::operator<#>(<аргументи>)
	{
		//изпълнявана операция
	}

Типът на връщания резултат най-често е същият като типа на класа, за който е дефиниран операторът. Операторът, който се предефинира, замества # в конструкцията. Когато една операторна член-функция предефинира бинарен оператор, функцията ще приема само един параметър. Този параметър ще получава обекта, който е от дясната страна на оператора. Обектът от лявата страна е този, който генерира обръщението към операторната функция и точно той се предавa неявно на функцията посредством указателя this. Прочети още…

.

 


* Namespace конструкции и нов стил header файлове

Публикувано на 28 ноември 2008 в раздел С/С++.

Namespace е конструкция за езика C++, която представлява разширение на познатите досега класове, а именно – един namespace може да съдържа в себе си набори от класове. По този начин от една страна се получава естествено обединение на обектите, които имат сходна функционалност, а от друга се решава един основен проблем в дизайна на програмите. Представете си, че имате два header файла, които искате да използвате:

	#include "header1.h"
	#include "header2.h"

Нека обаче в тези файлове се съдържат класове с повтарящи се имена: Прочети още…

.

 


* Колизия при hash алгоритмите

Публикувано на 21 ноември 2008 в раздел ОСУП.



* Добавяне на Salt към паролите

Публикувано на 21 ноември 2008 в раздел ОСУП.

Има два вида добавяне на salt към парола. Първия вид е залепването на допълнителен код към паролата и криптирането им заедно (като този код остава известен само и единствено в приложението). Това е популярно също като „глобален salt“. Ето какво би се получило след използването на изключително популярната за повечето англоговорящи потребители парола „password“:

<?php
	define(SALT, "fd321sfds%#%");

	function saltencrypt($password, $salt){
		return md5($salt.$password);
	}

	echo md5("password");
	echo "<br>";
	echo saltencrypt("password", SALT);
?>

Прочети още…

.

 


* Hash алгоритми за криптиране

Публикувано на 21 ноември 2008 в раздел ОСУП.

След като обяснихме ползата от криптиране на базата данни остана въпроса как е най-подходящо да го направим. Стандартно и най-често използвани са hash алгоритмите. Това са функции, които трансформират подаден текст само в едната посока (тоест веднъж криптиран не съществува възможност за съставяне на обратен алгоритъм). Най-важната черта за един hash алгоритъм е резултатът от него да изглежда колкото се може повече произволен (тоест да не можем да правим заключение за евентуалният вид на оригиналният текст по вида на криптирания вариант). С други думи двата символни низа „общината отново вдигна данък смет“ и „общината отново вдигна данъка смет“ би трябвало да дадат визуално напълно различни резултати след криптиране. Прочети още…

.