วิธีการรักษาความปลอดภัยรหัสผ่านฐานข้อมูลใน PHP?


404

เมื่อแอปพลิเคชั่น PHP ทำการเชื่อมต่อฐานข้อมูลแน่นอนว่าโดยทั่วไปจะต้องผ่านการเข้าสู่ระบบและรหัสผ่าน หากฉันใช้การเข้าสู่ระบบที่ได้รับอนุญาตขั้นต่ำเพียงครั้งเดียวสำหรับแอปพลิเคชันของฉัน PHP จำเป็นต้องรู้ว่าการเข้าสู่ระบบและรหัสผ่านนั้นอยู่ที่ไหนสักแห่ง วิธีที่ดีที่สุดในการรักษาความปลอดภัยรหัสผ่านนั้นคืออะไร? ดูเหมือนว่าเพียงแค่เขียนในโค้ด PHP นั้นไม่ใช่ความคิดที่ดี


1
เพื่อความปลอดภัยอย่างสมบูรณ์คุณจะต้องตั้งค่าการเชื่อมต่อ ssl ไม่เช่นนั้นใครก็ตามในเครือข่ายของคุณก็ยังสามารถดมรหัสผ่านที่คุณพิมพ์ได้
Charles Ma

1
คุณหมายถึงรหัสผ่านผู้ใช้หรือรหัสผ่านฐานข้อมูลที่ใช้ในสตริงการเชื่อมต่อหรือไม่
Ozgur Ozcitak

4
รหัสผ่านฐานข้อมูลที่ใช้ในสตริงการเชื่อมต่อ ขอบคุณ!
user18359

คำตอบ:


238

หลายคนเข้าใจผิดว่าเป็นคำถามเกี่ยวกับวิธีการจัดเก็บรหัสผ่านในฐานข้อมูล ว่าเป็นสิ่งที่ผิด. มันเกี่ยวกับวิธีการจัดเก็บรหัสผ่านที่ช่วยให้คุณไปยังฐานข้อมูล

วิธีแก้ไขปัญหาปกติคือย้ายรหัสผ่านออกจากซอร์สโค้ดไปยังไฟล์กำหนดค่า จากนั้นปล่อยให้การดูแลระบบและการรักษาความปลอดภัยไฟล์การกำหนดค่านั้นขึ้นอยู่กับผู้ดูแลระบบของคุณ ด้วยวิธีนี้นักพัฒนาไม่จำเป็นต้องรู้อะไรเกี่ยวกับรหัสผ่านการใช้งานจริงและไม่มีการบันทึกรหัสผ่านในการควบคุมแหล่งที่มาของคุณ


8
ขอบคุณ หากฉันเข้าใจอย่างถูกต้องไฟล์ php จะมีการรวมไว้ในไฟล์ปรับแต่งเพื่อให้สามารถใช้รหัสผ่านได้ เช่นฉันสร้างไฟล์ชื่อ 'app1_db_cfg.php' ที่เก็บชื่อการเข้าสู่ระบบ pword และ db จากนั้นหน้าของฉัน application.php รวมถึง 'app1_db_cfg.php' และฉันอยู่ในธุรกิจ!
user18359

28
ฉันยอมรับว่าการกำหนดค่าจะต้องได้รับการปกป้องอย่างเหมาะสม อย่างไรก็ตามการรู้วิธีการทำนั้นเป็นธุรกิจของผู้ดูแลระบบไม่ใช่นักพัฒนา ฉันไม่เห็นด้วยกับค่าของการเข้ารหัสที่แข็งแกร่งในกรณีนี้ หากคุณไม่สามารถป้องกันไฟล์ปรับแต่งอะไรที่ทำให้คุณคิดว่าคุณสามารถป้องกันกุญแจได้
user11318

10
ฉันชอบใช้บัญชีฐานข้อมูลที่ได้รับอนุญาตให้ acces ฐานข้อมูลจากเว็บเซิร์ฟเวอร์เท่านั้น และจากนั้นฉันก็ไม่ได้กังวลกับการเข้ารหัสการตั้งค่าฉันแค่เก็บมันไว้นอกเว็บรูท
gnud

