Выбрать главу

Например, допустим, что мы добавляем нового пользователя joe с паролем knife. В результате этого действия веб-сервер передаст сценарию следующее значение в переменной QUERY_STRING:

a=A&u=joe&p=knife

Сценарий развернет эту строку, запишет в переменную action символ A, в переменную user имя joe и в переменную pass строку knife. Затем убедится, в строке , что пароль содержит только допустимые алфавитные символы.

В заключение, если все прошло успешно, будет вызвана программа htpasswd, чтобы зашифровать пароль и добавить его в файл .htpasswd . Также этот сценарий создает HTML-таблицу, в которой перечисляются все пользователи из .htpasswd вместе со ссылками [delete].

После вывода трех строк с заголовком HTML-таблицы сценарий продолжает выполнение со строки . Этот цикл while читает пары имя/пароль из файла .htpasswd, используя трюк с изменением разделителя входных полей (Input Field Separator, IFS) на двоеточие и восстановлением по завершении.

Нижний колонтитул с полями ввода для выполнения операций

Сценарий полагается на присутствие HTML-файла с именем apm-footer.html, содержащего строки −myname- и −options- , которые в процессе вывода файла в stdout замещаются текущим именем CGI-сценария и списком пользователей соответственно.

Переменная $myname определяется механизмом CGI, который сохраняет в ней фактическое имя сценария. Сам сценарий конструирует переменную $optionstring из пар имя/пароль, хранящихся в файле .htpasswd .

HTML-файл с нижним колонтитулом, представленный в листинге 9.8, дает возможность выполнить операцию добавления пользователя, изменить пароль и удалить пользователя.

Листинг 9.8. Файл apm-footer.html добавляющий раздел с полями ввода для выполнения операций

<! — нижний колонтитул с информацией для системы APM. ->

<div style='margin-top: 10px;'>

<table border='1' cellpadding='2' cellspacing='0' width="80 %"

······ style="border:2px solid #666;border-radius:5px;" >

··<tr><th colspan='4' bgcolor='#cccccc'>Password Manager Actions</th></tr>

··<tr><td>

····<form method="get" action="-myname-">

······<table border='0'>

········<tr><td><input type='hidden' name="a" value="A">

··········add user:</td><td><input type='text' name='u' size='15'>

········</td></tr><tr><td>

··········password: </td><td> <input type='text' name='p' size='15'>

········</td></tr><tr><td colspan="2" align="center">

··········<input type='submit' value='add' style="background-color:#ccf;">

········</td></tr>

······</table></form>

··</td><td>

····<form method="get" action="-myname-">

······<table border='0'>

········<tr><td><input type='hidden' name="a" value="U">

··········update</td><td><select name='u'>-options-</select>

········</td></tr><tr><td>

··········password: </td><td><input type='text' name='p' size='10'>

········</td></tr><tr><td colspan="2" align="center">

··········<input type='submit' value='update' style="background-color:#ccf;">

········</td></tr>

······</table></form>

··</td><td>

····<form method="get" action="-myname-"><input type='hidden'

······name="a" value="D">delete <select name='u'> −options- </select>

······<br /><br /><center>

········<input type='submit' value='delete' style="background-color:#ccf;"></

······center></form>

····</td></tr>

··</table>

</div>

<h5 style='background:#ccf;border-radius:3px;border:1px solid

#99c;padding:3px;'>

From the book <a href="http://www.intuitive.com/wicked/">Wicked Cool Shell

Scripts</a>

</h5>

</body></html>

Запуск сценария

Вы почти наверняка пожелаете сохранить сценарий в том же каталоге, который требуется защитить паролем, однако можно предпочесть и каталог cgi-bin, как это сделали мы. В любом случае убедитесь, что переменные htpasswd и basedir получают правильные значения в начале сценария. Вам также понадобится файл .htaccess, определяющий права доступа, и файл .htpasswd, доступный для записи пользователю, с привилегиями которого выполняется веб-сервер Apache в вашей системе.