Гэр / Facebook / Бид хуудсан дээр нууц үг оруулсан. Нууц үг хамгаалах Html хуудасны код нэвтрэх болон нууц үг

Бид хуудсан дээр нууц үг оруулсан. Нууц үг хамгаалах Html хуудасны код нэвтрэх болон нууц үг

Тиймээс бидний даалгавар бол тодорхой хуудсанд нэвтрэх нууц үгийг тохируулах явдал юм. Хамгаалалтын хамгийн энгийн аргаас эхэлцгээе - JavaScript-ийн цөөн хэдэн мөр:

Var pass = prompt("Нууц үгээ оруулна уу:", ""); if (pass == null) window.location = "wrong.html"; else if (pass.toLowerCase() == "wwvsfc") window.location = "temp.html"; else window.location = "буруу.html"; Скриптийг тусад нь файлд хийц ашиглан нуух гэх мэт заль мэх нь юуг ч үндсэндээ өөрчлөхгүй.

Java-д хэрэгжүүлсэн ижил төстэй систем:

java.applet.* импортлох; java.awt.* импортлох; java.net.* импортлох; public class Нууц үг өргөтгөл Applet( TextField нэвтрэх, нууц үг; String Login = "нэвтрэх"; String Password = "Нууц үг"; public Password() ( ) public void init() ( Panel panel = new Panel(); panel.setLayout(шинэ) GridLayout(2,2)); нэвтрэх = шинэ TextField(20); нууц үг = шинэ TextField(20); panel.add(шинэ Шошго("Нэвтрэх:")); panel.add(нэвтрэх); panel.add(шинэ) Шошго("Нууц үг:")); panel.add(нууц үг); нэмэх(самбар); нэмэх(шинэ товч("Ok")); ) нийтийн логикийн үйлдэл (Үйл явдал evt, Объект объект) ( if(evt.target instanceof) Товч) ( Мөр s; if(login.getText().тэгш(Нэвтрэх) && password.getText().equals(Нууц үг)) ( s = "http://www.hackzone.ru/articles/ok.html" ; ) else ( s = "http://www.hackzone.ru/articles/bad.html"; ) оролдоно уу ( getAppletContext().showDocument(шинэ URL(ууд)); ) catch(Exception e) ( password.setText (e.toString()); ) үнэнийг буцаана; ) худал буцаана; ))

Энэ апплетыг хуудсанд оруулснаар та иймэрхүү зүйлийг авах боломжтой (дараагийн бүх жишээнд ok.html болон bad.html ашигладаг):

Нууц үг шалгах

Үүнийг илүү ухаалаг болгож, хэрэглэгч бүрт тусдаа хуудас үүсгэх, файлаас өгөгдлийг уншихыг албадах гэх мэт боломжтой. Үндсэн сул тал нь хүн хайж буй хуудсандаа нэг удаа орсон бол энэ URL-г санахад хэн ч саад болохгүй, тиймээс энэ нь нэг удаагийн хэрэгсэл юм. Мэдээжийн хэрэг, та URL хаягийг хаягийн мөрөнд харуулахгүйн тулд хуудсаа хүрээ дотор нууж болно, гэхдээ та энэ хамгаалалтыг хэнээс авахыг ойлгож байна. Дахин хэлэхэд, апплет нь бүхэлдээ үйлчлүүлэгчид очдог бөгөөд зарчмын хувьд судалгаанд бүрэн бэлэн байдаг.

CGI-ийн хэрэглээнд суурилсан шийдэл нь хамгийн сүүлийн сул талгүй. Энгийн Perl скрипт нь иймэрхүү харагдаж байна:

#!/usr/bin/perluse CGI qw(:стандарт); $query = new CGI;$ok = "ok.html";$address = "bad.html"; $нэвтрэх = "нэвтрэх";$нууц үг = "нууц үг"; $l = $query->param("нэвтрэх"); $p = $query->param("нууц үг"); if(($p eq $нууц үг) && ($l eq $нэвтрэх))( $хаяг = $ok;)хэвлэх $query->redirect($address);

Хэрэглээний жишээ:

Нууц үг шалгах

Эхний дутагдлыг арилгахын тулд та URL хаягаа өгөхгүйгээр дотор нь хаа нэгтээ нуусан хуудас дээр үндэслэн шинэ хуудсыг динамикаар үүсгэж болно.

Өөрчлөгдсөн код:

#!/usr/bin/perluse CGI qw(:стандарт); $query = шинэ CGI; $ok = "ok.html"; $ хаяг = "муу.html"; $docroot = $ENV("BACUMENT_ROOT"); $localpath = "/ нийтлэл/"; $нэвтрэх = "нэвтрэх";$нууц үг = "нууц үг"; $l = $query->param("нэвтрэх"); $p = $query->param("нууц үг"); if(($p eq $нууц үг) && ($l eq $нэвтрэх))( $хаяг = $ok;) хэвлэх $query->толгой(); нээлттэй(FL, $docroot.$localpath.$хаяг); while())(# Энд нэгэн зэрэг html кодыг шууд өөрчлөх боломжтой# Яагаад? За хэзээ ч мэдэхгүй... :) print $_;) close (FL);

Хэрэглээний жишээ:

Нууц үг шалгах

Таны харж байгаагаар файлын URL нь SSI-ийн зардлаар харагдахаа больсон (гэхдээ тэдгээрийг гаралтын явцад барьж аваад гараар боловсруулж болно). Мэдээжийн хэрэг харьцангуй замыг ашиглахдаа бүх төрлийн зургууд хуудаснуудад муугаар нөлөөлж болно гэдгийг бид мартаж болохгүй.

Эцэст нь хэлэхэд, нэвтрэх нууц үгийг тохируулах хамгийн найдвартай арга бол серверийн хэрэгслийг ашиглах явдал юм - үүнийг хүмүүс хийчихсэн юм биш. Би хоёр дээр анхаарлаа хандуулах болно - Apache хамгийн алдартай, IIS нь бас алдартай :)

IIS-ийн хувьд бүх зүйл маш энгийн байдаг - хамгаалалтыг NTFS ашиглан гүйцэтгэдэг бөгөөд энэ нь мэдээжийн хэрэг серверийн бус администраторуудын чадавхийг тодорхой хэмжээгээр хязгаарладаг. Санаа нь дараах байдалтай байна: сайтын бүх зочдод анхдагчаар ажилладаг IUSR_xxxx хэрэглэгч хүссэн файл/санд хандах эрхгүй. Үүний дараа Properties->Security хэсэгт үүнийг тодорхой заасан хэрэглэгчид л эдгээр файлд хандах эрхтэй болно. Тэднийг бүлэг болгон нэгтгэх нь илүү тохиромжтой гэдэг нь ойлгомжтой. Энд хэд хэдэн нарийн зүйл бий. Нэгдүгээрт, заасан хэрэглэгчдэд нэвтрэх эрхийг дотооддоо өгөх ёстой (Хэрэглэгчийн менежер дэх Бодлого->Хэрэглэгчийн эрх) Хоёрдугаарт, хэрэв та WWW тохиргоон дотроос WWW үйлчилгээний үндсэн баталгаажуулалтыг (Текстийг цэвэрлэх) сонгохгүй бол зөвхөн Internet Explorer-ийн хэрэглэгчид л нэвтрэх болно. орохыг зөвшөөрсөн.

Apache-д бүх зүйл арай өөрөөр хийгддэг. Хамгаалалт нь лавлах түвшинд тохируулагдсан. Харгалзах удирдамжийг ерөнхий php.ini тохиргооны файл болон .htaccess файлд хоёуланг нь байрлуулж болно. Энэ хоёр тохиолдолд зааврын багц нь адилхан бөгөөд хэн нэгний сервер дээрх вэбсайт/хуудас түрээслэх ихэнх хүмүүсийн хувьд эхний сонголт байхгүй байна. Тиймээс, та хандалтыг хязгаарлахаар төлөвлөж буй лавлахдаа .htaccess файл үүсгэж, дараа нь түүнд дараах зааврыг оруулна уу:

AuthType хяналтын төрөл- Үндсэн хэлбэрийг ихэвчлэн ашигладаг.

AuthName Нэр- хэрэглэгчийн нэр, нууц үг хүчинтэй байгаа бүсийн нэрийг зааж өгнө. Энэ нь хөтөч нууц үгийн харилцах цонхонд харуулдаг нэр юм. Өөр өөр лавлахуудад нэг ийм нэр тохируулснаар та хэрэглэгчдэд нэмэлт нууц үг оруулах цагийг хэмнэх боломжтой.

AuthGroupFile Нэр- бүлгүүд болон тэдгээрийн гишүүдийн нэрс хадгалагдаж буй файлын нэрийг заана. Түүний формат:
бүлэг1: гишүүн1 гишүүн2 ...
бүлэг2: гишүүн3 гишүүн4 ...

AuthUserFile Нэр- нууц үг бүхий файлын нэрийг зааж өгнө. Ерөнхийдөө үүнийг үүсгэхийн тулд та Apache түгээлтийн htpasswd хэрэгслийг ашиглах хэрэгтэй. Гэхдээ дор хаяж серверийн зарим хувилбаруудын хувьд энэ формат дараах байдалтай байна:
хэрэглэгч1: нууц үг 1
хэрэглэгч2: нууц үг2

Стандарт Perl функцийг ашиглан нууц үгийн нууц үгийг хялбархан олж авч болно:
$hash=crypt($pas,$давс);
$pass нь нууц үг, $salt нь хэш үүсгэхэд оролцдог хоёр тэмдэгтийн тэмдэгт мөр юм.

Тиймээс html маягтаар дамжуулан шинэ хэрэглэгч нэмэх, нууц үг солих гэх мэт үйл явцыг автоматжуулах бүрэн боломжтой юм.

хэрэглэгчийг шаарддаг хэрэглэгч1 хэрэглэгч2ба бүлгийг шаарддаг хэрэглэгч1 хэрэглэгч2өгөгдсөн лавлах руу ямар хэрэглэгчид болон бүлгүүд хандахыг зааж өгөх боломжийг танд олгоно.

шаардлагатай-хэрэглэгч нь системийн нууц үгийн файлд заасан бүх хэрэглэгчдэд хандах боломжийг олгодог.

... , хаана арга би HTTP аргыг тодорхойлдог. Жишээлбэл, энэ нь GET болон POST аргуудыг ашиглах тохиолдлуудад үүрлэсэн бус удирдамжийн хэрэглээг хязгаарладаг (ихэвчлэн энэ нь хангалттай байдаг).Үүрдсэн удирдамж нь шаардах, захиалах, зөвшөөрөх, үгүйсгэх байж болно.