11
ฉันใช้ตัวแปรสภาพแวดล้อม apache เพื่อตั้งค่าเส้นทางเพื่อให้แม้กระทั่งเส้นทางไปยังไฟล์ไม่เป็นที่รู้จักในซอร์สโค้ด นอกจากนี้ยังช่วยให้มีรหัสผ่านที่แตกต่างกันสำหรับการพัฒนาและการผลิตโดยยึดตามการตั้งค่า Apache บนเซิร์ฟเวอร์
geedew

15
โปรดทราบว่าแม้แต่ไฟล์ที่จัดเก็บนอกไดเรกทอรีที่สามารถเข้าถึงได้บนเว็บจะต้องอ่านโดยสคริปต์ที่ใช้งาน หากใครบางคนรวมไฟล์นั้นทิ้งข้อมูลจากไฟล์พวกเขาจะเห็นรหัสผ่าน
Rick Mac Gillis

104

หากคุณกำลังโฮสต์บนเซิร์ฟเวอร์ของบุคคลอื่นและไม่สามารถเข้าถึงภายนอก webroot ของคุณคุณสามารถใส่รหัสผ่านและ / หรือการเชื่อมต่อฐานข้อมูลในไฟล์จากนั้นล็อคไฟล์โดยใช้. htaccess:

<files mypasswdfile>
order allow,deny
deny from all
</files>

3
ขอบคุณนั่นคือสิ่งที่ฉันกำลังมองหา
David Gladfelter

28
แน่นอน แต่ถ้าใครบางคนมีสิทธิ์เข้าถึงเชลล์บัญชีทั้งหมดของคุณจะถูกบุกรุกอยู่ดี
kellen

4
นี่เป็นวิธีปฏิบัติที่ไม่ดีเพราะคุณอาจส่งข้อมูลรับรองไปยังที่เก็บโดยไม่ตั้งใจ
Porlune

2
@Ankit: หากไม่สามารถอัพโหลดไฟล์ไปยังเซิร์ฟเวอร์และเรียกใช้งานได้แสดงว่าเซิร์ฟเวอร์นั้นไม่ได้รับการกำหนดค่าอย่างเหมาะสม
kellen

6
@Porlune: นักพัฒนาควรให้ระบบควบคุมเวอร์ชันละเว้นไฟล์รหัสผ่านเช่นโดยใช้. gitignore แต่ใช่ควรใช้ไฟล์ที่มีข้อมูลที่ละเอียดอ่อน
kellen

45

วิธีที่ปลอดภัยที่สุดคือการไม่มีข้อมูลที่ระบุในโค้ด PHP ของคุณเลย

หากคุณใช้ Apache ซึ่งหมายถึงการตั้งค่ารายละเอียดการเชื่อมต่อในไฟล์ httpd.conf หรือไฟล์โฮสต์เสมือน ถ้าคุณทำเช่นนั้นคุณสามารถโทร mysql_connect () โดยไม่มีพารามิเตอร์ซึ่งหมายความว่า PHP จะไม่ส่งข้อมูลของคุณ

นี่คือวิธีที่คุณระบุค่าเหล่านี้ในไฟล์เหล่านั้น:

php_value mysql.default.user      myusername
php_value mysql.default.password  mypassword
php_value mysql.default.host      server

จากนั้นคุณเปิดการเชื่อมต่อ mysql ของคุณเช่นนี้:

<?php
$db = mysqli_connect();

หรือเช่นนี้

<?php
$db = mysqli_connect(ini_get("mysql.default.user"),
                     ini_get("mysql.default.password"),
                     ini_get("mysql.default.host"));

1
โปรดตรวจสอบค่าที่เหมาะสมของ ini_get ('ค่าเริ่มต้น') php.net/manual/en/class.mysqli.php
Val

