Въпроси за сигурността:примери, начини на защита

Аз пък все си мисля, че ако има 1 поленце, което да взима time() в момента, в който е регистриран потребителя ще свърши доста полезна работа Smile

Примерно кодче:

<?php
$username = "t0m3kk"; //Потребителското име
$password = "web-tourist"; //Паролата, която въвежда потребителя
$regtime = "1278776019"; //Момента, в който избрах да извърша теста!
$pass = md5($regtime.$username.$password);

echo $pass;
?>



Даже си мисля, че и това би свършило работа... примерно:

<?php
$user = substr("t0m3kk", 1, -1);
$pass = substr("web-tourist", 2, -2);
$pass = md5($user.$pass);
echo "$pass";
?>




като по всяко време може да се добави и нещо от сорта на...


$host = explode(".", $_SERVER['SERVER_ADDR']);
$pass = md5($host[0].$user.$host[1].$pass.$host[2]);




Просто не виждам смисъл какво толкова се притеснявате как да хеширате паролите си Smile Нещо такова (особенно като това последното) би отказало доста голяма част от "хакерите" Smile

като ако искате да ползвате $host[3] може да си добавите примерно още нещо, за да ви стане от сорта на:

$pass = md5($host[0].$user.$host[1].$pass.$host[2].$something.$host[3]);



Общо взето ще го върне в първи клас даже може и в предучилищната освен ако не знае начина ви на криптиране Smile
BruteForce FTP = Epic Fail :) [/code]
 
bloods33ker каза:
Ето ти пример за защитена страница.
Код:
<?php
	function security_start_session($ssl, $timeout, $maxtime, $ip){
		// ... security checks
		session_start();
		session_regenerate_id(true);
		return 1;
	}
	if (security_start_session(0, 6*60, 20*60, 1) != 1){
		echo "<br>session destroyed!";
		return;
	}
?>
<html>
<head>
	<title>WorldBank.dom XSRF protected page</title>
</head>
<body>
<?php
	if( isset($_REQUEST['submit'])){
		if ($_SESSION['token']!=$_POST['token'] || !isset($_SESSION['token'] || !isset($_POST['token'])){
			session_unset();
			session_destroy();
			echo "Invalid session</body></html>";
			return;
		}
		else{
			echo 'Form is submitted';
		}
	}
	else{
		echo '<form action="xsrf.php" method="POST">';
		$_SESSION['token'] = uniqid(rand(), true);
		echo '<input type="hidden" name="token" value="'.$_SESSION['token'].'">';
		echo '<input type="submit" name="submit">';
		echo '</form><br><br><br>';
	}
?>
</body></html>


Тук се използва потребителска сесия ,което се прави в помечето случай
виж токените,от там сме сигурни ,че формата е изпълнена на нашия съврър.
Иначе
<?php
if( isset($_REQUEST['submit'])){
echo 'Form is submitted';
}
else {
echo '<form action="xsrf.php" method="POST">';
echo '<input type="submit" name="submit">';
echo '</form><br><br><br>';
}
?>

Това е незащитената форма.
Ако напишем
Код:
<form action="saita ti/xsrf.php" method="POST">
<input type="submit" name="submit">
</form>
и го изпълним на друг сървър формата пак ще бъде изпратена.


Другият начин е чрез „$_SERVER['HTTP_REFERER']„.
От там проверяваме от къде е дошла заявката..
Код:
if (isset($_SERVER['HTTP_REFERER'] && $_SERVER['HTTP_REFERER']!="http://worldbank.dom/xsrf.php"){
				echo 'You are redirected by third party form - probably you are a XSRF attack victim!';
				return;
			}

Междудругото с проверка за HTTP_REFERER изобщо не е сигурно, защото всички данни, които идват от HTTP могат да бъдат манипулирани. Горният вариант е по-удачен.
 
Ето нещо просто което ме изненада, че не сте споменали.

SQL Injection.

Да речем имаме променливата - $username в която потребителя е въвел стойност която застрашава нашата база данни.

Лесен начин да се избегне това е например:

Код:
$sql = "INSERT INTO table (1, 2, 3) VALUES (1,2,3)";

$sql = mysql_real_escape_string($sql);

mysql_query($sql);

:)
 
qazxsw каза:
Ето нещо просто което ме изненада, че не сте споменали.

SQL Injection.

Да речем имаме променливата - $username в която потребителя е въвел стойност която застрашава нашата база данни.

Лесен начин да се избегне това е например:

Код:
$sql = "INSERT INTO table (1, 2, 3) VALUES (1,2,3)";

$sql = mysql_real_escape_string($sql);

mysql_query($sql);

:)

И ако в заявката ти трябва да има кавичка какво правим?
 
Това не е никаква защита. Срещу SQL Injection се предпазваш с prepared statements, като ползваш mysqli модула или като филтрираш всички входящи променливи от POST, GET, REQUEST (ако изобщо това последното искаш да го ползваш). 8)
 
StormBreaker каза:
qazxsw каза:
Ето нещо просто което ме изненада, че не сте споменали.

