[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Помощь. Взлом через форму
b11tdb
Вот у меня есть скрипты:
Логин -
<?
session_start();

if($_POST['username'] == $_POST['username'])
{
$_SESSION["login"] = "YES";
$_SESSION["username"] = $_POST['username'];
echo '<meta http-equiv="refresh" content="0;URL=/learning.php">';
}
else
{
$_SESSION["login"] = "NO";
echo '<meta http-equiv="refresh" content="0;URL=/index.php">';
}
?>

И индекс -
<?
session_start();
if($_SESSION["login"] != "YES")
{
echo '<center><form action="login.php" method="post">
Ваше имя: <input type="text" name="username" />
<input type="submit" />
</form></center><br />'
;
echo '<center>Представившись нам, вы получите полный доступ к информации, находящейся на сайте.<br>Советуем вам указать свое настоящее имя, для удобства приветсвия вас на сайте.</center>';
}
else {
echo '<meta http-equiv="refresh" content="0;URL=/learning.php">';
}
?>

Через форму, вводя ';echo 123; слетает сайт не на долго, как мне сделать экранирование символов для моих скриптов?
Я новичок!
Игорь_Vasinsky
Цитата
if($_POST['username'] == $_POST['username'])

а есть сомнения?



_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
b11tdb
Цитата (Игорь_Vasinsky @ 5.03.2013 - 19:44)
Цитата
if($_POST['username'] == $_POST['username'])

а есть сомнения?

Понимаете, я просто в php 2 день, как мне защититься от такого метода, мне даже показали, что они через Google Chrome меняли в форме метод ПОСТ на ГЕТ и писали ту фигню с echo, что мне сделать чтобы защититься?
Игорь_Vasinsky
чтобы сравнивать что то с данными из формы - это должно где то храниться (логин и пароль)

Вы где храните? в файле или базе данных?

щас нарисуем. просто мало данных для анализа.

_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
b11tdb
Цитата (Игорь_Vasinsky @ 5.03.2013 - 20:02)
чтобы сравнивать что то с данными из формы - это должно где то храниться (логин и пароль)

Вы где храните? в файле или базе данных?

щас нарисуем. просто мало данных для анализа.

Давай сделаем через TXT файл, мне не надо пароль, только логин больше ничего
Вот сайт если что, посмотрите - Сайт
Игорь_Vasinsky
смотри - как сделаем:

мы не будем хранить логин в открытом виде, мы его зашифруем и запишем в файл. При этом не просто зашифруем - а смешаем его с секретным словом.

Сделаем это для того - чтобы если злоумышленник если даже сможет посмотреть файл - то он не увидит реальный логин.

файл с логином назовём users.db, например

итак для шифрования используем штатную функцию php sha1()

логин: admin_user
секретное слово (в народе - соль/salt): secure

//Это просто чтоб посмотреть что получилось
$login = 'admin_user';
$salt = 'secure';
echo sha1($login.$salt); //Внутри просто склеили 2 переменных

получим строку (хеш в 41 символ): 5dea6b50f7cb5c1d41ba593da631058f3804914b

запишем его в файл users.db

Теперь форма авторизации

<form method="POST" action="">
<
input type="text" name="login"/>
<
input type="submit" name="enter" value="Войти"/>
</
form>


Обработчик (его можно разместить прямо над кодом формы - при условии что файл с php расширением)

<?php
//Когда будет нажата кнопка входа - суперглобальный массив POST
//наполнится значениями с полей (+кнопки) формы

//Проверим - была ли нажата кнопка входа

if(isset($_POST['enter'])){
//Если нажата - то далее проверяем наш логин с формы с хешем из файла
//Прочитаем наш файл в массив

$db = file("users.db");
//Так как у нас в файле тока одна строчка - то мы будем использовать
//только первый элемент массива $db[0]
//При этом как ты помнишь - строчка формировалась при помощью sha1() + salt
//С помощью тернарного оператора получили данные с поля логина из формы
//Тернарный оператор - заменяет нам if else

$login = !empty($_POST['login']) ? $_POST['login'] : null;
$salt = 'secure';

//Получили хеш - создали его из логина из формы и соли
$hash = sha1($login.$salt);

//Сравнили хеш из файла и хешь из формы
if($db[0] == $hash){
echo 'Добро пожаловать!';
//Запись в сессию и всё остальное
}
else{
echo 'Пользователь не найден';
}
}

?>



вот и всё. но только для авторизации рекомендуется использовать и логин и пароль

Полный листинг

<?php
//Когда будет нажата кнопка входа - суперглобальный массив POST
//наполнится значениями с полей (+кнопки) формы

//Проверим - была ли нажата кнопка входа

if(isset($_POST['enter'])){
//Если нажата - то далее проверяем наш логин с формы с хешем из файла
//Прочитаем наш файл в массив

$db = file("users.db");
//Так как у нас в файле тока одна строчка - то мы будем использовать
//только первый элемент массива $db[0]
//При этом как ты помнишь - строчка формировалась при помощью sha1() + salt
//С помощью тернарного оператора получили данные с поля логина из формы
//Тернарный оператор - заменяет нам if else

$login = !empty($_POST['login']) ? $_POST['login'] : null;
$salt = 'secure';

//Получили хеш - создали его из логина из формы и соли
$hash = sha1($login.$salt);

//Сравнили хеш из файла и хешь из формы
if($db[0] == $hash){
echo 'Добро пожаловать!';
//Запись в сессию и всё остальное
}
else{
echo 'Пользователь не найден';
}
}

?>

<form method="POST" action="">
<
input type="text" name="login"/>
<
input type="submit" name="enter" value="Войти"/>
</
form>


_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.