4
ใช่ แต่ผู้ใช้ (หรือแฮ็กเกอร์ที่ใช้สคริปต์ php ที่เขียนไม่ดี) สามารถอ่านรหัสผ่านini_get()ได้
Marki555

1
@ Marki555 but any user (or a hacker abusing badly written php script) can read the password via ini_get()คุณจัดการกับสิ่งนี้ได้อย่างไร
tonix

2
Marki555 บอกว่าผู้โจมตีที่สามารถเรียกใช้โค้ด PHP สามารถเรียกใช้ฟังก์ชั่น PHP ซึ่งเห็นได้ชัดว่าเป็นเรื่องจริงและเป็นไปไม่ได้ที่จะทำอะไรบางอย่าง ฉันต้องการเพิ่มว่าฉันไม่ปฏิบัติตามคำแนะนำที่ฉันให้ไว้ในคำตอบนี้อีกต่อไป แต่ใช้ตัวแปรสภาพแวดล้อมแทน แนวคิดคล้ายกัน: อย่าเก็บข้อมูลรับรองของคุณไว้ในรหัส มันไม่ได้เรื่องจริงๆถ้าคุณใช้หรือini_get() getenv()
Lars Nyström

2
@DeepBlue หากคุณสามารถฉีด ini_get () คุณสามารถฉีด file_get_contents (anypath) ได้เช่นกัน ตราบใดที่ php มีวิธีในการรับรหัสผ่านก็จะมีรหัสที่เป็นอันตราย
varesa

40

เก็บไว้ในไฟล์ภายนอกเว็บรูท


29
และตามที่กล่าวไว้ที่อื่นนอกเหนือจากการควบคุมแหล่งที่มา
แฟรงก์เกษตรกร

6
เราจะสามารถรวมมันได้หรือไม่ เช่นใน PHP เราสามารถทำinclude('../otherDirectory/configfile.conf')อะไรได้บ้าง
mtk

1
คุณทุกคนแนะนำให้เก็บข้อมูลรับรองไว้นอก wwwroot ตกลงฉันเข้าใจภูมิหลังด้านความปลอดภัย แต่จะเก็บไว้ในการควบคุมเวอร์ชันอย่างไร (ตัวอย่าง config) โดยปกติแล้ว wwwroot คือรากของ repo คอมไพล์ดังนั้นหากมีอะไรภายนอก - มันจะอยู่นอก VC ลองนึกภาพผู้พัฒนารายใหม่ที่พยายามตั้งค่าอินสแตนซ์ในพื้นที่เพื่อการพัฒนา - เขาจะรู้เวทมนตร์เช่น "นำไฟล์นี้คัดลอกภายนอกแล้วกรอกข้อมูล" ได้อย่างไร?
เจ้าพ่อ

@TheGodfather ความคิดคือนักพัฒนาใหม่ควรมีข้อมูลประจำตัวของตนเองสำหรับสภาพแวดล้อมการพัฒนาของตนเอง แม้ว่าจะเป็นวิธีปฏิบัติที่ดีที่จะมี readme พร้อมคำแนะนำหรือความคิดเห็นในรหัสที่ระบุว่าคุณควรกำหนดค่าอย่างไร (แต่ไม่ใช่ข้อมูลจริง)
PhoneixS

@TheGodfather ไฟล์ readme หรือไม่
Pacerier

35

สำหรับระบบที่มีความปลอดภัยสูงเราจะเข้ารหัสรหัสผ่านฐานข้อมูลในไฟล์กำหนดค่า (ซึ่งผู้ดูแลระบบได้รับความปลอดภัยนั้นเอง) เมื่อเริ่มต้นแอปพลิเคชัน / เซิร์ฟเวอร์แอปพลิเคชันจะแจ้งผู้ดูแลระบบให้ขอคีย์ถอดรหัส รหัสผ่านฐานข้อมูลจะถูกอ่านจากไฟล์ปรับแต่งถอดรหัสและเก็บไว้ในหน่วยความจำสำหรับใช้ในอนาคต ยังไม่ปลอดภัย 100% เนื่องจากถูกเก็บไว้ในหน่วยความจำที่ถอดรหัส แต่คุณต้องเรียกมันว่า 'ปลอดภัยเพียงพอ' ในบางจุด!


