Баба inurl sign guestbook asp. Пошук слів за допомогою додаткових операторів
Будь-який пошук уразливостей на веб-ресурсах починається з розвідки та збору інформації.
Розвідка може бути як активною – брутфорс файлів та директорій сайту, запуск сканерів уразливостей, ручний перегляд сайту, так і пасивною – пошук інформації у різних пошукових системах. Іноді буває так, що вразливість стає відомою ще до відкриття першої сторінки сайту.
Як таке можливо?
Пошукові роботи, які безперервно блукають просторами інтернету, крім інформації, корисної звичайному користувачеві, часто фіксують те, що може бути використане зловмисниками при атаці на веб-ресурс. Наприклад, помилки скриптів та файли з чутливою інформацією (починаючи від конфігураційних файлів та логів, закінчуючи файлами з автентифікаційними даними та бекапами баз даних).
З погляду пошукового робота повідомлення про помилку виконання SQL-запиту - це звичайний текст, невіддільний, наприклад, від опису товарів на сторінці. Якщо раптом пошуковий робот наткнувся на файл з розширенням.sql, який чомусь опинився в робочій папці сайту, то він буде сприйнятий як частина вмісту сайту і так само буде проіндексовано (включаючи, можливо, вказані паролі).
Подібну інформацію можна знайти, знаючи стійкі, часто унікальні ключові слова, які допомагають відокремити «вразливі сторінки» від сторінок, що не містять вразливості.
Величезна база спеціальних запитів із використанням ключових слів (так званих дорків) існує на exploit-db.com і відома під назвою Google Hack Database.
Чому Google?
Дорки орієнтовані в першу чергу на google з двох причин:
− найбільш гнучкий синтаксис ключових слів (наведено в Таблиці 1) та спеціальних символів (наведено в Таблиці 2);
− індекс google все ж таки більш повний ніж у інших пошукових систем;
Таблиця 1 – Основні ключові слова google
Ключове слово |
Сенс |
приклад |
site |
Пошук лише на вказаному сайті. Враховує лише url |
site:somesite.ru - знайде всі сторінки по даному домену та піддоменам |
inurl |
Пошук за словами, присутнім у uri. На відміну від кл. слова "site", шукає збіги після імені сайту |
inurl:news - знайде всі сторінки, де в uri зустрінеться це слово |
intext |
Пошук у тілі сторінки |
intext:"пробки" - повністю аналогічно звичайному запиту "пробки" |
intitle |
Пошук у заголовку сторінки. Текст, укладений між тегами |
intitle:"index of" - знайде всі сторінки з лістингом директорії |
ext |
Пошук сторінок із зазначеним розширенням |
ext:pdf - знайде всі PDF-файли |
filetype |
В даний час повністю аналогічно кл. слову “ext” |
filetype:pdf - аналогічно |
related |
Пошук сайтів зі схожою тематикою |
related:google.ru - покаже свої аналоги |
link |
Пошук сайтів, що посилаються на даний |
link:somesite.ru - знайде всі сайти, на яких є посилання на даний |
define |
Показати визначення слова |
define:0day - визначення терміна |
cache |
Показати вміст сторінки в кеші (якщо є) |
cache:google.com - відкриє сторінку з кешу |
Таблиця 2 – Спеціальні символи запитів google
Символ |
Сенс |
приклад |
“ |
Точна фраза |
intitle:«RouterOS router configuration page» - пошук роутерів |
* |
Будь-який текст |
inurl:«bitrix*mcart» - пошук сайтів на bitrix з вразливим модулем mcart |
. |
Будь-який символ |
Index.of - аналогічно до запиту index of |
- |
Виключити слово |
error -warning - показати всі сторінки, де є error, але немає warning |
.. |
Діапазон |
cve 2006..2016 - показати вразливості за роками починаючи з 2006 |
| |
Логічне «або» |
linux | windows - показати сторінки, де зустрічається або перше або друге слово |
Варто розуміти, що будь-який запит до пошукової системи – це пошук лише за словами.
Марно шукати на сторінці мета-символи (лапки, дужки, знаки пунктуації тощо). Навіть пошук за точною фразою, вказаною в лапках, - це пошук за словами, з подальшим пошуком точного збігу вже в результатах.
Усі доріжки Google Hack Database розділені логічно на 14 категорій і представлені в таблиці 3.
Таблиця 3 – Категорії Google Hack Database
Категорія |
Що дозволяє знайти |
приклад |
Footholds |
Веб-шелли, публічні файлові менеджери |
Знайти всі зламані сайти, де залиті перераховані вебшели: (intitle:«phpshell» OR intitle:«c99shell» OR intitle:«r57shell» OR intitle:«PHP Shell » OR intitle:«phpRemoteView») `rwx` «uname» |
Files containing usernames |
Файли реєстру, файли конфігурації, логи, файли, що містять історію введених команд |
Знайти всі файли реєстру, які містять інформацію про облікові записи: filetype:reg reg +intext:«Internet account manager» |
Sensitive Directories |
Каталоги з різною інформацією (особисті документи, конфіги vpn, приховані репозиторії та ін.) |
Знайти всі лістинги директорій, що містять файли, що відносяться до vpn: "Config" intitle:"Index of" intext:vpn Сайти, що містять git-репозиторії: (intext: "index of /.git") ("parent directory") |
Web Server Detection |
Версію та іншу інформацію про веб-сервер |
Знайти адміністративні консолі сервера JBoss: inurl:"/web-console/" intitle:«Administration Console» |
Vulnerable Files |
Скрипти, що містять відомі вразливості |
Знайти сайти, які використовують скрипт, що дозволяє вивантажити довільний файл із сервера: allinurl:forcedownload.php?file= |
Vulnerable Servers |
Інсталяційні скрипти, веб-шелли, відкриті адміністративні консолі та ін. |
Знайти відкриті PHPMyAdmin консолі, запущені від root: intitle:phpMyAdmin "Welcome to phpMyAdmin ***" "running on * as root@*" |
Error Messages |
Різні помилки та попередження, що часто розкривають важливу інформацію - починаючи від версії CMS до паролів |
Сайти, що мають помилки у виконанні SQL-запитів до бази: "Warning: mysql_query()" "invalid query" |
Files containing juicy info |
Сертифікати, бекапи, електронні листи, логи, SQL-скрипти і т.д. |
Знайти ініціалізаційні sql-скрипти: filetype:sql та «insert into» -site:github.com |
Files containing passwords |
Все, що може містити паролі - логи, sql-скрипти і т.д. |
Логи, що згадують паролі: filetype:logintext:password |pass |pw sql-скрипти, що містять паролі: ext:sqlintext:usernameintext:password |
Sensitive Online Shopping Info |
Інформація пов'язана з онлайн покупками |
Знайти пінкоди: dcid=bn=pincode= |
Network or vulnerability data |
Інформацію, що не відноситься безпосередньо до веб-ресурсу, але що стосується мережі або інші не веб-сервіси |
Знайти скрипти автоматичного налаштування проксі, що містять інформацію про внутрішню мережу: inurl:прокси | inurl:wpad ext:pac | ext:dat findproxyforurl |
Pages containing login portals |
Сторінки, що містять форми входу |
Веб-сторінки saplogon: intext:«2016 SAP AG. All rights reserved.» intitle:«Logon» |
Various Online Devices |
Принтери, роутери, системи моніторингу та ін. |
Знайти конфігураційну панель принтера: intitle:"hplaserjet"inurl:SSI/Auth/set_config_deviceinfo.htm |
Advisories and Vulnerabilities |
Сайти на вразливих версіях CMS |
Знайти вразливі плагіни, через які можна завантажити довільний файл на сервер: inurl:fckeditor -intext:«ConfigIsEnabled = False» intext:ConfigIsEnabled |
Дорки найчастіше орієнтовані на пошук по всіх сайтах мережі інтернет. Але ні що не заважає обмежити область пошуку на будь-якому веб-сайті або веб-сайтах.
Кожен запит до Google можна зосередити на певному сайті, додавши до запиту ключове слово "site:somesite.com". Дане ключове слово може бути дописане до будь-якого дорку.
Автоматизація пошуку вразливостей
Так народилася ідея написати просту утиліту, що автоматизує пошук вразливостей за допомогою пошукової системи (google) і спирається на Google Hack Database.
Утиліта являє собою скрипт, написаний на nodejs з використанням phantomjs. Якщо бути точним, то скрипт інтерпретується самим фантомом.
Phantomjs - це повноцінний веб-браузер без графічного інтерфейсу, що керується за допомогою js-коду і володіє зручним API.
Утиліта отримала цілком зрозумілу назву – dorks. Запустивши її в командному рядку (без опцій) отримуємо коротку довідку з кількома прикладами використання:
Малюнок 1 - Список основних опцій dorks
Загальний синтаксис утиліти: dork команда список опцій.
Детальний опис усіх опцій наведено в таблиці 4.
Таблиця 4 – Синтаксис dorks
Команда |
Опція |
Опис |
ghdb |
-l |
Вивести нумерований список категорій дорків Google Hack Database |
-c «номер або назва категорії» |
Завантажити доріжки вказаної категорії за номером чи назвою |
|
-q «фраза» |
Завантажити дорки, знайдені за запитом |
|
-o "файл" |
Зберегти результат у файл (тільки разом із опціями -c|-q) |
|
google |
-d «дорк» |
Вказати довільний дорк (опція може використовуватися багато разів, допускається поєднання з опцією -D) |
-D "файл" |
Використовувати доріжки з файлу |
|
-s «сайт» |
Вказати сайт (опція може використовуватися багато разів, допускається поєднання з опцією -S) |
|
-S "файл" |
Використовувати сайти з файлу (перебір доріжок буде виконаний по кожному сайту незалежно) |
|
-f "фільтр" |
Задати додаткові ключові слова (буде додано до кожного дорка) |
|
-t «кількість мс» |
Інтервал між запитами до Google |
|
-T «кількість мс» |
Таймаут, якщо зустрілася каптча |
|
-o "файл" |
Зберегти результат у файл (будуть збережені лише ті доркі, за якими щось знайшлося) |
За допомогою команди ghdb можна отримати всі доркі з exploit-db за довільним запитом, або вказати всю категорію. Якщо вказати категорію 0 - то буде вивантажено всю базу (близько 4.5 тисяч дорків).
Список категорій доступних на даний момент представлений малюнку 2.
Малюнок 2 - Список доступних категорій дорків GHDB
Командою google буде проведена підстановка кожного доріка в пошуковик google і проаналізовано результат щодо збігів. Дорки за якими щось знайшлося будуть збережені у файл.
Утиліта підтримує різні режими пошуку:
1 дорк та 1 сайт;
1 дорк та багато сайтів;
1 сайт та багато дорків;
багато сайтів та багато дорків;
Список доріжок та сайтів можна задати як через аргумент, так і через файл.
Демонстрація роботи
Спробуємо пошукати будь-які вразливості на прикладі пошуку повідомлень про помилки. За командою: dorks ghdb –c 7 –o errors.dorks будуть завантажені всі відомі доркі категорії “Error Messages” як показано на малюнку 3.
Рисунок 3 – Завантаження всіх відомих дорків категорії “Error Messages”
Дорки завантажені та збережені у файл. Тепер залишається «натруїти» їх на якийсь сайт (див. рисунок 4).
Рисунок 4 – Пошук вразливостей сайту, що цікавиться, в кеші google
Через деякий час на досліджуваному сайті виявляється кілька сторінок, які містять помилки (див. рис. 5).
Рисунок 5 – Знайдені повідомлення про помилки
Підсумок у файлі result.txt отримуємо повний список доріжок, що призводять до появи помилки.
На малюнку 6 наведено результат пошуку помилок сайту.
Малюнок 6 – Результат пошуку помилок
У кеші по даному доріку виводиться повний бектрейс, що розкривають абсолютні шляхи скриптів, систему керування вмістом сайту та тип бази даних (див. рис. 7).
Рисунок 7 – розкриття інформації про влаштування сайту
Однак варто враховувати, що не всі доріжки з GHDB дають справжній результат. Також google може знайти точного збіги і показати схожий результат.
У такому разі розумніше використовувати свій персональний список дорків. Наприклад, завжди варто пошукати файли з «незвичайними» розширеннями, приклади яких наведено малюнку 8.
Рисунок 8 – Список розширень файлів, не характерних для звичайного веб-ресурсу
У результаті, за командою dorks google –D extensions.txt –f банк, з першого запиту google починає віддавати сайти з «незвичайними» розширеннями файлів (див. малюнок 9).
Рисунок 9 – Пошук «нехороших» типів файлів на сайтах банківської тематики
Варто мати на увазі, що google не сприймає запити довші за 32 слова.
За допомогою команди dorks google –d intext:”error|warning|notice|syntax” –f університет
можна знайти помилки інтерпретатора PHP на сайтах навчальної тематики (див. малюнок 10).
Рисунок 10 – Пошук PHP-помилок часу виконання
Іноді користуватися якоюсь однією чи двома категоріями дорків не зручно.
Наприклад, якщо відомо, що сайт працює на движку wordpress, то потрібні доріжки саме по wordpress. У такому випадку зручно користуватися пошуком Google Hack Database. Команда dorks ghdb –q wordpress –o wordpress_dorks.txt завантажить всі доркі по Wordpress, як показано на малюнку 11:
Рисунок 11 – Пошук доріжок, що стосуються Wordpress
Знову повернемося до банків та командою dorks google –D wordpress_dords.txt –f банк спробуємо знайти щось цікаве, пов'язане з wordpress (див. малюнок 12).
Рисунок 12 – Пошук вразливостей Wordpress
Варто зауважити, що пошук на Google Hack Database не сприймає слова коротше 4 символів. Наприклад, якщо CMS сайту не відома, але відома мова – PHP. У такому разі можна відфільтрувати потрібне вручну за допомогою пайпа та системної утиліти пошуку dorks – c all | findstr /I php > php_dorks.txt (див. малюнок 13):
Малюнок 13 – Пошук по всіх доріг, де є згадка PHP
Пошук вразливостей або якоїсь чутливої інформації в пошуковій системі слід шукати тільки у випадку, якщо на цьому сайті є значний індекс. Наприклад, якщо у сайту проіндексовано 10-15 сторінок, то безглуздо щось шукати подібним чином. Перевірити розмір індексу просто – достатньо ввести в рядок пошуку google «site:somesite.com». Приклад сайту з недостатнім індексом показано на малюнку 14.
Рисунок 14 – Перевірка розміру індексу сайту
Тепер про неприємне ... Періодично google може запросити каптчу - тут нічого не вдієш - її доведеться ввести. Наприклад, у мене, при переборі категорії «Error Messages» (90 дорків) каптча випала лише один раз.
Варто додати, що phantomjs підтримує роботу так само через проксі, як через http, так і через socks інтерфейс. Для включення режиму проксі треба розкоментувати відповідний рядок dorks.bat або dorks.sh.
Інструмент доступний у вигляді вихідного коду
Recently я був працюючий на моїй веб-сторінці, і вирішив я хотів зробити guestbook. Я хотів би вивчити веб-доступ до кращого guestbook для мого веб-сайту, але якщо не турбується, я думаю, що 'Hey I'm a developer, why not create my own?'
It was very easy to create guestbook — you can do it too. In this tutorial, I'll show you how. I'll assume те, що ви маєте широке знання про основи ASP.NET програмування, що ви знайдете технології, внесені в codebehind, і що ви маєте деякі XML/XSL skills.
Overview
What do we need in order to create a guestbook? Тут потрібні дві форми форми: один у якому користувачі можуть ввести їх назву, адресу електронної пошти, і коментарі, і інші, що використовуються для відтворення цих повідомлень, як вони signed в guestbook. З курсу ми можемо побудувати цю функціональність в одному Web form, але має чистий код, I'll використовувати два Web forms with several codebehind files (I'll discuss these in more detail in a moment).
We'll also need a database to hold the information entered via the form. I used a simple XML file (a database) до store the information entered by the user. Для visualization of the XML we'll use XSL.
So, in summary, we need the following:
- Two Web forms
- Codebehind
- Database
In a guestbook, it's usually sufficient to store a user's name, location, email address, Website address, and comment. З плавання, ви можете переглянути більше полів, але для наших філіалів, вони є приємними. We'll store this data в XML файлі, which will look something like this:
I hope you like it. Щоб дізнатися, як створити свій guestbook,
read the whole story на веб-сайті.
Signing the Guestbook
We'll allow the user to 'sign' our guestbook натиснувши певні відомості в simple web form — в our example this is the guestbook.aspx file. I use the following fields в the Web form:
- Location
- Website
- Comment
Here’s the code:
<% @Page Language="C#" Debug="true" Src="Guestbook.cs"
Inherits="Guestbook" %>
To avoid confusing you with unnecessary code, I remove the visualisation tags — including table, table header etc. — від цього опису (якщо, на курсі, вони є всі включені в downloadable code that's provided at the end of this tutorial). Як ми тільки відтворюємо simple form with few fields and buttons, ви можете any any programming code in this file. Це є все, що функціональність є високим в коді.
У першому рядку з code above, я встановлюю SRC atribut до літа ASP.NET file know that we are using the codebehind file Guestbook.cs I've also set the attribute Inherits with the corresponding classname. Це atribut lets the file know which class to inherit.
Next, I've implemented the required text fields. Зверніть увагу, що якщо ви хочете використовувати ті ж самі параметри в codebehind, вони потрібні для того, щоб мати ті ж ID у всіх файлах, і вони повинні бути розглянуті як public.
У наступному розділі коду, я використовує ASP.NET validator controls. Ці керування check whether the user has entered value in the text field, безперервно-розриву до the server. Code executed на client side.
Зрештою, я implemented submit button with onClick event called Save_Comment . Це означає, що він використовується для збереження інформації, введеної в XML файл за допомогою користувача. Функція цього випадку є доступною в Guestbook.cs. I also implemented a reset button - and that's it! Nothing more has to be done to the Web form. Тепер, якщо ви збираєтеся guestbook.aspx, ви повинні бачити, що Web form that looks like this:
Тепер ми знаємо, як відобразити веб-форму, але ми повинні повідомити про те, що handles the event in guestbooks.cs. Let’s take a look at that now.
Using System;
using System.Web;
using System.Web.UI;
використовуючи System.Xml;
Public class Guestbook: Page
{
// Create the required webcontrols with the same name as
in the guestbook.aspx file
public TextBox name;
public TextBox location;
public TextBox email;
public TextBox website;
public TextBox comment;
Public void Save_Comment(object sender, EventArgs e)
{
// Everything is all right, so let us save the data
into the XML файл
SaveXMLData();
// Remove the values of the textboxes
name.Text="";
location.Text="";
website.Text="";
email.Text="";
comment.Text="";
}
}
Private void SaveXMLData()
{
// Load the xml file
XmlDocument xmldoc = новий XmlDocument();
xmldoc.Load(Server.MapPath("guestbook.xml"));
//Create a new guest element and add it to the root node
XmlElement parentNode = xmldoc.CreateElement("guest");
xmldoc.DocumentElement.PrependChild(parentNode);
// Create the required nodes
XmlElement nameNode = xmldoc.CreateElement("name");
XmlElement locationNode = xmldoc.CreateElement("location");
XmlElement emailNode = xmldoc.CreateElement("email");
XmlElement websiteNode = xmldoc.CreateElement("website");
XmlElement commentNode = xmldoc.CreateElement("comment");
// retrieve the text
XmlText nameText = xmldoc.CreateTextNode(name.Text);
XmlText locationText = xmldoc.CreateTextNode(location.Text);
XmlText emailText = xmldoc.CreateTextNode(email.Text);
XmlText websiteText = xmldoc.CreateTextNode(website.Text);
XmlText commentText = xmldoc.CreateTextNode(comment.Text);
// append the nodes to the parentNode without the value
parentNode.AppendChild(nameNode);
parentNode.AppendChild(locationNode);
parentNode.AppendChild(emailNode);
parentNode.AppendChild(websiteNode);
parentNode.AppendChild(commentNode);
// Захищає цінність філії в nodes
nameNode.AppendChild(nameText);
locationNode.AppendChild(locationText);
emailNode.AppendChild(emailText);
websiteNode.AppendChild(websiteText);
commentNode.AppendChild(commentText);
// Save to the XML file
xmldoc.Save(Server.MapPath("guestbook.xml"));
// Display the user the signed guestbook
Response.Redirect("viewguestbook.aspx");
}
}
Wow! That's our codebehind file… but what really happens here? You won't believe it, але answer is: "not much"!
Перший, буде реалізувати мінімальні потрібні namespaces, які ми потребуємо в порядку, щоб використовувати кілька важливих функцій. Then I create a new class called Guestbook:
public class Guestbook: PageNote that it's this class that's inherited by the guestbook.aspx file. Існують 5 public variables of type textbox. Remember that here, the names have to identical to those we used when we created the text boxes in guestbook.aspx. Там, як ви можете повідомити, будуть використовуватися Save_Comment Event, які є оголошено по кнопці submit, що буде включити в файл guestbookpx. Це означає, що використовується для збереження даних.
The Saving Process
Функція SaveXMLData() забезпечує інформацію для нас. Як ми використовуємо XML Database для отримання інформації, будуть використовувати XmlDocument , XmlElement and XmlText classes, які виконують всі функції, які потрібні.
Далі, ми створили новий XMLDocument class об'єкта і load the guestbook.xml file. Потрібні nodes є створені з функцією CreateElement , і інформацією, введеною в User is retrieved and stored to object of XmlText . Далі, ми збираємо створені nodes без будь-яких цін, використовуючи функцію AppendChild in conjunction with the main XmlDocument object.
І, наприкінці, ціни будуть збережені в шпильках, які створюються, ми збираємо всі зміни до файлу guestbook.xml, і ми оберіть сторінку на viewguestbook.aspx, де stored comment is displayed.
Viewing the Guestbook
Для того, щоб побачити guestbook, ми повинні створювати інші веб-форми:
<% @Page Language="C#" Debug="true" Src="ViewGuestbook.cs"
Inherits="ViewGuestbook" %>
Як ви бачите, це Web form doesn’t really do all that much. Це simple calls the codebehind file, ViewGuestbook.cs. Let's take a look at this file.
Using System;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
використовуючи System.Xml;
використовуючи System.Xml.Xsl;
using System.IO;
Public class ViewGuestbook: Page
{
private void Page_Load(object sender, System.EventArgs e)
{
//Load the XML file
XmlDocument doc = новий XmlDocument();
doc.Load(Server.MapPath("guestbook.xml"));
//Load the XSL file
XslTransform xslt = New XslTransform();
xslt.Load(Server.MapPath("guestbook.xsl"));
String xmlQuery="//guestbook";
XmlNodeList nodeList=doc.Document
Element.SelectNodes(xmlQuery);
MemoryStream ms=new MemoryStream();
xslt.Transform(doc, null, ms);
ms.Seek(0, SeekOrigin.Begin);
StreamReader sr = новий StreamReader(ms);
//Print out the result
Response.Write(sr.ReadToEnd());
}
}
I’ve створено цю категорію для відтворення всіх коментарів, прокладених через guestbook до наших користувачів. У зв'язку з цим, перш ніж це буде реалізувати потрібні namespaces, і, як ми використовуємо XSL для visualization, ми повинні бути включені до namespace System.Xml.Xsl .
Вони створюють новий клас названий ViewGuestbook , з private inbuilt функція називається Page_Load . Ця функція завжди називається при page loads, або при використанні користувачів, які змінюються. Тут, функції loads guestbook.xml файлу, і в XslTranform class використовується для перетворення XML елементів в HTML до wet loadt guestbook.xsl з help XslTransform object.
Next, we create a new object of class XmlNodeList , який буде застосовано до вибраних необхідних nodes. Якщо ви використовуєте class MemoryStream , доступне за допомогою namespace System.IO , створіть stream, що має пам'яті як backing store, і використовує трансформаційну функцію, щоб визначити xml data to ця пам'ятка. функція секції включає в себе поточну позицію до 0.
We then create an object of the class StreamReader , which reads the stream, і print the result with the help of the function ReadToEnd() . Ця функція reads the stream from the current position to the end. Якщо ви збираєтеся побачити guestbook.aspx, ви повинні дізнатися про Web form like this:
The XSL
Як I’ve already mentioned, we use XSL для transformation of the data from XML to HTML. I've assumed that you're already experienced with XSLT, so I'll тільки touch на важливих аспектах. Я використовую XSL для кожного виходу до ітераті через всі guests в цій knihe, які висловлюють деякий час як це:
And in loop we call the XSL template name, which looks something like this:
Conclusion
As you see, it's не дуже difficult to create a guestbook. Good luck! And don't forget to.
Тут ми start out with simple "settings" file, назви settings.asp. Цей файл буде включений на її сторінку, і буде містити основні настанови для цієї guestbook.
Відповідь password (logincode) є NOT в 데이터베이스, ви можете записати database в webroot з mappath statement to make the install easier. Окрім того, найкраще місце для вашого database є поза вашим веб-сайтом, в якому випадку ви хочете, щоб змінити вашу database_path string to your full path ("C:\inetpub\database\post.mdb" for example)
Там є також важливі налаштування до певного html, або не. Багато разів folks abuse guestbook by filling it with links, і інші джинси. Це буде добре, щоб хотіти, щоб розглянути html, unless you realne need it.
Language setting is just a set variables for text used within the system, for each language there is different text that is used. Very easy to add a "new" language to the system.
Details
Login is a simple login check page, which checks login code Entered on the form
with the one stored in the settings.asp file.
Login use session variables to store the login information, so to log off we simple abandon the sesion. Redirect appends date to avoid seeing "cached" login page after being logged out. Це не небезпека, але тільки для convenience.
<% session.abandon response .redirect(" post.asp?d=" & date ) %>
Новий основний код є post.asp page, this page is the same whether you are logged in as admin or just a guest visiting the page. Якщо ви збираєтеся в тому, щоб дати самі дані, як тільки, тільки ви маєте багато можливостей, які ви можете скористатися повідомленнями, або залишити видалені повідомлення, або empty the "recycle bin" (якщо вилучені повідомлення, щоб отримати until you clear them out) .
Як ви можете повідомити від коду нижче, ми виконати loggedin session right from the start,
будуть ми можемо використовувати цей текст, щоб залишити script для відображення даних, що базуються на вашому статусі як admin або guest.
<% option explicit %>
span > <% LoggedIn = Session(" loginID" )Once you are logged in you more options available.
File is split up in "parts" depending on what querystring passed.
Section below checks to see if you are logged in and then check so see if
Ви маєте намір empty "розрізнених" елементів з Database.
Як ви можете повідомити про останній основний "post" код, різні елементи можуть бути розгорнуті або дії, що базуються на тому, що клацнули в або не, і якщо ви не збираєтесяstrings значення, що ви повинні пройти на сторінці.
" ============set based on delete or undelete============ If LoggedIn<>Then showdeleted = request .querystring(" showdeleted" ) if showdeleted = 1 then active = 2 removetype = 1 delete_text = undelete_text delimage = " undelete.gif" else active = 1 removetype = 2 delete_text = delete_text delimage = " delete.gif " end if else active = 1 end if " ============Delete/Undelete Items from the guestbook display============ remove = request .querystring(" remove" ) if remove = 1 then Set dConn = Server .CreateObject ("ADODB.Connection" ) dConn.Open " PROVIDER=MICROSOFT.JET.OLEDB.4.0;DATA SOURCE="& database_path removetype = request .querystring(" removetype" ) mySQL = " UPDATE tblPost SET Active = " & removetype & " WHERE ID = " & _ ID & " ;" response .write " updating" dConn.execute(mySQL) dConn.Close set dConn = Nothing response .redirect(" post.asp" ) end if " ============End Delete Section============ Set dataRS = Server .CreateObject ("ADODB.RecordSet") dataSQL = "Select TOP" & show_posts & " message, remote_addr, sysdate, " &_ " systime, id FROM tblPost WHERE active = "& active &_ " order by sysdate DESC, systime DESC;"" Response.Write dataSQL " response.end Set dConn = Server .CreateObject ("ADODB.Connection") dConn.Open " PROVIDER=MICROSOFT.JET.OLEDB.4.0;DATA SOURCE="& database_path dataRS.Open dataSQL, dConn, 1 , 3 recordcount = dataRS.recordcount if recordcount > 0 then data = dataRS.GetRows() " Data is retrieved so close all connections dataRS.Close Set dataRS = Nothing dconn.close set dconn = nothing " Setup for array usage iRecFirst = LBound (data, 2 ) iRecLast = UBound (data, 2 ) end if " ============IF IS A POST BACK============ message = trim (request .form("message" )) if request .form(" ispostback" ) = 1 AND (len (message) > minimum_length) PreSubmit2(message) end if strSQL = "tblPost" "Open a recordset Set cRS2 = Server .CreateObject ("ADODB.recordset" ) Set dConn = Server .CreateObject ("ADODB.Connection" ) dConn.Open " PROVIDER=MICROSOFT.JET.OLEDB.4.0;DATA SOURCE="&_ database_path cRS2.Open strSQL, dConn, 1 ,3 cRS2.AddNew cRS2(" message" ) = message cRS2(" sysdate" ) = date() cRS2(" systime" ) = time () cRS2(" remote_addr" ) = request .ServerVariables(" remote_addr" ) cRS2(" Active" ) = 1 cRS2.Update cRS2.Close Set cRS2 = Nothing dConn.Close Set dConn = Nothing response .redirect(" post.asp" ) end if " ============End POSTBACK Section============ %><%=pagetitle%>