Өөр нэг ашигтай удирдамж нь үгүйсгэх ба зөвшөөрөх - хориглох, хандахыг зөвшөөрөх зэрэг юм. Тэдгээрийг дараах байдлаар ашигладаг:
бүгдээс үгүйсгэх
192.168-аас зөвшөөрнө

Анхдагч байдлаар, бүх татгалзал эхлээд гүйцэтгэгдэж, дараа нь бүгд зөвшөөрөгддөг тул бүгдээс зөвшөөрөх нь ямар ч үгүйсгэлээс үл хамааран бүх хэрэглэгчдэд хандах боломжийг олгоно. Захиалгын удирдамжийн дагуу захиалгыг өөрчилж болно: захиалга өгөх, үгүйсгэх.

deny from all нь CGI-ээр хуудсуудыг хамгаалах хоёр дахь аргатай сайн таардаг; зочны ном гэх мэт бүх төрлийн нууц үгийг хамрахад хамгийн тохиромжтой нь энэ заавар юм. Энэ лавлахаас хуудас руу нэвтрэхийг оролдох үед хэрэглэгч байхгүй хуудасны тухай мессеж хүлээн авах болно.

Дашрамд хэлэхэд, энд дамжуулж байхдаа бие даасан алдаатай харьцаж байгааг харуулж байна: энэ тохиолдолд код 403, Хориотой. Хүн бүрийн дуртай 404 - Олдсонгүй, 401 - Зөвшөөрөгдөөгүй нь ижил аргаар боловсруулагддаг. Үүнийг хийхийн тулд ErrorDocument удирдамжийг .htaccess-д нэмнэ үү url код:
ErrorDocument 404 /cgi-bin/bad.pl
ErrorDocument 403 /cgi-bin/badaccess.pl
ErrorDocument 401 /cgi-bin/badaccess.pl

Бүх скрипт нь REQUEST_URI орчны хувьсагчийг ашиглан алдааны мессежийг үүсгэдэг тул та зүгээр л тохирох хуудсыг зааж өгч болно.

Эцсийн жишээнд бид дараах контент бүхий .htaccess файлыг ашигладаг.

AuthType BasicAuthName TestAuthGroupFile /my/local/path/tgroupAuthUserFile /my/local/path/tuserrequire group test

tgroup файлд зөвхөн нэг мөр байна - тест: нэвтрэх тест, tuser файлд - нэвтрэх (нууц үг) болон тестийн (туршилт) шифрлэгдсэн нууц үг. Таныг дахин энэ хуудсанд хандах үед хөтөч энэ талбарт дөнгөж нэвтэрсэн гэдгээ ойлгож, шаардлагагүй нууц үг оруулах хүсэлтээр хэрэглэгчийг зовоохгүй гэдгийг анхаарна уу.

Товчхондоо энэ нь вэб хуудсыг хамгаалахад шаардлагатай мэдээллийн хамгийн бага багц юм. Практикаас харахад та зөвхөн серверээс өгсөн хэрэгслүүд дээр суурилсан шийдлүүдэд бага багаар итгэх хэрэгтэй (дараа нь серверт өөр нүх нээгдэх хүртэл), боломжтой бол тэдгээрийг сонгох нь дээр.


Эрхэм найзууд аа, би та бүхнийг өөрийн блогтоо дахин угтаж байгаадаа баяртай байна. Өнөөдөр бид WordPress вэбсайтын хуудсан дээр нууц үг хэрхэн тохируулах талаар ярих болно, энд бүх зүйл маш энгийн, гэхдээ энэ нь юунд зориулагдсан вэ? Өнөөдөр би эдгээр болон бусад асуултанд хариулахыг хичээх болно.

Яагаад хуудсан дээр нууц үг оруулах ёстой вэ?

Заримдаа сайтын тодорхой хэсгүүдэд хандах хандалтыг хязгаарлах шаардлагатай байдаг; эдгээр хэсгүүд нь давуу эрхтэй хэрэглэгчдэд зориулсан мэдээллийг агуулж болно (ихэвчлэн дадлага хийдэг) эсвэл далд хэсгүүдэд нэвтрэх эрхийг төлбөртэй болгож болно. Төлбөрийг нэг удаа эсвэл захиалгын төлбөр хэлбэрээр, жишээлбэл, сард нэг удаа авч болно. Ингэснээр та найдвартай вэб хуудас үүсгэж, зочдод төлбөртэй хандах боломжтой болно.

Өнөө үед Интернет дээр төлбөртэй сургалтанд хамрагдах эсвэл тодорхой хуудсуудад төлбөртэй хандах боломжтой сайтуудаас мөнгө олох сэдвээр курс худалдаж авахыг санал болгож буй маш олон саналууд байгаа боловч та үүнийг худалдаж авах ёсгүй. Магадгүй та тэндээс шинэ зүйл олохгүй байх магадлалтай, гэхдээ та вэбсайтын хуудсан дээр нууц үг хэрхэн тохируулах, үүнийг хэрхэн өөрчлөх талаар энэ нийтлэлээс бүрэн үнэ төлбөргүй сурах болно.

Төлбөртэй хандалтаар мөнгө олох зарчим нь тодорхой гэж би бодож байна: нууц үг тохируулах, төлбөрийг хүлээн авах, нэвтрэх нууц үгийг илгээх. Хэрэв энэ нь захиалгын төлбөр бол сард нэг удаа нууц үгээ сольж, төлбөрөө дахин цуглуулж, шинэ нууц үг илгээнэ үү. Энэ бүгдийг e-autopay.com-ийн маш сайн үйлчилгээг ашиглан автоматжуулж болно, энэ үйлчилгээ нь төлбөр хүлээн авах, цахим болон физик барааг автоматаар илгээх, PIN код гэх мэт маш тохиромжтой, бүх зүйлийг тохиромжтой түншлэлийн програм болгон тохируулах боломжтой. анхаарлаа хандуулахыг зөвлөж байна , үйлчилгээг Азамат Ушанов, Александр Борисов болон бусад олон алдартай мэдээллийн бизнес эрхлэгчид ашигладаг. Дашрамд хэлэхэд, энэ нь e-autopay.com үйлчилгээнд бас хэрэгждэг.

Одоо WordPress сайтын хуудсан дээр нууц үг хэрхэн тохируулах талаар олж мэдье. Үүнийг хийхийн тулд бид мэдээж эхлээд хүссэн хуудсаа үүсгэж, дараа нь нийтлэлээ засахын тулд "Нийтлэх" таб руу очоод "засварлах" холбоос дээр дарж зургийг харна уу.

Дараа нь та харагдац, нийтийн, хувийн эсвэл нууц үгээр хамгаалагдсан цонхыг сонгох боломжтой бөгөөд нүүр хуудасны хамгийн дээд хэсэгт хуудсыг хавчуулж болно, гэхдээ бидэнд нууц үг хэрэгтэй, хүссэн функцээ сонгоод нууц үгээ тохируулна уу. хуудасны хувьд доорх зурагт үзүүлсэн шиг.

Дээрх бүх алхмуудыг хийсний дараа таны хийх ёстой зүйл бол хуудсыг зөв цагт нийтлэх явдал юм. Ийм энгийн аргаар та блогтоо нууц үг бүхий хуудсуудыг үүсгэж, улмаар янз бүрийн мэдээлэлд төлбөртэй эсвэл хязгаарлагдмал хандалтыг бий болгож чадна. Жишээлбэл, миний блог дээр үнэгүй сургалтанд хамрагдах боломж хязгаарлагдмал, зөвхөн энэ курст бүртгүүлсний дараа хандах боломжтой, бүртгэлийг идэвхжүүлсний дараа нэвтрэх нууц үг таны имэйл рүү илгээгддэг, бүх зүйл маш энгийн бөгөөд бүх зүйл автоматаар хийгддэг. Таны харж байгаагаар энэ талаар ямар ч төвөгтэй зүйл байхгүй, та өөрийн сайтын аль ч хуудас, нийтлэлд нууц үг тохируулах боломжтой.

Одоо та сайтын хуудас эсвэл нийтлэлд нууц үгээ хэрхэн оруулахаа мэддэг болсон. Энэхүү мэдээлэл нь танд ашиг тус, вэбсайт дээрээ мөнгө олох шинэ санаануудыг авчирна гэж найдаж байна. Би үргэлж энэ нийтлэлийн талаархи таны асуулт, сэтгэгдлийг тэсэн ядан хүлээж байна.

Хуудас дээр нууц үг оруулна уу

Энэ нийтлэл нь ямар нэгэн илчлэлт мэт дүр эсгэдэггүй; эдгээр бүх зүйл маш тодорхой бөгөөд өргөн тархсан байдаг. Гэхдээ саяхан вэб хуудсууд руу нэвтрэх эрхийг хязгаарлах талаар хэд хэдэн асуулт хүлээн авсны дараа би эдгээрийн хариултыг нэгтгэхээр шийдсэн.

Тиймээс бидний даалгавар бол тодорхой хуудсанд нэвтрэх нууц үгийг тохируулах явдал юм. Хамгаалалтын хамгийн анхдагч арга буюу JavaScript-ийн хэдэн мөрийг эхлүүлье.Код нь иймэрхүү зүйл юм.

Var pass = prompt("Нууц үгээ оруулна уу:", ""); if (pass == null) window.location = "bad.html"; else if (pass.toLowerCase() == "нууц үг") window.location = "ok.html"; else window.location = "bad..js"> юуг ч үндсэндээ өөрчлөхгүй.

Дээд түвшинд Java хэл дээр хэрэгжсэн ижил төстэй систем байдаг.

Хялбаршуулсан эх кодыг доор харуулав.