85
เกิดอะไรขึ้นถ้าผู้ดูแลระบบเสียชีวิต
Radu Murzea

36
@RaduMurzea ที่ไร้สาระ คุณเคยได้ยิน Sys Admins ตายเมื่อใด พวกเขาเป็นเหมือน McDonalds พวกเขาปรากฏตัว / หายไปจากที่ไหนเลย!
ILikeTacos

13
@Radu Murzea เพียงแค่มีผู้ดูแลระบบ 2 คนขึ้นไปคุณมีพาริตี้เหมือนกับการจู่โจม โอกาสที่มากกว่าหนึ่งไดรฟ์ที่ล้มเหลวในแต่ละครั้งจะต่ำกว่ามาก
element11

5
แล้วเซิร์ฟเวอร์จะรีสตาร์ทเมื่อไหร่ ใช้เวลานานเท่าใดในการปลุกผู้ดูแลระบบขึ้นมาเพื่อให้พวกเขาพิมพ์รหัสผ่านใน .. etc ฯลฯ lol
John Hunt

1
ไม่แน่ใจว่าคุณหมายถึง 'เก็บไว้ในหน่วยความจำ' เว็บแอป PHP โดยทั่วไปจะไม่เก็บอะไรไว้ในหน่วยความจำนานกว่าเวลาที่ใช้ในการตอบสนองต่อคำขอแต่ละรายการเพื่อดูหน้าเว็บ
bdsl

15

วิธีนี้เป็นวิธีทั่วไปซึ่งมีประโยชน์สำหรับแอปพลิเคชันทั้งแบบเปิดและปิด

  1. สร้างผู้ใช้ระบบปฏิบัติการสำหรับแอปพลิเคชันของคุณ ดูhttp://en.wikipedia.org/wiki/Principle_of_least_privilege
  2. สร้างตัวแปรสภาพแวดล้อมระบบปฏิบัติการ (ไม่ใช่เซสชัน) สำหรับผู้ใช้นั้นด้วยรหัสผ่าน
  3. เรียกใช้แอปพลิเคชันในฐานะผู้ใช้รายนั้น

ข้อดี:

  1. คุณจะไม่ตรวจสอบรหัสผ่านของคุณในการควบคุมแหล่งที่มาโดยไม่ได้ตั้งใจเพราะคุณทำไม่ได้
  2. คุณจะไม่พลาดการอนุญาตไฟล์โดยไม่ตั้งใจ คุณอาจจะได้ แต่มันจะไม่ส่งผลกระทบต่อเรื่องนี้
  3. สามารถอ่านได้โดย root หรือผู้ใช้รายนั้นเท่านั้น รูทสามารถอ่านไฟล์และคีย์เข้ารหัสทั้งหมดของคุณได้
  4. หากคุณใช้การเข้ารหัสคุณจะจัดเก็บคีย์อย่างปลอดภัยได้อย่างไร
  5. ใช้งานได้กับแพลตฟอร์ม x
  6. ต้องแน่ใจว่าไม่ส่ง envvar ไปยังกระบวนการลูกที่ไม่น่าเชื่อถือ

วิธีนี้แนะนำโดย Heroku ผู้ประสบความสำเร็จมาก


11

หากเป็นไปได้ที่จะสร้างการเชื่อมต่อฐานข้อมูลในไฟล์เดียวกันกับที่จัดเก็บข้อมูลรับรอง อินไลน์หนังสือรับรองในคำสั่งเชื่อมต่อ

mysql_connect("localhost", "me", "mypass");