SQL Injection.

Да речем имаме променливата - $username в която потребителя е въвел стойност която застрашава нашата база данни.

Лесен начин да се избегне това е например:

Код:
$sql = "INSERT INTO table (1, 2, 3) VALUES (1,2,3)";

$sql = mysql_real_escape_string($sql);

mysql_query($sql);

:)

И ако в заявката ти трябва да има кавичка какво правим?

То кавичката си я има просто слага \ пред нея. :)
http://www.tizag.com/mysqlTutorial/mysql-php-sql-injection.php
 
Искам да попитам за един мой опит с кода за атака при RFI, който е дал raiden на първа страница. При мен резултата е Object not found! Error 404

Защо става така, аз написах неговия код в един файл с текстовото поле и след него сложих въпросния код.
 
Опа обърках тотално кода, забравих config.php, но сега след като оправих всичко и ги написах в два отделни файла ми дава: Warning: mysql_connect() [function.mysql-connect]: Can't connect to MySQL server on 'localhost' (10061) in C:\Program Files\xampp\htdocs\opiti\config.php on line 2
Could not connect: Can't connect to MySQL server on 'localhost' (10061)
 
Аз пък ползвам тази функция за слаш

Код:
function addslashall()
{
    if(!get_magic_quotes_gpc()){
        foreach ($_POST as $key=>$value) {
            if (is_array($value)) {
                foreach ($value as $key2=>$value2) {
                    $_POST[$key][$key2] = addslashes(htmlspecialchars($value2));
                }
            } 
            else {
                $_POST[$key] = addslashes(htmlspecialchars($value));
            }
        }

        foreach ($_GET as $key=>$value) {
            $_GET[$key] = addslashes(htmlspecialchars($value));
        }
    }
}

Викам си я където ми трябва и готово. За SQL си ползвам sprintf() и всичко си ми е наред.

Където има ID в заявката просто използвам %d в sprintf() , така директно си проверявам дали е число или не. Ако не е число връща 0.
Ето ви пример...
Ако например query string-a е
Код:
?query=1'<h2>XSS</h2>

то sprintf си взима само 1. Всичко за тази единица я пропуска и си връщя 1.(това, когато сме задали %d )
Ако стринга обаче е...
Код:
?query=<h2>XSS</h2>1

то тогава връща 0. Когато обаче подавате буквен стринг то тогава ще трябва да се escape-ва. За целта, аз си викам функцията най-отгоре и си предавам методите преспокойно към заявката.
 
Eто още 1 пример-фнкция как да се предпазим от атаки с входните данни:
Код:
public function protect($string)
    {
        if(get_magic_quotes_gpc())//Ако magic quotes са включени
        {
            $string = stripslashes($string);
        }
        elseif(!get_magic_quotes_gpc())//Ако не
        {
            $string = addslashes(trim($string));;

            $string = escapeshellcmd($string);//Премахваме всички SHELL команди

            $string = mysql_real_escape_string($string);//Спираме повечето MySQL инжекции

            $string = stripslashes(strip_tags(htmlspecialchars($string, ENT_QUOTES)));//Премахваме XHTML и кавичките
        }
        return $string;
    }[quote][/quote]
 
IzKuFeLiQqQqQ каза:
а някой ще ми каже ли как да защитя с парола дадена папка (директория)
Слагаш един .htaccess файл в папката която искаш да защитиш (той ще важи и за всички подпапки на съответната папка), със следното съдържание:
Код:
AuthUserFile [път до .htpasswd файла]
AuthGroupFile /dev/null
AuthName [някакво съобщение]
AuthType Basic

require valid-user

след това си създаваш и един .htpasswd файл който съдържа на отделни редове потребители и пароли в следния формат:
Код:
potrebitel1:[kriptirana_parola]
potrebitel2:[kriptirana_parola]
тези редове можеш да си ги генерираш от тук: http://www.htaccesstools.com/htpasswd-generator/

Качваш така направения .htpasswd файл някъде на сървъра, но на място недостъпно през http и задаваш пътя до него в .htaccess файла който направи преди това. Това е :)
 
Ето какво ползвам аз:

Код:
	public function mysql_prep ($value ) {
	$magic_quotes_active = get_magic_quotes_gpc();
	$new_enough_php = function_exists( "mysql_real_escape_string" );
	if( $new_enough_php ) {
	if( $magic_quotes_active ) { $value = stripslashes ( $value ); }
	$value = mysql_real_escape_string( $value );}
	else{
	if( !$magic_quotes_active ) { $value = addslashes( $value );}
	exit;}
	return $value;
	}
 
Не се обиждай, ама ти е много смешно написан кода.
Ползвай директно функциите, не чрез променливи ;)
 
relax15pyt каза:
Не се обиждай, ама ти е много смешно написан кода.
Ползвай директно функциите, не чрез променливи ;)

Не се обиждам, просто такъв ми е стилът на програмиране :?:
Всеки програмист с различен стил :)
 

Back
Горе