java.applet.* импортлох; java.awt.* импортлох; java.net.* импортлох; public class Нууц үг нь Апплетыг өргөтгөдөг ( TextField нэвтрэх, нууц үг; String Login = "нэвтрэх"; String Password = "Нууц үг"; public Password() ( ) public void init() ( Panel panel = new Panel(); panel.setLayout(шинэ) GridLayout(2,2)); нэвтрэх = шинэ TextField(20); нууц үг = шинэ TextField(20); panel.add(шинэ Шошго("Нэвтрэх:")); panel.add(нэвтрэх); panel.add(шинэ) Шошго("Нууц үг:")); panel.add(нууц үг); нэмэх(самбар); нэмэх(шинэ товч("Ok")); ) нийтийн логикийн үйлдэл (Үйл явдал evt, Объект объект) ( if(evt.target instanceof) Товч) ( Мөр s; if(login.getText().тэгш(Нэвтрэх) && password.getText().equals(Нууц үг)) ( s = "http://www.webclub.ru/materials/ pagepsw/ok. html"; ) else ( s = "http://www.webclub.ru/materials/pagepsw/bad.html"; ) оролдоно уу ( getAppletContext().showDocument (шинэ URL(ууд)); ) catch(Exception e) ( password.setText(e.toString()); ) үнэнийг буцаана; ) худал буцаана; ) )

Энэ апплетыг хуудсанд оруулснаар та дараах зүйлийг авах боломжтой.

Нууц үг шалгах

Үүнийг илүү ухаалаг болгож, хэрэглэгч бүрт тусдаа хуудас үүсгэх, файлаас өгөгдлийг уншихыг албадах гэх мэт боломжтой. Үндсэн сул тал нь хүн хайж буй хуудсандаа нэг удаа орсон бол энэ URL-г санахад хэн ч саад болохгүй, тиймээс энэ нь нэг удаагийн хэрэгсэл юм. Мэдээжийн хэрэг, та URL хаягийг хаягийн мөрөнд харуулахгүйн тулд хуудсаа хүрээ дотор нууж болно, гэхдээ та энэ хамгаалалтыг хэнээс авахыг ойлгож байна. Дахин хэлэхэд, апплет нь бүхэлдээ үйлчлүүлэгчид очдог бөгөөд зарчмын хувьд судалгаанд бүрэн бэлэн байдаг.

CGI-ийн хэрэглээнд суурилсан шийдэл нь хамгийн сүүлийн сул талгүй. Энгийн Perl скрипт нь иймэрхүү харагдаж байна:

#!/usr/bin/perl ашиглах CGI qw(:стандарт); $query = шинэ CGI; $ok = "ok.html"; $ хаяг = "муу.html"; $login = "нэвтрэх"; $нууц үг = "нууц үг"; $l = $query->param("нэвтрэх"); $p = $query->param("нууц үг"); if(($p eq $нууц үг) && ($l eq $нэвтрэх)) ( $хаяг = $ok; ) хэвлэх $query->redirect($address);

Хэрэглээний жишээ:

Нууц үг шалгах

Эхний дутагдлыг арилгахын тулд та URL хаягаа өгөхгүйгээр дотор нь хаа нэгтээ нуусан хуудас дээр үндэслэн шинэ хуудсыг динамикаар үүсгэж болно.

Өөрчлөгдсөн код:

#!/usr/bin/perl ашиглах CGI qw(:стандарт); $query = шинэ CGI; $ok = "ok.html"; $ хаяг = "муу.html"; $docroot = $ENV("BACUMENT_ROOT"); $localpath = "/materials/pagepsw/"; $login = "нэвтрэх"; $нууц үг = "нууц үг"; $l = $query->param("нэвтрэх"); $p = $query->param("нууц үг"); if(($p eq $нууц үг) && ($l eq $нэвтрэх)) ( $хаяг = $ok; ) $query->толгой(); нээлттэй(FL, $docroot.$localpath.$хаяг); while() ( # Энд та html кодыг шууд өөрчлөх боломжтой # Яагаад? За, та хэзээ ч мэдэхгүй... :) хэвлэх $_; )хаах(FL);

Хэрэглээний жишээ:

Нууц үг шалгах

Таны харж байгаагаар үүнтэй төстэй зүйл байсан бол SSI-ийн зардлаар файлын URL-г харуулахаа больсон (гэхдээ үүнийг гаралтын явцад барьж, гараар боловсруулж болно). Гэхдээ энд ч гэсэн URL-г таах онолын боломж байсаар байгаа бөгөөд хуудсуудад орсон бүх төрлийн зургууд нь мэдээжийн хэрэг харьцангуй замыг ашиглахад муу үйлчилгээ үзүүлж болохыг мартаж болохгүй.

Эцэст нь хэлэхэд, нэвтрэх нууц үгийг тохируулах хамгийн найдвартай арга бол серверийн хэрэгслийг ашиглах явдал юм - үүнийг хүмүүс хийчихсэн юм биш. Би хоёр дээр анхаарлаа хандуулах болно - Apache хамгийн алдартай, IIS нь бас алдартай :)

IIS-ийн хувьд бүх зүйл маш энгийн байдаг - хамгаалалтыг NTFS ашиглан гүйцэтгэдэг бөгөөд энэ нь мэдээжийн хэрэг серверийн бус администраторуудын чадавхийг тодорхой хэмжээгээр хязгаарладаг. Санаа нь дараах байдалтай байна: сайтын бүх зочдод анхдагчаар ажилладаг IUSR_xxxx хэрэглэгч нь хүссэн файл/санд хандах эрхгүй. Үүний дараа Properties->Security хэсэгт үүнийг тодорхой заасан хэрэглэгчид л эдгээр файлд хандах эрхтэй болно. Тэднийг бүлэг болгон нэгтгэх нь илүү тохиромжтой гэдэг нь ойлгомжтой. Энд хэд хэдэн нарийн зүйл бий. Нэгдүгээрт, заасан хэрэглэгчдэд нэвтрэх эрхийг дотооддоо өгөх ёстой (Хэрэглэгчийн менежер дэх Бодлого->Хэрэглэгчийн эрх) Хоёрдугаарт, хэрэв та WWW тохиргоон дотроос WWW үйлчилгээний үндсэн баталгаажуулалтыг (Текстийг цэвэрлэх) сонгохгүй бол зөвхөн Internet Explorer-ийн хэрэглэгчид л нэвтрэх болно. зөвшөөрөгдсөн "А.

Apache-д бүх зүйл арай өөрөөр хийгддэг. Хамгаалалт нь лавлах түвшинд тохируулагдсан. Харгалзах удирдамжийг ерөнхий тохиргооны файл (хэсэгт) болон .htaccess файлд хоёуланг нь байрлуулж болно. Энэ хоёр тохиолдолд зааврын багц нь ижил бөгөөд хэн нэгний сервер дээрх вэбсайт/хуудас түрээслэх ихэнх хүмүүсийн хувьд хоёр дахь арга нь илүү хамааралтай байдаг. Тиймээс, та хандалтыг хязгаарлахаар төлөвлөж буй лавлахдаа .htaccess файл үүсгэж, дараа нь түүнд дараах заавруудыг оруулна уу (би голыг нь жагсаах болно):

AuthType хяналтын төрөл- Үндсэн хэлбэрийг ихэвчлэн ашигладаг.

AuthName Нэр- хэрэглэгчийн нэр, нууц үг хүчинтэй байгаа бүсийн нэрийг зааж өгнө. Энэ нь хөтөч нууц үгийн харилцах цонхонд харуулдаг нэр юм. Өөр өөр лавлахуудад нэг ийм нэр тохируулснаар та хэрэглэгчдэд нэмэлт нууц үг оруулах цагийг хэмнэх боломжтой.

AuthGroupFile Нэр- бүлгүүд болон тэдгээрийн гишүүдийн нэрс хадгалагдаж буй файлын нэрийг заана. Түүний формат:
бүлэг1: гишүүн1 гишүүн2 ...
бүлэг2: гишүүн3 гишүүн4 ...

AuthUserFile Нэр- нууц үг бүхий файлын нэрийг зааж өгнө. Ерөнхийдөө үүнийг үүсгэхийн тулд та Apache түгээлтийн htpasswd хэрэгслийг ашиглах хэрэгтэй. Гэхдээ дор хаяж серверийн зарим хувилбаруудын хувьд энэ формат дараах байдалтай байна:
хэрэглэгч1: нууц үг 1
хэрэглэгч2: нууц үг2

Стандарт Perl функцийг ашиглан нууц үгийн нууц үгийг хялбархан олж авч болно:
$hash=crypt($pas,$давс);
$pass нь нууц үг, $salt нь хэш үүсгэхэд оролцдог хоёр тэмдэгтийн тэмдэгт мөр юм.

Тиймээс html маягтаар дамжуулан шинэ хэрэглэгч нэмэх, нууц үг солих гэх мэт үйл явцыг автоматжуулах бүрэн боломжтой юм.

хэрэглэгчийг шаарддаг хэрэглэгч1 хэрэглэгч2ба бүлгийг шаарддаг хэрэглэгч1 хэрэглэгч2өгөгдсөн лавлах руу ямар хэрэглэгчид болон бүлгүүд хандахыг зааж өгөх боломжийг танд олгоно.

шаардлагатай-хэрэглэгч нь системийн нууц үгийн файлд заасан бүх хэрэглэгчдэд хандах боломжийг олгодог.

... , хаана арга би HTTP аргыг тодорхойлдог. Жишээлбэл, энэ нь GET болон POST аргыг ашиглах тохиолдолд үүрлэсэн удирдамжийн хэрэглээг хязгаарладаг (ихэвчлэн энэ нь хангалттай байдаг). Заавруудыг үүрлэж болно: шаардах, захиалах, зөвшөөрөх, үгүйсгэх.

Өөр нэг ашигтай удирдамжууд нь үгүйсгэх, зөвшөөрөх - хориглох, хандахыг зөвшөөрөх явдал юм. Иймэрхүү зүйлийг хэрэглэнэ үү:
бүгдээс үгүйсгэх
192.168-аас зөвшөөрнө

Анхдагч байдлаар, эхлээд бүх татгалзлыг гүйцэтгэнэ, дараа нь бүгдийг зөвшөөрнө, тиймээс бүгдээс зөвшөөрөх нь ямар ч үгүйсгэлээс үл хамааран бүх хэрэглэгчдэд хандах боломжийг олгоно. Захиалгыг захиалгын удирдамжаар өөрчилж болно: захиалахыг зөвшөөрөх, үгүйсгэх.

deny from all нь CGI-ээр хуудсуудыг хамгаалах хоёр дахь аргатай сайн таардаг; зочны ном гэх мэт бүх төрлийн нууц үгийг хамрахад хамгийн тохиромжтой нь энэ заавар юм.