มิฉะนั้นจะเป็นการดีที่สุดที่จะยกเลิกการตั้งค่าข้อมูลรับรองหลังจากคำสั่งเชื่อมต่อเนื่องจากข้อมูลรับรองที่ไม่ได้อยู่ในหน่วยความจำจึงไม่สามารถอ่านจากหน่วยความจำได้ )

include("/outside-webroot/db_settings.php");  
mysql_connect("localhost", $db_user, $db_pass);  
unset ($db_user, $db_pass);  

9
หากใครบางคนสามารถเข้าถึงหน่วยความจำคุณจะเมาอยู่แล้ว นี่คือความปลอดภัยปลอมที่ไม่มีจุดหมาย นอก webroot (หรืออย่างน้อยมีการป้องกันโดย. htaccess หากคุณไม่มีสิทธิ์เข้าถึงเหนือ webroot ของคุณ) เป็นตัวเลือกที่ปลอดภัยเท่านั้น
uliwitness

2
@uliwitness - นั่นก็คือการพูดแบบนั้นเพราะมีใครบางคนสามารถตัดผ่านล็อคศูนย์ปฏิบัติการเครือข่ายของคุณด้วยไฟฉายอะเซทิลีนหมายความว่าประตูนั้นมีความปลอดภัยปลอม การเก็บข้อมูลที่ละเอียดอ่อนไว้ในขอบเขตที่แคบที่สุดเท่าที่จะเป็นไปได้
Luke A. Leber

1
echo $ db_user หรือพิมพ์ $ db_pass อย่างไร แม้แต่นักพัฒนาในทีมเดียวกันก็ไม่สามารถที่จะคิดออกหนังสือรับรองการผลิตได้ รหัสควรมีอะไรที่พิมพ์ได้เกี่ยวกับข้อมูลการเข้าสู่ระบบ
Mohammed Joraid

8

ตัวเลือกของคุณมี จำกัด ตามที่คุณบอกว่าคุณต้องการรหัสผ่านเพื่อเข้าถึงฐานข้อมูล วิธีการทั่วไปอย่างหนึ่งคือการจัดเก็บชื่อผู้ใช้และรหัสผ่านในไฟล์การกำหนดค่าแยกต่างหากแทนที่จะเป็นสคริปต์หลัก จากนั้นตรวจสอบให้แน่ใจว่าได้จัดเก็บที่อยู่นอกแผนผังเว็บหลัก นั่นคือหากมีปัญหาการกำหนดค่าเว็บที่ทำให้ไฟล์ php ของคุณถูกแสดงเป็นข้อความแทนที่จะถูกดำเนินการคุณไม่ได้เปิดเผยรหัสผ่าน

นอกเหนือจากที่คุณอยู่ในบรรทัดที่ถูกต้องด้วยการเข้าถึงน้อยที่สุดสำหรับบัญชีที่ใช้ เพิ่มไปที่

  • อย่าใช้ชื่อผู้ใช้ / รหัสผ่านร่วมกันเพื่อสิ่งอื่นใด
  • กำหนดค่าเซิร์ฟเวอร์ฐานข้อมูลเพื่อยอมรับการเชื่อมต่อจากเว็บโฮสต์สำหรับผู้ใช้นั้น (localhost ดียิ่งขึ้นถ้าฐานข้อมูลอยู่บนเครื่องเดียวกัน) วิธีนั้นแม้ว่าข้อมูลประจำตัวจะถูกเปิดเผยพวกเขาจะไม่ใช้กับใครนอกจากพวกเขาจะมีการเข้าถึง เครื่อง
  • ทำให้รหัสผ่านสับสน (แม้ ROT13 จะทำ) มันจะไม่ป้องกันมากนักหากบางคนสามารถเข้าถึงไฟล์ได้ แต่อย่างน้อยมันก็จะป้องกันการดูแบบไม่เป็นทางการ

จางไป



8

ก่อนหน้านี้เราจัดเก็บฐานข้อมูลผู้ใช้ / รหัสผ่านในไฟล์กำหนดค่า แต่มีตั้งแต่โหมดหวาดระแวงกด - ใช้นโยบายการป้องกันในความลึกป้องกันในเชิงลึก

