Рассылка закрыта
При закрытии подписчики были переданы в рассылку "Веб-разработка: пособие начинающим" на которую и рекомендуем вам подписаться.
Вы можете найти рассылки сходной тематики в Каталоге рассылок.
← Октябрь 2005 → | ||||||
2
|
||||||
---|---|---|---|---|---|---|
3
|
4
|
5
|
6
|
7
|
9
|
|
11
|
12
|
13
|
15
|
16
|
||
17
|
18
|
19
|
20
|
21
|
22
|
23
|
24
|
25
|
26
|
27
|
28
|
29
|
30
|
31
|
Автор
Статистика
989 подписчиков
0 за неделю
0 за неделю
KLSoft company - программирование в Delphi и PHP
Информационный Канал Subscribe.Ru |
![]() |
Навигация по сайту |
[Новости] [Скачать] [Сделать заказ] [Добавить сайт в каталог] [Архив рассылки - 55 номера] |
Навигация по рассылке |
[Читать и писать в COM порты] [Создание виртуального диска] [Сокрытие PHP] [Защита] [Humor] |
Новости |
Внимание!!!
Совершенно неповторимая акция!!! Теперь вы можете добавить свой сайт в наш каталог совершенно безвозмездно!!!(Вам не нужно размещать ссылку на своём сайте). Торопитесь, акция длиться только до 20 октября! |
Читать и писать в COM порты |
unit Unit1; interface uses Windows; type TComPort = class private hFile: THandle; public constructor Create; destructor Destroy; override; function InitCom(BaudRate, PortNo: Integer; Parity: Char; CommTimeOuts: TCommTimeouts): Boolean; procedure CloseCom; function ReceiveCom(var Buffer; Size: DWORD): Integer; function SendCom(var Buffer; Size: DWORD): Integer; function ClearInputCom: Boolean; end; implementation uses SysUtils; constructor TComPort.Create; begin inherited; CloseCom; end; destructor TComPort.Destroy; begin CloseCom; inherited; end; function TComPort.InitCom(BaudRate, PortNo: Integer; Parity: Char; CommTimeOuts: TCommTimeouts): Boolean; var FileName: string; DCB: TDCB; PortParam: string; begin result := FALSE; FileName := 'Com' + IntToStr(PortNo); {имя файла} hFile := CreateFile(PChar(FileName), GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); if hFile = INVALID_HANDLE_VALUE then exit; //установка требуемых параметров GetCommState(hFile, DCB); //чтение текущих параметров порта PortParam := 'baud=' + IntToStr(BaudRate) + ' parity=' + Parity + ' data=8 stop=1 ' + 'octs=off'; if BuildCommDCB(PChar(PortParam), DCB) then begin result := SetCommState(hFile, DCB) and SetCommTimeouts(hFile, CommTimeOuts); end; if not result then CloseCom; end; procedure TComPort.CloseCom; begin if hFile < > INVALID_HANDLE_VALUE then CloseHandle(hFile); hFile := INVALID_HANDLE_VALUE; end; function TComPort.ReceiveCom(var Buffer; Size: DWORD): Integer; var Received: DWORD; begin if hFile = INVALID_HANDLE_VALUE then raise Exception.Create('Не открыта запись в Com порт'); if ReadFile(hFile, Buffer, Size, Received, nil) then begin Result := Received; end else raise Exception.Create('Ошибка приема данных: ' + IntToStr(GetLastError)); end; function TComPort.SendCom(var Buffer; Size: DWORD): Integer; var Sended: DWORD; begin if hFile = INVALID_HANDLE_VALUE then raise Exception.Create('Не открыта запись в Com порт'); if WriteFile(hFile, Buffer, Size, Sended, nil) then begin Result := Sended; end else raise Exception.Create('Ошибка передачи данных: ' + IntToStr(GetLastError)); end; function TComPort.ClearInputCom: Boolean; begin if hFile = INVALID_HANDLE_VALUE then raise Exception.Create('Не открыта запись в Com порт'); Result := PurgeComm(hFile, PURGE_RXCLEAR); end; end. |
Создание виртуального диска |
{ ... } if DefineDosDevice(DDD_RAW_TARGET_PATH, 'P:', 'F:\Backup\Music\Modules') then ShowMessage('Drive was created successfully') else ShowMessage('Error creating drive"); { ... } |
Сокрытие PHP |
В общем случае внесение неясности ненамного улучшает защищенность системы. Но бывают случаи, когда следует использовать малейшую возможность. Несколько несложных методик могут помочь вам скрыть PHP, что усложняет работу потенциального взломщика, который пытается найти брешь в вашей системе. Установив опцию expose_php = off в конфигурационном файле php.ini, вы уменьшите количество доступной хакеру информации. Еще одна методика заключается в настройке веб-сервера таким образом, чтобы он обрабатывал файлы с различными расширениями как PHP-скрипты. Это можно указать как в .htaccess файлах, так и конфигурационном файле Apache. В таком случае вы сможете использовать при написании кода нестандартные расширения: Пример 32-1. Маскировка PHP под другие языки программирования # Теперь PHP-скрипты могут иметь те же расширения, что и другие языки программирования AddType application/x-httpd-php .asp .py .pl Или скрыть его совсем: Пример 32-2. Использование неизвестных расширений для PHP-скриптов # Теперь PHP-скрипты могут иметь неизвестные типы файлов AddType application/x-httpd-php .bop .foo .133t Также можно спрятать его под видом HTML-кода, что приведет к потере производительности, так как все HTML файлы будут обрабатываться как PHP-код: Пример 32-3. Маскировка PHP-кода под html-файлы # Теперь PHP-скртпы могут выглядеть как обыкновенный HTML AddType application/x-httpd-php .htm .html Чтобы достичь желаемого эффекта, вы должны переименовать все ваши скрипты в соответствии с выбранным вами расширением. Описанное в этом разделе документации повышение безопасности через сокрытие PHP имеет мало недостатков при небольших затратах. |
Защита |
Введение Задача такова: ограничить доступ на страницу. Уровней доступа может быть несколько. Также надо учитывать возможность временного доступа с любым заданным уровнем доступа. Допустим, что у нас существует 4 уровня доступа: 1 - Незарегистрированный пользователь. Может просматривать некоторые разделы. 2 - Зарегистрированный пользователь. Может просматривать закрытые разделы сайта, кроме служебных. 3 - Редактор сайта. Может просматривать всю информацию о себе, все информационные страницы и редактировать их. 4 - Администратор. Доступ ко всем разделам сайта, в том числе спискам пользователей, и терминалом, управляющим MySQL (phpMyAdmin, KSF MySQLAdmin и т.д.) Любой уровень предполагает полномочия предыдущих уровней. Например, Администратор может редактировать статьи и просматривать закрытые разделы сайта. Уровень доступа также должен проверяться не только на первой странице, но и на любой другой закрытой странице, открытой по ссылке или набранной в адресной строке браузера. Вызов функции аутентификации Для начала напишем функцию, которая выводит на экран форму запроса пароля: <?php function EchoPassForm($reason = -1) { switch($reason) { case -1: $message = 'Закрытый раздел. Введите пароль'; break; case -2: $message = 'Такого пользователя нет или срок его действия истек'; break; case -3: $message = 'Введен неверный пароль'; break; default: $message = 'Недостаточно прав для просмотра страницы. Обратитесь к администратору'; } echo "<p>".$message."</p>"; if($_POST['login']) $login = $_POST['login']; else $login = ''; echo "<CENTER>\n"; echo "<FORM action='".$_SERVER['PHP_SELF']."' method=post>\n"; echo " <TABLE>\n"; echo " <TR>\n"; echo " <TD>Логин:</TD>\n"; echo " <TD><INPUT type=text name=login value='".$login."'></TD>\n"; echo " </TR>\n"; echo " <TR>\n"; echo " <TD>Пароль:</TD>\n"; echo " <TD><INPUT type=password name=pass></TD>\n"; echo " </TR>\n"; echo " </TABLE>\n\n"; echo " <BR>\n<INPUT type=submit value='Зарегистрироваться'>\n\n"; echo "</FORM>\n"; echo "</CENTER>\n"; } // function EchoPassForm() ?> Теперь напишем функцию, которая будет возвращать код ошибки. Если данные не введены, то она будет возвращать -1, если пользователя в системе не существует или срок его действия истек, то функция будет возвращать -2, если пользователь существует а пароль введен неверно, то функция возвращает -3. Если и логин, и пароль введены верно, то функция должна возвращать уровень доступа пользователя. Кроме того, функция должна определять ранее авторизованного пользователя (в пределах сессии, конечно) и не спрашивать пароль, а возвращать уже присвоенный уровень доступа. Также в функции должен быть реализован выход из системы, когда все данные о сессии пользователя уничтожаются и любой пользователь с компьютера не мог попасть на закрытые страницы без повторного ввода пароля. В последнем случае ситуация должна возвращаться в начало работы с системой, когда пароль еще не введен, поэтому код возврата будет равен -1 (не авторизован). Вот эта функция: <?php function LoadAccess() { // Начинаем или возобновляем сессию session_start(); // Выход из закрытого раздела if($_GET['action'] == 'logout') { $_SESSION = array(); session_destroy(); } // Не введено имя пользователя или пароль if(!@$_POST['pass'] || !@$_POST['login']) return -1; $pass = md5(Trim($_POST['pass'])); // Уровень доступа был присвоен ранее if(isset($_SESSION['AccessLevel'])) { return $_SESSION['AccessLevel']; } else { // Получить уровень доступа пользователя $level = GetAccessLevel($_POST['login'],$pass); if($level > 0) { // Запомнить уровень доступа $_SESSION['AccessLevel'] = $level; } return $level; } } // function LoadAccess() ?> Сначала мы объявляем переменные, которые будут видны до вызова функции, но остаются неизвестными для внутри самой функции. После этого мы начинаем сессию, которая будет отличать одного посетителя сайта от другого. Эта строка обязательна для каждого скрипта на сайте, который относится к закрытым разделам. Если после ввода пароля вы попадаете на страницу, где сессия не возобновляется (той же функцией session_start()), а затем перейдете на страницу, где будет требоваться пройденная авторизация, то сервер будет считать вас новым посетителем и заново попросит пароль. Данные сессии хранятся в куках браузера посетителя. Если это невозможно (например, они отключены), то данные об идентификаторе сессии будут передаваться через ссылки. К параметрам скрипта добавляется новый (по умолчанию это PHPSESSID). Перезаписываются атрибуты тегов <a>, <form>,<area>,<frame>,<input>. Следующая строка возвращает код -1, если не введены либо логин, либо пароль, либо и то, и другое. Событие происходит, когда форма заполнена не полностью или когда посетитель в первый раз загружает страницу. Далее мы преобразовываем пароль - обрезаем пробельные символы с начала и с конца, а потом получаем хеш-функцию для пароля. Хеш-функция строки - набор символов, по которому нельзя восстановить исходную строку. Для одной и той же строки всегда будет и одна хеш-функция. Эти свойства позволяют хранить не пароль, а его хеш-функцию. И сравниваться при авторизации будут уже две хеш-функции, а не пароль и введенная строка. Пример хеш-функции для строки "123": 202cb962ac59075b964b07152d234b70. Следующий участок скрипта отвечает за удаление всех данных сессии. Сначала уничтожаются все переменные, которые были определены за время сессии, а потом уничтожается и сама сессия. Следующий цикл проверяет, существует ли в переменная сессии $_SESSION['AccessLevel']. Если пользователь уже прошел авторизацию, которая завершилась успехом, то есть уже получен ранее уровень доступа, возвращается этот уровень доступа. Хранить пароль уже нет надобности. В последнем участке функции мы определяем уровень доступа пользователя и правильность введенного пароля. Если уровень доступа положительный, то мы регистрируем новую переменную в сессии (AccessLevel) и возвращаем уровень доступа. До этого момента не имело значения, где и как хранится пароль, уровни доступа и время действия аккаунта. Теперь посмотрим различные варианты функции GetAccessLevel(), которая проверяет пароль и устанавливает уровень доступа. Пароль может храниться различным способом (в тексте скрипта, в файле и в базе данных). Первый способ подходит для простых ситуаций, когда необходим один пароль и два уровня доступа (общий и служебный). В файлах могут храниться пароли, когда это по каким-то причинам нельзя использовать базу данных. А самым удобным и функциональным является хранение паролей в базах данных. Сначала функция для случая, когда пароль хранится в скрипте: <?php function GetAccessLevel($login,$pass) { if(Trim($login) == 'test') { if($pass == '202cb962ac59075b964b07152d234b70') return 4; else return -3; } return -2; } // function GetAccessLevel($login,$pass) ?> Хранение паролей в файлах Теперь функция для случая, когда пароли хранятся в файлах: <?php function GetAccessLevelFromFile($login,$pass) { $filename = "pass/".$login.".pwd"; if(file_exists($filename) === true) { list($level,$true_pass) = file($filename) or die("Can't read password file!"); if($pass == $true_pass) return $level; else return -3; } return -2; } // function GetAccessLevelFromFile($login,$pass) ?> Предполагается, что для каждого пользователя существует свой файл пароля, где первая строка - уровень доступа пользователя, а вторая - хеш-функция его пароля. Хранение паролей в MySQL И, наконец, функция для случая, когда пароли хранятся в базе данных MySQL (для других БД функция практически не отличается и перестраивается с минимальными изменениями): <?php function GetAccessLevelFromMySQL($login,$pass) { // Соединяемся с БД $dbh = mysql_connect("127.0.0.1","admin","123"); $query = "SELECT pass,level FROM users WHERE user=$login"; // Посылаем запрос $result = mysql_query($query); // Узнаем количество записей, // Подходящих под запрос $rows = mysql_num_rows($result); // Получаем зашифрованный эталонный пароль // и уровень доступа для этого пользователя list($true_pass,$level) = mysql_fetch_row($result); // Освобождаем память, // занятую под запрос mysql_free_result($result); // Отсоединяемся от БД mysql_close($dbh); if($rows > 0) { if($pass == $true_pass) return $level; else return -3; } return -2; } // function GetAccessLevelFromMySQL($login,$pass) ?> Применение Осталось применить написанные функции. Написанные выше функции будут вызываться с каждой страницы, требующей авторизации, а это значит, что код должен быть вынесен в отдельный файл. Назовем его auth.inc. Применение будет таким: <?php require "auth.inc"; if(@$_POST['login']) $login = $_POST['login']; else $login = ''; $page_level = 3; $user_level = LoadAccess(); ?> <html> <head> <style> a { font-family: tahoma; font-size: x-small; color: #009900; } p { font-weight: bold; font-size: x-small; font-family: tahoma; text-align:center; } </style> </head> <body> <br><br> <?php if($user_level >= $page_level) { echo "<p>Вы допущены на закрытую страницу. Ваш уровень доступа:</ p>"; echo "<p><span style='color: #990000;'>".$_SESSION['AccessLevel']."</span></p>"; echo "<p><a href=\"".$_SERVER['PHP_SELF']."?action=logout\">Завершить сессию</a></p>"; } else EchoPassForm($user_level); ?> Не забывайте, что сессию можно начать только ДО вывода в браузер. Поэтому функцию LoadAccess() вызывайте тоже ДО любого вывода в браузер. Например, такой код работать не будет: ><html> <body> <br><br> <?php // ... $user_level = LoadAccess(); if($user_level >= $page_level) { // ... } ?> </body> </html> Здесь теги <html>,<body> и <br><br> выводятся в браузер, а затем в функции LoadAccess() пытается начаться сессия. В результате такое предупреждение: Warning: session_start(): Cannot send session cookie - headers already sent by <...> Сессия при этом начата не будет. Если предупреждение возникает, а явной ошибки нет, то проверьте, есть ли пробельные символы вне <?php ?> до начала сессии (в том числе в подключаемых файлах). |
Humor |
Не до смеха мне...
Хотите увидеть здесь свои анекдоты или историю из жизни? Если да то пишите и отправляёте! Так же через эту форму Вы можете отправлять нам свои вопросы, пожелания, замечания и т.п. |
Subscribe.Ru
Поддержка подписчиков Другие рассылки этой тематики Другие рассылки этого автора |
Подписан адрес:
Код этой рассылки: comp.soft.prog.program Архив рассылки |
Отписаться
Вспомнить пароль |
В избранное | ||