Дашрамд хэлэхэд, энд дамжуулж байхдаа бие даасан алдаатай харьцаж байгааг харуулж байна: энэ тохиолдолд код 403, Хориотой. Хайрт 404, Олдоогүй, 401, Зөвшөөрөгдөөгүй зэрэг нь адилхан боловсруулагдсан. Үүнийг хийхийн тулд ErrorDocument удирдамжийг .htaccess-д нэмнэ үү url код:
ErrorDocument 404 /cgi-bin/bad.pl
ErrorDocument 403 /cgi-bin/badaccess.pl
ErrorDocument 401 /cgi-bin/badaccess.pl

Бүх скрипт нь REQUEST_URI орчны хувьсагчийг ашиглан алдааны мессежийг үүсгэдэг тул та зүгээр л тохирох хуудсыг зааж өгч болно.

Эцсийн жишээнд бид дараах контент бүхий .htaccess файлыг ашигладаг.

AuthType үндсэн AuthName тест AuthGroupFile /.../pagepsw/deny/tgroup AuthUserFile /.../pagepsw/deny/tuser шаардлагатай бүлгийн тест

tgroup файлд зөвхөн нэг мөр байна - тест: нэвтрэх тест, tuser файлд - нэвтрэх (нууц үг) болон тестийн (туршилт) шифрлэгдсэн нууц үг. Таныг дахин энэ хуудсанд хандах үед хөтөч энэ талбарт дөнгөж нэвтэрсэн гэдгээ ойлгож, шаардлагагүй нууц үг оруулах хүсэлтээр хэрэглэгчийг зовоохгүй гэдгийг анхаарна уу.

Товчхондоо энэ нь вэб хуудсыг хамгаалахад шаардлагатай мэдээллийн хамгийн бага багц юм. Практикаас харахад та зөвхөн серверээс өгсөн хэрэгслүүд дээр суурилсан шийдлүүдэд бага багаар итгэх хэрэгтэй (дараа нь серверт өөр нүх нээгдэх хүртэл), боломжтой бол тэдгээрийг сонгох нь дээр.

Лавлах эсвэл файлыг нууц үгээр түгжих энгийн аргуудыг авч үзсэн болно. Күүки ашиглан хэрэглэгчийг хэрхэн зөвшөөрөх вэ. PHP4-д суурилуулсан сесс механизмаар дамжуулан хэрэглэгчийн таних.

Хуудасны нууц үг. 1-р хэсэг. Онолын хувьд.

Би сайтын нэг хэсгийг нууц үгээр хамгаалах арга замыг тайлбарлахаар шийдсэн. Энэ сэдэв нь үнэндээ нэлээд том тул би анх удаагаа php+mysql зөвшөөрлийг хязгаарлах болно.

Хамгийн эхний асуулт бол удирдлагын скрипт бүхий санг нууц үгээр хэрхэн хаах вэ гэсэн асуулт юм. Энэ тохиолдолд ямар ч эргэлзэх шаардлагагүй - нэг буюу хэд хэдэн администратор ижил эрхтэй бөгөөд зан чанар нь ховор өөрчлөгддөг. Энэ нөхцөлд хамгийн хялбар арга бол стандарт серверийн зөвшөөрлийг ашиглах явдал юм - .htaccess болон .htpasswd файлуудыг байрлуулж, тэдгээрт шаардлагатай параметрүүдийг бичнэ үү.

Би хоёр зүйл нэмнэ. Эхнийх нь .htpasswd файлыг хаана байрлуулах вэ. Туршилтаар би хэрэв жишээ нь алдааны мэдэгдэл бүхий баримт бичигт хүрэх замыг (ErrorDocument) DocumentRoot системийн хувьсагчтай харьцуулан бичсэн бол гэдгийг олж мэдсэн. Гэхдээ нууц үгийн файлд хүрэх зам (UserFile) нь ServerRoot-тэй холбоотой бичигдсэн байдаг. Миний ойлгож байгаагаар та .htpasswd-г ServerRoot-ийн дээр тавьж болохгүй - "../" нь ойлгогдоогүй байна. Энэ бүхэн нь нууц үг бүхий файлыг, жишээлбэл, сайтын үндсэн лавлахаас нэг түвшний өндөрт байрлуулж болох бөгөөд ингэснээр сүлжээнээс файл руу нэвтрэх боломжгүй болно.

Хоёр дахь нь скрипт нь үүнийг хэн нээж байгааг болон нууц үгийг олж мэдэх боломжтой: $PHP_AUTH_USER болон $PHP_AUTH_PW хувьсагч.

Энэ аргын гол сул тал нь сервер нууц үг таахыг хориглож чадахгүй байгаа явдал юм (хэд хэдэн амжилтгүй нэвтрэх оролдлогын дараа хэрэглэгч нэг эсвэл хоёр цаг хүлээхийг шаарддаг бөгөөд энэ хугацаанд түүний IP хаягаас ирсэн дуудлагыг үл тоомсорлодог). Үүнийг Apache-ийн албан ёсны баримт бичигт бичсэн болно.

Өөр нэг дутагдалтай тал бол хэрэглэгчийг устгах эсвэл шинээр оруулахдаа нууц үгтэй файлуудыг дахин бичих шаардлага юм. Гэхдээ энэ нь ховор тохиолддог бол энэ арга нь хангалттай бөгөөд та зөвшөөрлийн механизм бичих талаар санаа зовох хэрэггүй болно.

Зөвшөөрлийн автоматжуулалт

Энэ нь зөвхөн олон тооны хэрэглэгчидтэй ажиллах, тэдний эргэлтийг хялбарчлахад зайлшгүй шаардлагатай. Хэрэв та хэрэглэгчдийн талаар нэмэлт мэдээллийг хадгалах шаардлагатай бол эсвэл эрхийн уян хатан ялгаа хэрэгтэй бол мэдээллийн сан руу зөвшөөрлийг шилжүүлэх нь дээр.

Хаалттай нутаг дэвсгэрийн хуудас бүр нь дараах код бүхий файлыг агуулна.

$result = mysql_query(" SELECT * FROM person FROM HHERE login="". preg_replace("/[^\\w_-]/","",$PHP_AUTH_USER). "" БА нэвтрүүлэх = "". md5($PHP_AUTH_PW) . """); if (@mysql_num_rows($result)!=1) ( header("WWW-Authenticate: Үндсэн хүрээ=\"Хэрэглэгчийн талбар\""); header("HTTP/1.0 401 Зөвшөөрөгдөөгүй"); print("Нэвтрэхийн тулд сайтын хэрэглэгчийн талбарт та хэрэглэгчийн нэр, нууц үгээ оруулах ёстой."); exit(); ); $user_row = mysql_fetch_array($үр дүн);

Эхний мөрөнд үсэг, тоо, зураас, доогуур зураасаас бусад бүх тэмдэгтүүд нэвтрэхээс хасагдана. Дараа нь хүлээн авсан мөрүүдийн тоог шалгаж, зөвхөн нэг мөр байгаа тохиолдолд хандах эрх олгоно. Бусад тохиолдолд хэрэглэгч хөтөч дээр нэвтрэх болон нууц үгээ оруулахыг хүссэн цонхыг харах болно. Хэрэв хэрэглэгч амжилттай нэвтэрсэн бол $user_row массив дахь түүний талаарх бүх мэдээлэл бидэнд байна.

Мэдээжийн хэрэг, миний хэлсэн жишээ нэлээд олон дутагдалтай талуудтай. Нууц үг таах оролдлогын золиос болохгүйн тулд үүнийг нэг нэгээр нь дахин бичиж болохгүй, учир нь
1. энд сонголтоос хамгаалах ямар ч хамгаалалт байхгүй
2. Хэрэв хэрэглэгчийн хүснэгт том бол нууц үгийг таахад халдагчид мэдээллийн санг дарах магадлалтай.

Өнөөдрийн хамгийн сүүлийн арга бол күүки дэх шифрлэгдсэн өгөгдлийг хадгалах явдал юм.

Нэвтрэх скрипт байдаг, үлдсэн хэсэг нь зөвхөн хаалттай хэсэгт үйлдлүүдийг үргэлжлүүлэх боломжийг олгодог кодыг агуулдаг - хэрэв күүкийн хугацаа дуусах эсвэл та тэндээс гарвал нэвтрэх хуудас руу буцах шаардлагатай болно.

Оролтын скрипт нь нэвтрэх болон нууц үгээ шалгаж, хоёр күүки гаргадаг. Эхнийх нь - хэрэглэгчийг нэн даруй тодорхойлохын тулд нэвтрэх (мэдээллийн санд нэвтрэх талбар нь мэдээжийн хэрэг өвөрмөц эсвэл бүр түлхүүр юм). Хоёрдахь күүки нь нэвтрэх хугацаа, нууц үгийн хэшийг агуулдаг (нууцыг хадгалахын тулд би эдгээр мөрөнд "Y" үсгийг нэмдэг - тэгвэл хэшийг олох бараг боломжгүй юм :).

Бусад бүх программууд нь дараах үйлдлийг гүйцэтгэдэг кодыг агуулдаг. Өгөгдлийн санд хүсэлт гаргах - хүлээн авсан нэвтрэлт бүхий мөрийг сонгоно. Энэ мөрөөс "лог_цаг" талбар болон нууц үгийг авч, дээр дурдсанчлан тэдгээрээс хэш үүсгэдэг. Хүлээн авсан зүйлтэйгээ харьцуулж, таарвал нууц үг, цаг, "Y" үсгээс дахин шинэ хэш күүки гаргаж, мэдээллийн санд "UPDATE user SET log_time="..." ХААНА нэвтрэх хүсэлтийг хийнэ. = "$cookie_login"".