หากแอปพลิเคชันของคุณถูกบุกรุกผู้ใช้จะสามารถอ่านไฟล์การกำหนดค่าของคุณได้ดังนั้นจึงมีโอกาสที่แครกเกอร์จะอ่านข้อมูลนี้ ไฟล์การกำหนดค่าสามารถรับการตรวจสอบในการควบคุมเวอร์ชันหรือคัดลอกรอบเซิร์ฟเวอร์

เราได้เปลี่ยนไปใช้การจัดเก็บตัวแปรผู้ใช้ / ส่งผ่านในสภาพแวดล้อมที่กำหนดไว้ใน Apache VirtualHost การกำหนดค่านี้สามารถอ่านได้โดยรูทเท่านั้นหวังว่าผู้ใช้ Apache ของคุณจะไม่ทำงานเหมือนรูท

ข้อเสียคือตอนนี้รหัสผ่านอยู่ในตัวแปร Global PHP

เพื่อลดความเสี่ยงนี้เรามีข้อควรระวังดังต่อไปนี้:

  • รหัสผ่านถูกเข้ารหัส เราขยายคลาส PDO เพื่อรวมตรรกะสำหรับการถอดรหัสรหัสผ่าน หากมีคนอ่านรหัสที่เราสร้างการเชื่อมต่อจะไม่ชัดเจนว่าการเชื่อมต่อนั้นถูกสร้างขึ้นด้วยรหัสผ่านที่เข้ารหัสและไม่ใช่รหัสผ่านนั้นเอง
  • รหัสผ่านที่เข้ารหัสถูกย้ายจากตัวแปรส่วนกลางไปเป็นตัวแปรส่วนตัวแอปพลิเคชันทำสิ่งนี้ทันทีเพื่อลดหน้าต่างที่มีค่าในพื้นที่ส่วนกลาง
  • phpinfo()ถูกปิดใช้งาน. PHPInfo เป็นเป้าหมายที่ง่ายในการรับภาพรวมของทุกสิ่งรวมถึงตัวแปรสภาพแวดล้อม

6

ใส่รหัสผ่านฐานข้อมูลลงในไฟล์ทำให้เป็นแบบอ่านอย่างเดียวสำหรับผู้ใช้ที่ให้บริการไฟล์

ถ้าคุณไม่มีวิธีอนุญาตให้กระบวนการเซิร์ฟเวอร์ php เข้าถึงฐานข้อมูลได้เพียงนี้คุณก็สามารถทำได้


5

หากคุณกำลังพูดถึงรหัสผ่านฐานข้อมูลซึ่งต่างจากรหัสผ่านที่มาจากเบราว์เซอร์ดูเหมือนว่าวิธีปฏิบัติแบบมาตรฐานจะต้องใส่รหัสผ่านฐานข้อมูลลงในไฟล์กำหนดค่า PHP บนเซิร์ฟเวอร์

คุณเพียงแค่ต้องแน่ใจว่าไฟล์ php ที่มีรหัสผ่านนั้นมีสิทธิ์ที่เหมาะสม เช่นควรอ่านได้โดยเว็บเซิร์ฟเวอร์และบัญชีผู้ใช้ของคุณเท่านั้น


1
น่าเสียดายที่ไฟล์ PHP PHP สามารถอ่านได้โดย phpinfo () และหากมีใครบางคนทิ้งสคริปต์ทดสอบไว้ด้านหลังผู้โชคดีจะสามารถอ่านรหัสผ่านได้ อาจเป็นการดีที่สุดที่จะเก็บรหัสผ่านการเชื่อมต่อไว้ในไฟล์ภายนอกรูทเซิร์ฟเวอร์เว็บแทน จากนั้นวิธีเดียวที่จะเข้าถึงมันคือการใช้เชลล์หรือโดยการรันโค้ดโดยพลการ แต่ในสถานการณ์นั้นความปลอดภัยทั้งหมดจะหายไป
MarioVilas

5

เพียงแค่วางมันลงในไฟล์กำหนดค่าบางแห่งเป็นวิธีที่มันมักจะทำ เพียงให้แน่ใจว่าคุณ:

  1. ไม่อนุญาตให้เข้าถึงฐานข้อมูลจากเซิร์ฟเวอร์ใด ๆ ที่อยู่นอกเครือข่ายของคุณ
  2. ระวังอย่าให้แสดงรหัสผ่านแก่ผู้ใช้โดยไม่ตั้งใจ (ในข้อความแสดงข้อผิดพลาดหรือผ่านไฟล์ PHP โดยไม่ตั้งใจซึ่งทำหน้าที่เป็น HTML และอื่น ๆ )

5

เราแก้ไขมันด้วยวิธีนี้:

  1. ใช้ memcache บนเซิร์ฟเวอร์โดยเปิดการเชื่อมต่อจากเซิร์ฟเวอร์รหัสผ่านอื่น ๆ
  2. บันทึกเพื่อ memcache รหัสผ่าน (หรือแม้แต่ไฟล์เข้ารหัส password.php ทั้งหมด) รวมทั้งปุ่มถอดรหัส
  3. เว็บไซต์เรียกใช้คีย์ memcache ที่เก็บรหัสผ่านไฟล์รหัสผ่านและถอดรหัสในหน่วยความจำรหัสผ่านทั้งหมด
  4. เซิร์ฟเวอร์รหัสผ่านจะส่งไฟล์รหัสผ่านที่เข้ารหัสใหม่ทุก ๆ 5 นาที
  5. หากคุณใช้รหัสผ่านที่เข้ารหัสไว้. php ในโครงการของคุณคุณทำการตรวจสอบเพื่อตรวจสอบว่าไฟล์นี้ถูกสัมผัสจากภายนอก - หรือดูแล้ว เมื่อสิ่งนี้เกิดขึ้นคุณสามารถล้างหน่วยความจำโดยอัตโนมัติรวมถึงปิดเซิร์ฟเวอร์เพื่อการเข้าถึง

4

เคล็ดลับเพิ่มเติมคือการใช้ไฟล์กำหนดค่า PHP แยกต่างหากที่มีลักษณะดังนี้:

<?php exit() ?>

[...]

Plain text data including password

สิ่งนี้ไม่ได้ป้องกันคุณจากการตั้งค่ากฎการเข้าถึงอย่างถูกต้อง แต่ในกรณีที่เว็บไซต์ของคุณถูกแฮ็กคำว่า "ต้องการ" หรือ "รวม" จะออกจากสคริปต์ที่บรรทัดแรกดังนั้นจึงเป็นการยากที่จะได้รับข้อมูล

อย่างไรก็ตามอย่าปล่อยให้ไฟล์การกำหนดค่าในไดเรกทอรีที่สามารถเข้าถึงได้ผ่านเว็บ คุณควรมีโฟลเดอร์ "เว็บ" ที่มีรหัสตัวควบคุม, css, รูปภาพและ js ของคุณ นั่นคือทั้งหมดที่ มีอะไรอีกบ้างในโฟลเดอร์ออฟไลน์


แต่สคริปต์ php จะอ่านหนังสือรับรองที่เก็บไว้ในไฟล์ได้อย่างไร
Christopher Mahan

3
คุณใช้ fopen () เหมือนกับไฟล์ข้อความทั่วไป
e-Satis

2
@ e-พอใช้ ok มันจะป้องกันไม่ให้แฮกเกอร์ทำrequire/ includeแต่จะป้องกันได้อย่างไรfopen?
dmnc

"สิ่งนี้ไม่ได้ป้องกันคุณจากการตั้งค่ากฎการเข้าถึงอย่างถูกต้อง"
e-Satisfaction