Хэрэв (isset($HTTP_COOKIE_VARS[$cookie_login]) && isset($HTTP_COOKIE_VARS[$cookie_code])) ( $login = $HTTP_COOKIE_VARS[$cookie_login]; $code = $HTTP_COOKIE_VARS[$SELECT_cookie_VARS[$SELECT; огнооны_формат(log_date,"%Y%m%d%H%i%s") log_date1, нэвтрүүлэх,uid FROM хэрэглэгч ХААНА email="$login" БОЛОН log_date>"DATE_SUB(NOW(),INTERVAL 15 MINUTE)"" ); хэрэв (!mysql_error() && @mysql_num_rows($result)==1) ( $log_time0 = time(); $log_time1 = date("YmdHis", $log_time0); $log_time2 = date("Y-m-d H:i :s", $log_time0); $current_user = mysql_fetch_array($result); if (md5($current_user["pass"].$current_user["log_date1"].$md5letter) == $code) ( mysql_query("UPDATE) хэрэглэгчийн SET log_date="$log_time2" WHERE uid=".$current_user["uid"]); setcookie($cookie_code, md5($current_user["pass"].$log_time1.$md5letter), time()+900, $site_path); $auth = үнэн; ) өөрөөр тохируулаагүй ($ одоогийн_хэрэглэгч); ); );

Дахин хэлэхэд серверийг сонгох, дайрахаас хамгаалах ямар ч хамгаалалт байхгүй (дашрамд хэлэхэд та энд "Y" үсгийн оронд хэрэглэгчийн IP хаягийг бичиж болно - жишээлбэл, оффисын хөрш нь файлыг авч чадахгүй. күүки болон түүний компьютерээс нэвтэрнэ үү).

Хуудасны нууц үг. 2-р хэсэг. Ажилд авахыг хориглох

Өнгөрсөн удаад энэ дугаарыг нийтлэх үед тэд намайг газар дээр нь өшиглөж, ийм бөглөрөл нь серверийг замаас гаргаж болзошгүй гэж хэлсэн.

Гэхдээ эхлээд самбараас бөмбөг авалтын талаар. Гайхалтай, гэхдээ одоо ч гэсэн. Латин үсэг, тооноос бүрдэх арван тэмдэгтээс бүрдэх нууц үг нь маш олон сонголттой гэсэн үг юм. Хэрэв та нууц үгийг секундэд 1,000,000 удаа тааварлавал хэдэн мянган жил болно. Гэхдээ ийм gobbledygook санахад хэцүү байдаг тул бид ихэвчлэн утга учиртай үгсээр нууц үг хийдэг. Хэдэн жилийн өмнө ихэнх нууц үгийг 10,000 үгтэй толь бичгийг ашиглан тааж болох нь тогтоогдсон. Нэгэн цагт сүлжээнд нэг өт (тиймэрхүү вирус) гарч ирэн, Юниксийн серверүүд дээр хамгаалалтын цоорхойг ашиглан авирч, Юниксийн системийн зөв бичгийн дүрмийн толь бичгийг ашиглан давуу эрхтэй хэрэглэгчдийн нууц үгийг авдаг байжээ. Юу ч авч явах шаардлагагүй байсан!

Хэрэглэгч бүр зөв нэвтрэх нэр, нууц үгээ оруулах хүртэл муу хакер гэж тооцогддог. Хэрэглэгч ямар нэг зүйлийг буруу оруулсан тохиолдолд бид юу хийх вэ?

  • мартамхай байдал (үүнд тохиромжтой вэбсайтууд системийн тохиргоонд оруулсан имэйл рүү ижил нууц үгийг илгээх "нууц үгээ мартсан" маягттай байдаг)
  • эрхлүүлэх (“надад хамаагүй учраас”)
  • толь бичиг ашиглан нууц үг сонгох (амжилттай сонголт хийх магадлал өндөр тул та үүнийг хаах хэрэгтэй, ялангуяа сайт нь арилжааны шинж чанартай бол)
  • DoS халдлага (серверийг хэт ачаалахгүйн тулд та энэ тохиолдолд скриптийн хийх үйлдлийг багасгах хэрэгтэй)

    Хамгаалалтын механизм нь файл дээр суурилдаг бол би серверт хэт ачаалал үүсгэж болох талаар удаан бодсон. Энэ нь амархан болсон (энэ нь хэр их үнэтэй байх нь өөр асуулт юм). Тиймээс, скрипт нь секундэд 1000 удаа бичихийн тулд файлуудыг нээж, тэдгээрт өгөгдөл бичихийг оролдвол сервер үүнийг зохицуулах боломжгүй болно гэж бодъё. Нэвтрэх гэж 5 удаа оролдсоны дараа (файл руу ямар ч өгөгдөл бичихгүйгээр) хэрэглэгч шууд нэвтрэх эрхгүй болох тул та 200 өвөрмөц IP олох хэрэгтэй бөгөөд үүнээс та тус бүрдээ таван удаа холбоо барих хэрэгтэй. Энэ боломжтой. Бид баннер гүйлгэх хэсэгт таван шошго бүхий html баннер өлгөдөг.

    Хэрэглэгч тэр даруй таван хүсэлт гаргадаг; сервер файл руу таван удаа бичдэг (дашрамд хэлэхэд, зарим хөтөч дээр нэвтрэх, нууц үгээ оруулах цонх гарч ирэх болно). Та ийм таван зурагтай HTML хуудас хийж, өөрийн зочилж буй сайтдаа iframe-ээр дамжуулан хуудсыг оруулж болно (iframe-ээр дамжуулан лавлагааны талбар олдохгүй. Үнэгүй сайтын дэмжлэг үзүүлэх үйлчилгээ нь боломжгүй юм. Хостинг нь лавлагаа хайхдаа лог файлуудыг ухах гэх мэт зүйлсийг шийдвэрлэх болно). Миний хэлсэн жишээнүүд мэдээжийн хэрэг, алсын хараатай боловч тогтолцооны ийм алдааг ашиглаж болно гэдэг нь өөрөө нотлогдсон. Дашрамд хэлэхэд, үүнтэй төстэй зүйл аль хэдийн тохиолдсон.

    Гэхдээ би энэ аргыг өгөх болно - би үүнийг дэмий л бичсэн юм уу? Дашрамд хэлэхэд, .htaccess файлыг дараах агуулгатай лавлахад байрлуулснаар хязгаарлагдмал тооны хаягуудад (жишээлбэл, компанийн дотоод сүлжээнд) ашиглах боломжтой.

    Xxx.xxx.xxx-аас татгалзах захиалга, бүхнээс татгалзахыг зөвшөөрөх

    Мөн энд програмын код байна:

    $алдаа = 0; $fn = "үл тоох/". preg_replace("[^\d\.]", "", $REMOTE_ADDR. ".". $HTTP_FORWARDED_FOR); if (is_file($fn)) ( if (filetime($fn))< time()-3600) unlink($fn); else $errors = fread(fopen($fn, "r"), 2); }; if ($errors>5) ( хэвлэх ("Хандалт хаагдсан. Нэг цагийн дараа буцаж ирнэ үү."); exit(); );

    // энд өгөгдлийн сангийн сервертэй холболт үүссэн. хэрэглэгчийг тэр даруй "зодох" тохиолдолд дэмий гар хүрэхгүйн тулд.

    $result = mysql_query("SELECT * FROM user WHERE login="". preg_replace("/[^\w_\-]/", "", $PHP_AUTH_USER). "" БА нэвтрүүлэх = "". md5($PHP_AUTH_PW) . """); if (@mysql_num_rows($result)!=1) (толгой("WWW-Authenticate: Үндсэн хүрээ=\"нууц бүс\""); толгой("HTTP/1.0 401 Зөвшөөрөлгүй"); хэвлэх ("Зөвшөөрөл шаардлагатай") ; fwrite(fopen($fn, "w"), ++$алдаа); exit(); ); $ одоогийн_хэрэглэгч = mysql_fetch_array($ үр дүн); mysql_free_result($үр дүн);

    Гэсэн хэдий ч мэдээллийн сан байгаа бол файлуудтай ажиллах нь нүгэл юм. Хошигнол. Амжилтгүй зөвшөөрлийн хувьд хүснэгт үүсгэнэ үү:

    CREATE TABLE unaauth (хэрэглэгчийн нэр VARCHAR(64) NOT NULL, VARCHAR(64) NOT NULL, ip VARCHAR(255), нэвтрэх TIMESTAMP)

    Мөн бид файлд хандахын оронд мэдээллийн сантай ажилладаг.

    $алдаа = @mysql_result(mysql_query("SELECT count(хэрэглэгчийн нэрийг) худал гэж FROM unath logintime FROM WHERE logintime>DATE_SUB(NOW(),INTERVAL 1 HOUR) AND ip="$REMOTE_ADDR""),0); хэрэв (mysql_error()) үхэх(mysql_error()); if ($errors>5) ( хэвлэх ("Хандалт хаагдсан. Нэг цагийн дараа буцаж ирнэ үү."); exit(); ); $result = mysql_query("SELECT * FROM user WHERE login="". preg_replace("/[^\w_\-]/", "", $PHP_AUTH_USER). "" БА нэвтрүүлэх = "". md5($PHP_AUTH_PW) . """); if (@mysql_num_rows($result)!=1) (толгой("WWW-Authenticate: Үндсэн хүрээ=\"нууц бүс\""); толгой("HTTP/1.0 401 Зөвшөөрөлгүй"); хэвлэх ("Зөвшөөрөл шаардлагатай") ; mysql_query("INSERT INTO unauth (хэрэглэгчийн нэр, нэвтрэх, ip) VALUES ("$PHP_AUTH_USER", "$PHP_AUTH_PW", "$REMOTE_ADDR $HTTP_X_FORWARDED_FOR")"); exit(); ); $ одоогийн_хэрэглэгч = mysql_fetch_array($ үр дүн); mysql_free_result($үр дүн);

    Статистикийн хувьд хуучин бүртгэлийг хадгалах эсэх нь бизнесийн шийдвэр юм. Хэрэв ямар нэг зүйл байвал зөвшөөрөл авахаас өмнө дараах хүсэлтийг биелүүлснээр тэдгээрийг устгаж болно:

    DELETE FROM unauth WHERE logintimeDATE_SUB(NOW(), INTERVAL 30 MINUTE)"); if (!mysql_error() && @mysql_num_rows($login_result)==1) ( /* Хүснэгтийн мөрийг аваад шаардлагатай талбаруудын хэш үүсгэнэ үү. */ $ current_user = mysql_fetch_array($login_result); $hash_to_check = md5($current_user["passwd"]. "Y - тиймээс хэн ч таамаглахгүй." $current_user); if ($hash_to_check == $HTTP_COOKIE_VARS[$]COOKIE_VARS_) ( $current_time = time(); /* Сүүлийн нэвтрэх талбарыг шинэчилж, шинэ күүки гарга. */ mysql_query("UPDATE user SET last_log="". date("Y-m-d H:i:s", $current_time). " " WHERE login=" $login""); setcookie($COOKIE_HASH_NAME, md5(огноо("Y-m-d H:i:s", $current_time). "Y - хэн ч тааварлахгүй." $current_user["passwd"] ), $current_time + 1800 , $COOKIE_PATH); ) else ( /* Хэрэв хэш таарахгүй бол хэрэглэгч нэвтрэх хуудас руу шилжинэ. */ header ("Байршил: /login.php"); exit; ); ) elseif (!mysql_error() && @mysql_num_rows ($log_result)!=1) ( толгой("Байршил: /login.php"); гарах; ) өөрөөр хэвлэх (mysql_error());

    Мэдээжийн хэрэг "Y - хэн ч тааварлахгүй"Үүнийг тусдаа хувьсагч болгон хуваах нь дээр бөгөөд энэ мөрийн оронд зочны IP хаягийг (эсвэл эвдэрсэн залгах үед IP хаягийн эхний хоёр/гурван тоо) ашиглах нь дээр.

    Дашрамд хэлэхэд, IP хаягийн талаар. Үүнийг шалгах нь илүү дээр юм, гэхдээ хаягийг бүхэлд нь биш, харин зөвхөн эхний хоёр (127-оос бага тоогоор эхэлсэн IP) эсвэл гурван (тус тус 127-оос дээш) хаягийг шалгана. Энэ нь муу, тасалдсан залгалттай хэрэглэгчдийг холболт тасарсаны дараа дахин нэвтрэхээс аврах бөгөөд үүнтэй зэрэгцэн күүки хулгайлсан халдагч нэвтрэхийг зөвшөөрөхгүй. Мэдээжийн хэрэг, тэр дахин залгаж, өөр үйлчилгээ үзүүлэгчээр дамжуулан нэвтрэх боломжгүй болно - усан сангийн хаяг ижил биш, гэхдээ энэ нь бидний асуудал биш ("энэ цаг агаарт тэд гэртээ үлддэг"). Компанийн нууц үг хулгайлах нь бидний асуудал биш юм. Бид сониуч нөхдүүд, бичиг үсэг мэдэхгүй хакеруудаас хамгаалсан боловч хохирогч дээр суулгаж болох троян, үнэрчний эсрэг юу ч хийж чадахгүй.

    Энд л "хонх ба шүгэл" дуусдаг. Хамгаалалт илүү найдвартай байх боломжгүй. Хэн ч хэшийн күүки файл руу орж, түүнийг авахгүй. Хэрэглэгч болон вэб интерфейсийн хооронд sniffer байрлуулж нууц үгээ олоход хялбар байх болно. Та хэрэглэгчийн гар дээр оруулсан бүх зүйлийг санах троян суулгаж болно, гэхдээ энэ нь бидний асуудал байхаа больсон. Сувгийг чагнахаас хамгаалахын тулд та SSL холболт эсвэл өгөгдлийн шифрлэлтийг ашиглах ёстой.

    Хуудасны нууц үг. 5-р хэсэг. Хурал

    Би яагаад жигнэмэгийн талаар тэмдэглэл бичсэн юм бэ? "PHP сесстэй байхад яагаад күүкиний тухай бичээд байгааг би ойлгохгүй байна уу?!" Дараа нь уншигчдын нүдэн дээр хавтгай зураг гарахгүйн тулд. Одоогоор хаа сайгүй PHP хувилбар 4 байдаггүй бөгөөд 3-р хувилбарыг дэмждэггүй. Нэмж дурдахад, сессүүд нь хаа сайгүй шаардлагагүй байдаг - ховор тохиолдлоос бусад тохиолдолд зөвшөөрлийн алгоритм нь нэвтрэх/нууц үгийн зөв, сессийн өгөгдлийн зөв эсэхийг шалгаж, дараа нь үйлчлүүлэгчийг нэвтрэх хуудас руу буцаах, эсвэл массив (эсвэл объект) авдаг. ) хэрэглэгчийн тухай мэдээлэлтэй.

    Хурал дээр ажиллах шаардлагатай тохиолдол тийм ч их тохиолддоггүй. Жишээлбэл, "Монополист" тоглоомондоо би тэр даруй сешнүүдийг ашиглаж эхэлсэн, учир нь хэрэглэгч хэд хэдэн тоглоом тоглох боломжтой бөгөөд нэг сессийн нэг хуудсанд өөр өөр өгөгдөл агуулагдаж болно. Тэнд хэрэглэгч сессэд оролцож буй аль нэг тоглоомын өгөгдлийг хадгалах, тоглоом хооронд шилжих хуудас үүсгэх нь дээр.

    Ерөнхийдөө би сессийг ашиглах ёсгүй гэж хэлэхгүй байна. Энэ нь зайлшгүй шаардлагатай, гэхдээ бүх зүйл өөрийн гэсэн байр суурьтай байдаг. Би 401 толгой ("хүрээ"), күүки эсвэл сессээр дамжуулан зөвшөөрлийн гурван аргыг хэрэглэх эсэх тухай асуултад дараа нь буцах болно. Одоо хуралдааны талаар ярилцъя.

    PHP дахь сессүүд нь үнэндээ зөвшөөрлийн арга биш (үзэл баримтлал нь өөрөө буруу боловч форум дээр тэд яг "хэрэглэгчийг сессээр дамжуулан хэрхэн зөвшөөрөх вэ?" Гэж асуудаг). PHP-д суурилуулсан хэрэглэгчийн сессийн механизм нь зөвхөн эдгээр хэрэглэгчдийг тодорхойлдог; зөвшөөрөл нь дахин таны скриптийн ажил юм.

    Би танд хуралдааны механизмын талаар нэг их хэлэхгүй - аль хэдийн хэлсэн. Хамгийн энгийн хэлбэрээр (эсвэл хамгийн анхдагч хэлбэрээр) энэ механизм нь дараах байдлаар ажилладаг: систем нь сервер дээр өөрийн хувьсагчдыг агуулсан сесс файлыг хадгалдаг. Сеанс эхлүүлэх үед хэрэглэгч өвөрмөц танигч (ихэвчлэн күүкигээр дамжуулан) хүлээн авдаг бөгөөд бусад хуудсууд руу нэвтрэх үед тэр үүнийг илгээдэг. Таныг скрипт дээрээ сесс механизмыг эхлүүлэх үед php зохицуулагч нь ирж буй сесс танигчтай тохирох файл байгаа эсэхийг шалгадаг - хэрэв байгаа бол скрипт файлаас өгөгдлийг унших боломжтой, үгүй ​​бол шинэ сесс эхлүүлнэ. мөн файл үүсгэгдэх болно. Мэдээжийн хэрэг, энэ хувьсагчийн нэрийг php тохиргоонд тодорхойлсон.

    Одоо бид ямар функцүүдийг ашигладаг талаар.

    session_start() . Сеанс механизмыг өөрөө ажиллуулдаг. Хэрэглэгч хувьсагч болон харгалзах файлтай байх ёстой. Хэрэв файл байхгүй бол түүнийг үүсгэж, сессийг эхнээс нь эхлүүлнэ. Хэрэв файл ч, хувьсагч ч байхгүй бол хувьсагч үүсгэгдэж (жишээлбэл, күүки бүхий толгой хэсгийг илгээсэн) файлыг үүсгэнэ.

    session_register(нэр1, нэр2, нэр3...) . Скриптийн төгсгөлд байгаа файлд ямар хувьсагчдыг санахыг зааж өгнө. Хэрэглэгч өөр хуудас руу шилжсэний дараа сесс механизмыг ажиллуулж болох бөгөөд энэ функцийг дуудсаны дараа хувьсагчид бэлэн болно.

    session_destroy() . Сеанс өгөгдлийн файлыг устгана (күүки ашиглах үед та хоосон күүки тохируулж гараар устгах ёстой: "setcookie(session_name())").

    session_set_cookie_params(амьдрал, зам, домэйн) . Сеанс танигчаар күүки параметрүүдийг тохируулах (анхдагчаар, күүки нь серверийн үндэс рүү тохируулагдсан бөгөөд хөтөч хаагдах хүртэл 0 секундын турш).

    Одоохондоо ийм л байна. Чуулгануудын талаар тусдаа асуудлуудыг нарийвчлан гаргана. Одоогоор би сесс ашиглан зөвшөөрөл олгох, хэрэглэгчийн таних механизмыг тайлбарлах болно.

    Тиймээс, бидэнд гурван файл байна - нэвтрэх, баталгаажуулах (auth) болон гаралт (гаралт).

    // бүх хүсээгүй тэмдэгтүүдийг хайчилж ав $login = preg_replace("/[^\w_\.\-]/", "", $HTTP_POST_VARS["нэвтрэх"]); $pas = trim($HTTP_POST_VARS["pas"]); // хувьсагчдыг шалгаж байгаа бол (strlen($login)==0 || strlen($pass)==0) $error = "Нэвтрэх нэр, нууц үгээ оруулна уу"; else ( // нэвтрэх болон нууц үгээ шалгаж байна $user_result = mysql_query("SELECT * FROM user WHERE login="$login" AND pass="". md5($pass). """); /* хэрэв алдаа гарсан бол өгөгдлийн сан (жишээ нь, хэрэглэгч сессэд урт хувьсагч оруулсан бөгөөд үүнийг мэдээллийн сан боловсруулахыг хүсээгүй) эсвэл нэгээс олон мөр гарч ирвэл бид хэрэглэгчийг өшиглөнө */ if (mysql_error()) die(mysql_error()) ; elseif (@mysql_num_rows($user_result) != 1) $алдаа = "Хэрэглэгчийн нэр эсвэл нууц үг буруу байна."; // Хэрэв бүх зүйл хэвийн бол өгөгдлийг сонгоод сессийг өөр эхлүүлнэ үү ( $user = mysql_fetch_assoc($user_result); session_set_cookie_params (1800, "/"); session_start() ; // хэрэглэгчийн өгөгдлийг санаж session_register("user"); // дараа нь хэрэв (isset($HTTP_POST_VARS["return"])) толгой("Байршил: ($HTTP_POST_VARS["return"]) "); else header("Байршил: /"); exit(); ); ); /* энд хэрэглэгч зөвшөөрөлгүй болсон ч хаалттай сессээс күүки илгээх боломжтой. үүнийг цэвэрлэе. */ хэрэв (isset($HTTP_COOKIE_VARS)) setcookie(session_name()); // Дараа нь бид дүрс зурна, энэ нь сонирхолтой биш юм.

    Энэ скрипт нь боловсруулагч болон өгөгдөл оруулах маягт юм. Нэвтрэх болон нууц үгээ хүлээн авахдаа тэдгээрийг боловсруулж, хэрэв зөв бол ажиллахаа больж, хэрэглэгчийг хүссэн хуудас руу илгээдэг. Хэрэв өгөгдөл буруу эсвэл дутуу байвал маягтыг зурна.

    /* хэрэглэгчийн хувьсагчийг устгаснаар маягтыг зурсны дараа шуудангийн хүсэлтэд өгөгдөл илгээх боломжгүй болно. */ тохируулаагүй($хэрэглэгч); // "session error" flag - хэрэв идэвхжүүлсэн бол ажил зогсох болно. $session_error = худал; // хэрэв сесс ID-тай күүки байхгүй бол, хэрэв (!isset($HTTP_COOKIE_VARS)) $session_error = үнэн; // хэрэв байгаа бол сесс механизмыг ажиллуулж, $user хувьсагчийг бүртгэнэ. else ( session_start(); session_register("хэрэглэгч"); /* Хэрэв санамсаргүйгээр массив дотор нэвтрэх болон нууц үг байхгүй бол ажил зогсох болно ("бид юу ч мэдэхгүй, бид танд өгсөн") */ if (!isset($user["login"]) || !isset($user["pass"])) $session_error = true; ); /* хэрэв хэрэглэгч алдаа гаргахаас баатарлаг байдлаар зайлсхийж чадсан бол оролттой ижил аргаар мэдээллийн баазаар дамжуулан шалгалт хийдэг. */ if (!$session_error) ( $check_result = mysql_query("СОНГОХ uid FROM user WHERE login="($user)" AND pass="($user)""); if (mysql_error() || @mysql_num_rows( $user_result) != 1) $session_error = үнэн; ); // хэрэв ямар нэг алдаа гарсан бол хэрэв ($session_error) ( // сессийн өгөгдлийг устгах session_destroy(); // хэрэв күүки байсан бол устгана уу if (!isset($HTTP_COOKIE_VARS)) setcookie(session_name()," " ,"/"); /* хүссэн хаяг руугаа буцах боломжтой хэрэглэгчийг нэвтрэхээр илгээх */ толгой("Байршил: /login.php?return=$REQUEST_URI"); // exit() ажиллахаа болих. ; ); mysql_free_result($check_result);

    Хэрэглэгчийг шалгасан бөгөөд $user массив - түүний тухай бүх өгөгдөл, та жишээлбэл, түүний нэр, овог нэрээр мэндчилж болно:

    If(isset($HTTP_COOKIE_VARS)) ( // сесс механизмыг эхлүүлэх session_start(); // файлыг устгах session_destroy(); // cookie setcookie(session_name()); ); // хуудасны толгой хэсгээс гарах("Байршил: /login.php");

    Хэд хэдэн тэмдэглэл: энэ жишээн дээрх нууц үгээр хамгаалагдсан хэсэг нь бүхэл сервер (жишээлбэл, service.firm.ru) бөгөөд лавлахыг хаахын тулд та замуудыг засах хэрэгтэй. Session_name()-г PHPSESSID-ийн оронд ашигладаг тул танигчийн нэрийг чөлөөтэй өөрчлөх боломжтой. Дашрамд хэлэхэд, нэг физик сервер дээр та сесс танигчийг өөр өөр нэрээр нэрлэж болно - .htaccess файлыг шаардлагатай хэсэгт php_value session.name "ABRACADABRA" мөрөнд оруулахад л хангалттай.




    Хэрэв танд өөр асуулт байвал эсвэл тодорхойгүй зүйл байвал манай сайтад тавтай морилно уу

    Би сайтын нэг хэсгийг нууц үгээр хамгаалах арга замыг тайлбарлахаар шийдсэн. Энэ сэдэв нь үнэндээ нэлээд том тул би анх удаагаа php+mysql зөвшөөрлийг хязгаарлах болно.

    Хамгийн эхний асуулт бол удирдлагын скрипт бүхий санг нууц үгээр хэрхэн хаах вэ гэсэн асуулт юм. Энэ тохиолдолд ямар ч эргэлзэх шаардлагагүй - нэг буюу хэд хэдэн администратор ижил эрхтэй бөгөөд зан чанар нь ховор өөрчлөгддөг. Энэ нөхцөлд хамгийн хялбар арга бол стандарт серверийн зөвшөөрлийг ашиглах явдал юм - .htaccess болон .htpasswd файлуудыг байрлуулж, тэдгээрт шаардлагатай параметрүүдийг бичнэ үү. Энэ талаар маш их зүйл бичсэн байгаа тул би шинэ зүйл хэлэхгүй.

    Би хоёр зүйл нэмнэ. Эхнийх нь .htpasswd файлыг хаана байрлуулах вэ. Туршилтаар би хэрэв жишээ нь алдааны мэдэгдэл бүхий баримт бичигт хүрэх замыг (ErrorDocument) DocumentRoot системийн хувьсагчтай харьцуулан бичсэн бол гэдгийг олж мэдсэн. Гэхдээ нууц үгийн файлд хүрэх зам (UserFile) нь ServerRoot-тэй холбоотой бичигдсэн байдаг. Миний ойлгож байгаагаар та .htpasswd-г ServerRoot-ийн дээр тавьж болохгүй - "../" нь ойлгогдоогүй байна. Энэ бүхэн нь нууц үг бүхий файлыг, жишээлбэл, сайтын үндсэн лавлахаас нэг түвшний өндөрт байрлуулж болох бөгөөд ингэснээр сүлжээнээс файл руу нэвтрэх боломжгүй болно.

    Хоёр дахь нь скрипт нь үүнийг хэн нээж байгааг болон нууц үгийг олж мэдэх боломжтой: $PHP_AUTH_USER болон $PHP_AUTH_PW хувьсагч.

    Энэ аргын гол сул тал нь сервер нууц үг таахыг хориглож чадахгүй байгаа явдал юм (хэд хэдэн амжилтгүй нэвтрэх оролдлогын дараа хэрэглэгч нэг эсвэл хоёр цаг хүлээхийг шаарддаг бөгөөд энэ хугацаанд түүний IP хаягаас ирсэн дуудлагыг үл тоомсорлодог). Үүнийг Apache-ийн албан ёсны баримт бичигт бичсэн болно.

    Өөр нэг дутагдалтай тал бол хэрэглэгчийг устгах эсвэл шинээр оруулахдаа нууц үгтэй файлуудыг дахин бичих шаардлага юм. Гэхдээ энэ нь ховор тохиолддог бол энэ арга нь хангалттай бөгөөд та зөвшөөрлийн механизм бичих талаар санаа зовох хэрэггүй болно.

    Зөвшөөрлийн автоматжуулалт

    Энэ нь зөвхөн олон тооны хэрэглэгчидтэй ажиллах, тэдний эргэлтийг хялбарчлахад зайлшгүй шаардлагатай. Хэрэв та хэрэглэгчдийн талаар нэмэлт мэдээлэл хадгалах шаардлагатай бол эсвэл эрхийн уян хатан ялгаа хэрэгтэй бол мэдээллийн сан руу зөвшөөрлийг шилжүүлэх нь дээр.

    Хаалттай нутаг дэвсгэрийн хуудас бүр нь дараах код бүхий файлыг агуулна.

    $result = mysql_query(" SELECT * FROM person FROM WHERE login="". preg_replace("/[^w_-]/","",$PHP_AUTH_USER). "" БА нэвтрүүлэх = "". md5($PHP_AUTH_PW). " ""); if (@mysql_num_rows($result)!=1) ( header("WWW-Authenticate: Basic realm="User area""); header("HTTP/1.0 401 Зөвшөөрөгдөөгүй"); print("Хэрэглэгчийн талбарт нэвтрэхийн тулд сайтын хувьд та хэрэглэгчийн нэр, нууц үгээ оруулах ёстой."); exit(); ); $user_row = mysql_fetch_array($үр дүн);

    Эхний мөрөнд үсэг, тоо, зураас, доогуур зураасаас бусад бүх тэмдэгтүүд нэвтрэхээс хасагдана. Дараа нь хүлээн авсан мөрүүдийн тоог шалгаж, зөвхөн нэг мөр байгаа тохиолдолд хандах эрх олгоно. Бусад тохиолдолд хэрэглэгч хөтөч дээр нэвтрэх болон нууц үгээ оруулахыг хүссэн цонхыг харах болно. Хэрэв хэрэглэгч амжилттай нэвтэрсэн бол $user_row массив дахь түүний талаарх бүх мэдээлэл бидэнд байна.

    Мэдээжийн хэрэг, миний хэлсэн жишээ нэлээд олон дутагдалтай талуудтай. Нууц үг таах оролдлогын золиос болохгүйн тулд үүнийг нэг нэгээр нь дахин бичиж болохгүй, учир нь
    1. энд сонголтоос хамгаалах ямар ч хамгаалалт байхгүй
    2. Хэрэв хэрэглэгчийн хүснэгт том бол нууц үгийг таахад халдагчид мэдээллийн санг дарах магадлалтай.

    Өнөөдрийн хамгийн сүүлийн арга бол күүки дэх шифрлэгдсэн өгөгдлийг хадгалах явдал юм.

    Нэвтрэх скрипт байдаг, үлдсэн хэсэг нь зөвхөн хаалттай хэсэгт үйлдлүүдийг үргэлжлүүлэх боломжийг олгодог кодыг агуулдаг - хэрэв күүки дуусах эсвэл тэр тэндээс гарвал та нэвтрэх хуудас руу буцах хэрэгтэй болно.

    Оролтын скрипт нь нэвтрэх болон нууц үгээ шалгаж, хоёр күүки гаргадаг. Эхнийх нь - хэрэглэгчийг нэн даруй тодорхойлохын тулд нэвтрэх (мэдээллийн санд нэвтрэх талбар нь мэдээжийн хэрэг өвөрмөц эсвэл бүр түлхүүр юм). Хоёрдахь күүки нь нэвтрэх хугацаа, нууц үгийн хэшийг агуулдаг (нууцыг хадгалахын тулд би эдгээр мөрөнд "Y" үсгийг нэмдэг - тэгвэл хэшийг олох бараг боломжгүй юм :).

    Бусад бүх программууд нь дараах үйлдлийг гүйцэтгэдэг кодыг агуулдаг. Өгөгдлийн санд хүсэлт гаргах - хүлээн авсан нэвтрэлт бүхий мөрийг сонгоно. Энэ мөрөөс "лог_цаг" талбар болон нууц үгийг авч, дээр дурдсанчлан тэдгээрээс хэш үүсгэдэг. Хүлээн авсан зүйлтэйгээ харьцуулж, таарвал нууц үг, цаг, "Y" үсгээс дахин шинэ хэш күүки гаргаж, мэдээллийн санд "ШИНЭЧЛЭХ хэрэглэгчийн SET log_time='...' ХААНА нэвтрэх хүсэлтийг хийнэ. ='$ cookie_login'".

    if (isset($HTTP_COOKIE_VARS[$cookie_login]) && isset($HTTP_COOKIE_VARS[$cookie_code])) ( $login = $HTTP_COOKIE_VARS[$cookie_login]; $code = $HTTP_COOKIE_VARS[$SELECT; огнооны_формат(log_date,"%Y%m%d%H%i%s") log_date1, нэвтрүүлэх,uid FROM хэрэглэгч ХААНА email="$login" БОЛОН log_date>"DATE_SUB(NOW(),INTERVAL 15 MINUTE)"" ); хэрэв (!mysql_error() && @mysql_num_rows($result)==1) ( $log_time0 = time(); $log_time1 = date("YmdHis", $log_time0); $log_time2 = date("Y-m-d H:i :s", $log_time0); $current_user = mysql_fetch_array($result); if (md5($current_user["pass"].$current_user["log_date1"].$md5letter) == $code) ( mysql_query("UPDATE) хэрэглэгчийн SET log_date="$log_time2" WHERE uid=".$current_user["uid"]); setcookie($cookie_code, md5($current_user["pass"].$log_time1.$md5letter), time()+900, $site_path); $auth = үнэн; ) өөрөөр тохируулаагүй ($ одоогийн_хэрэглэгч); ); );

    Дахин хэлэхэд серверийг сонгох, дайрахаас хамгаалах ямар ч хамгаалалт байхгүй (дашрамд хэлэхэд та энд "Y" үсгийн оронд хэрэглэгчийн IP хаягийг бичиж болно - жишээлбэл, оффисын хөрш нь файлыг авч чадахгүй. күүки болон түүний компьютерээс нэвтэрнэ үү).

    Хуудасны нууц үг. 2-р хэсэг. Ажилд авахыг хориглох

    Өнгөрсөн удаад энэ дугаарыг нийтлэх үед тэд намайг газар дээр нь өшиглөж, ийм бөглөрөл нь серверийг замаас гаргаж болзошгүй гэж хэлсэн.

    Гэхдээ эхлээд самбараас бөмбөг авалтын талаар. Гайхалтай, гэхдээ одоо ч гэсэн. Латин үсэг, тооноос бүрдэх арван тэмдэгтээс бүрдэх нууц үг нь маш олон сонголттой гэсэн үг юм. Хэрэв та нууц үгийг секундэд 1,000,000 удаа тааварлавал хэдэн мянган жил болно. Гэхдээ ийм gobbledygook санахад хэцүү байдаг тул бид ихэвчлэн утга учиртай үгсээр нууц үг хийдэг. Хэдэн жилийн өмнө ихэнх нууц үгийг 10,000 үгтэй толь бичгийг ашиглан тааж болох нь тогтоогдсон. Нэгэн цагт сүлжээнд нэг өт (тиймэрхүү вирус) гарч ирэн, Юниксийн серверүүд дээр хамгаалалтын цоорхойг ашиглан авирч, Юниксийн системийн зөв бичгийн дүрмийн толь бичгийг ашиглан давуу эрхтэй хэрэглэгчдийн нууц үгийг авдаг байжээ. Юу ч авч явах шаардлагагүй байсан!

    Хэрэглэгч бүр зөв нэвтрэх нэр, нууц үгээ оруулах хүртэл муу хакер гэж тооцогддог. Хэрэглэгч ямар нэг зүйлийг буруу оруулсан тохиолдолд бид юу хийх вэ?
    мартамхай байдал (үүнд тохиромжтой вэбсайтууд системийн тохиргоонд оруулсан имэйл рүү ижил нууц үгийг илгээх "нууц үгээ мартсан" маягттай байдаг)
    эрхлүүлэх (“надад хамаагүй учраас”)
    толь бичиг ашиглан нууц үг сонгох (амжилттай сонголт хийх магадлал өндөр тул та үүнийг хаах хэрэгтэй, ялангуяа сайт нь арилжааны шинж чанартай бол)
    DoS халдлага (серверийг хэт ачаалахгүйн тулд та энэ тохиолдолд скриптийн хийх үйлдлийг багасгах хэрэгтэй)

    Хамгаалалтын механизм нь файл дээр суурилдаг бол би серверт хэт ачаалал үүсгэж болох талаар удаан бодсон. Энэ нь амархан болсон (энэ нь хэр их үнэтэй байх нь өөр асуулт юм). Тиймээс, скрипт нь секундэд 1000 удаа бичихийн тулд файлуудыг нээж, тэдгээрт өгөгдөл бичихийг оролдвол сервер үүнийг зохицуулах боломжгүй болно гэж бодъё. Нэвтрэх гэж 5 удаа оролдсоны дараа (файл руу ямар ч өгөгдөл бичихгүйгээр) хэрэглэгч шууд нэвтрэх эрхгүй болох тул та 200 өвөрмөц IP олох хэрэгтэй бөгөөд үүнээс та тус бүрдээ таван удаа холбоо барих хэрэгтэй. Энэ боломжтой. Бид баннер гүйлгэх хэсэгт таван шошго бүхий html баннер өлгөдөг.

    Хэрэглэгч тэр даруй таван хүсэлт гаргадаг; сервер файл руу таван удаа бичдэг (дашрамд хэлэхэд, зарим хөтөч дээр нэвтрэх, нууц үгээ оруулах цонх гарч ирэх болно). Та ийм таван зурагтай HTML хуудас хийж, өөрийн зочилж буй сайтдаа iframe-ээр дамжуулан хуудсыг оруулж болно (iframe-ээр дамжуулан лавлагааны талбар олдохгүй. Үнэгүй сайтын дэмжлэг үзүүлэх үйлчилгээ нь боломжгүй юм. Хостинг нь лавлагаа хайхдаа лог файлуудыг ухах гэх мэт зүйлсийг шийдвэрлэх болно). Миний хэлсэн жишээнүүд мэдээжийн хэрэг, алсын хараатай боловч тогтолцооны ийм алдааг ашиглаж болно гэдэг нь өөрөө нотлогдсон. Дашрамд хэлэхэд, үүнтэй төстэй зүйл аль хэдийн тохиолдсон.

    Гэхдээ би танд энэ аргыг өгөх болно - би үүнийг дэмий л бичсэн юм уу? Дашрамд хэлэхэд, .htaccess файлыг дараах агуулгатай лавлахад байрлуулснаар хязгаарлагдмал тооны хаягуудад (жишээлбэл, компанийн дотоод сүлжээнд) ашиглах боломжтой.

    захиалга татгалзах, зөвшөөрөх
    бүгдээс үгүйсгэх
    xxx.xxx.xxx-с зөвшөөрнө

    Мөн энд програмын код байна:

    $алдаа = 0; $fn = "үл тоох/". preg_replace("[^d.]", "", $REMOTE_ADDR. ".". $HTTP_FORWARDED_FOR); if (is_file($fn)) ( if (filetime($fn))< time()-3600) unlink($fn); else $errors = fread(fopen($fn, "r"), 2); }; if ($errors>5) ( хэвлэх ("Хандалт хаагдсан. Нэг цагийн дараа буцаж ирнэ үү."); exit(); ); // энд өгөгдлийн сангийн сервертэй холболт үүссэн. хэрэглэгчийг тэр даруй "зодох" тохиолдолд дэмий гар хүрэхгүйн тулд. $result = mysql_query("SELECT * FROM user WHERE login="". preg_replace("/[^w_-]/", "", $PHP_AUTH_USER). "" БА нэвтрүүлэх = "". md5($PHP_AUTH_PW). " ""); if (@mysql_num_rows($result)!=1) ( header("WWW-Authenticate: Basic realm="нууц бүс""); header("HTTP/1.0 401 Unauthorized"); хэвлэх ("Зөвшөөрөл шаардлагатай"); fwrite (fopen($fn, "w"), ++$алдаа); exit(); ); $ одоогийн_хэрэглэгч = mysql_fetch_array($ үр дүн); mysql_free_result($үр дүн); Гэсэн хэдий ч мэдээллийн сан байгаа бол файлуудтай ажиллах нь нүгэл юм. Хошигнол. Амжилтгүй зөвшөөрлийн хувьд бид хүснэгт үүсгэдэг: CREATE TABLE unauth (хэрэглэгчийн нэр VARCHAR(64) NOT NULL, VARCHAR(64) NOT NULL, ip VARCHAR(255), logintime TIMESTAMP дамжуулна) Мөн файлд хандахын оронд бид мэдээллийн сантай ажилладаг. $алдаа = @mysql_result(mysql_query("SELECT count(хэрэглэгчийн нэрийг) худал гэж FROM unath logintime FROM WHERE logintime>DATE_SUB(NOW(),INTERVAL 1 HOUR) AND ip="$REMOTE_ADDR""),0); хэрэв (mysql_error()) үхэх(mysql_error()); if ($errors>5) ( хэвлэх ("Хандалт хаагдсан. Нэг цагийн дараа буцаж ирнэ үү."); exit(); ); $result = mysql_query("SELECT * FROM user WHERE login="". preg_replace("/[^w_-]/", "", $PHP_AUTH_USER). "" БА нэвтрүүлэх = "". md5($PHP_AUTH_PW). " ""); if (@mysql_num_rows($result)!=1) ( header("WWW-Authenticate: Basic realm="нууц бүс""); header("HTTP/1.0 401 Зөвшөөрөлгүй"); хэвлэх ("Зөвшөөрөл шаардлагатай"); mysql_query ("INSERT INTO unauth (хэрэглэгчийн нэр, нэвтрэх, ip) VALUES ("$PHP_AUTH_USER", "$PHP_AUTH_PW", "$REMOTE_ADDR $HTTP_X_FORWARDED_FOR")"); exit(); ); $ одоогийн_хэрэглэгч = mysql_fetch_array($ үр дүн); mysql_free_result($үр дүн);

    Статистикийн хувьд хуучин бүртгэлийг хадгалах эсэх нь бизнесийн шийдвэр юм. Хэрэв ямар нэг зүйл байвал зөвшөөрөл авахаас өмнө дараах хүсэлтийг биелүүлснээр тэдгээрийг устгаж болно:

    ХААНА нэвтрэн орох цагийг баталгаажуулаагүйгээс УСТГАХ