@ e-พอนนี่ฉลาดมาก สงสัยว่าทำไมไม่มีใครคิดเรื่องนี้ อย่างไรก็ตามยังคงมีความเสี่ยงต่อปัญหาการคัดลอกตัวแก้ไข feross.org/cmsploit
Pacerier

4

วิธีที่ดีที่สุดคือไม่เก็บรหัสผ่านเลย!
ตัวอย่างเช่นหากคุณใช้ระบบ Windows และเชื่อมต่อกับ SQL Server คุณสามารถใช้ Integrated Authentication เพื่อเชื่อมต่อกับฐานข้อมูลโดยไม่ต้องใช้รหัสผ่านโดยใช้ข้อมูลประจำตัวของกระบวนการปัจจุบัน

หากคุณจำเป็นต้องเชื่อมต่อกับรหัสผ่านก่อนอื่นให้เข้ารหัสโดยใช้การเข้ารหัสที่รัดกุม (เช่นการใช้ AES-256 จากนั้นปกป้องคีย์การเข้ารหัสหรือใช้การเข้ารหัสแบบไม่สมมาตรและให้ระบบปฏิบัติการป้องกันใบรับรอง) จากนั้นเก็บไว้ใน ไฟล์การกำหนดค่า (นอกไดเรกทอรีเว็บ) ที่มีACL ที่คาดเดายาก


3
จุดในการเข้ารหัสรหัสผ่านไม่อีกครั้ง ผู้ที่สามารถรับรหัสผ่านที่ไม่ได้เข้ารหัสก็สามารถรับข้อความรหัสผ่านที่จำเป็นสำหรับการถอดรหัสรหัสผ่านได้ อย่างไรก็ตามการใช้ ACLs & .htaccess เป็นความคิดที่ดี
uliwitness

2
@uliwitness ฉันคิดว่าคุณอาจเข้าใจผิด - คุณหมายถึงอะไรโดย "เข้ารหัสอีกครั้ง "? มันเป็นเพียงหนึ่งการเข้ารหัส และคุณไม่ต้องการใช้ข้อความรหัสผ่าน (มีไว้เพื่อการใช้งานของมนุษย์) เพื่อเข้ารหัสมันการจัดการคีย์ที่แข็งแกร่งเช่นการป้องกันโดยระบบปฏิบัติการในลักษณะที่การเข้าถึงระบบไฟล์จะไม่อนุญาตให้เข้าถึงคีย์
AviD

3
การเข้ารหัสไม่ใช่เวทมนตร์ - แทนที่จะปกป้องคีย์ AES ด้วย ACL คุณสามารถเก็บรหัสผ่านไว้ที่นั่นได้ ไม่มีความแตกต่างระหว่างการเข้าถึงคีย์ AES หรือรหัสผ่านที่ถอดรหัสการเข้ารหัสในบริบทนี้เป็นเพียงน้ำมันงู
MarioVilas

@MarioVilas เป็นยังไงบ้าง? หากรหัสผ่านถูกเข้ารหัสด้วยรหัสการป้องกันที่ได้รับการปกป้องโดยระบบปฏิบัติการจะมีความแตกต่างกันอย่างไร? การเข้ารหัสไม่ใช่เวทมนตร์ - เพียงแค่บีบอัดความลับทั้งหมดไว้ในคีย์เข้ารหัสที่เล็กลง snakeoil แทบจะไม่ในบริบทนี้มันเป็นเพียงการย้ายทุกสิ่งที่เป็นความลับในระบบปฏิบัติการ
AviD

6
@AviD ทำไมระบบปฏิบัติการถึงสามารถปกป้องกุญแจได้ แต่ไม่ใช่ข้อมูล? คำตอบ: มันสามารถปกป้องทั้งสองได้ดังนั้นการเข้ารหัสจึงไม่ช่วยได้จริงๆ มันจะแตกต่างกันถ้าข้อมูลถูกเก็บไว้และได้รับคีย์การเข้ารหัสเช่นจากรหัสผ่านที่ผู้ใช้ต้องพิมพ์
MarioVilas
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.