การรักษาความปลอดภัยเว็บเซิร์ฟเวอร์ PHP


31

แอปพลิเคชัน PHP มีชื่อเสียงด้านปัญหาความปลอดภัยที่สูงกว่าค่าเฉลี่ย คุณใช้เทคนิคการตั้งค่าใดเพื่อให้แน่ใจว่าแอปพลิเคชันนั้นปลอดภัยที่สุด

ฉันกำลังมองหาแนวคิดที่ชอบ:

ปกติฉันจะใช้ Linux แต่ก็รู้สึกอิสระที่จะแนะนำโซลูชัน Windows ด้วย

คำตอบ:


15
  1. ใช้คำสั่ง open_basedir เพื่อ จำกัด สคริป PHP ของคุณไปยังโฮมไดเร็กตอรี่และไดเรกทอรีแอปพลิเคชั่นพิเศษในที่สุด. นี้มีประสิทธิภาพมากด้วยตัวเอง

  2. ใช้ php ที่ชุบแข็งเพราะไม่มีค่าใช้จ่ายและสามารถช่วยได้

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

  4. Mod_security เป็นข้อดี แต่ต้องใช้และกำหนดค่าอย่างดี


บางเว็บไซต์ที่ไม่ดีต้องมี register_globals และ fopen ดังนั้นคุณจึงใช้ php.ini ต่อไซต์ที่มี suPHP เว็บไซต์หนึ่งสามารถไป kamikaze ได้และเว็บไซต์อื่น ๆ (เกือบ) ปลอดภัยอย่างสมบูรณ์แบบ
แอนทอน Benkemoun

4
หากพวกเขาใช้ register_globals และ fopen มันแสดงให้เห็นคุณภาพไม่ดีดังนั้นคุณอาจต้องการที่จะพิจารณาการใช้พวกเขา :)
เดวิด Pashley

หากพวกเขาจ่าย 150 € / เดือนคุณจะไม่พิจารณาอีก
แอนทอน Benkemoun

3

จากประสบการณ์ของฉันช่องโหว่ส่วนใหญ่ในเว็บไซต์ที่ใช้ PHP เป็นผลมาจากการออกแบบ (ไซต์) ที่ไม่ดีแทนที่จะเป็นข้อบกพร่องของ PHP เอง

เคล็ดลับด่วน ๆ :

  • อินพุตตัวกรองสากล , เอาต์พุตเอาท์พุต Clarificaiton: ตัวกรองไม่ได้หมายถึงการหลบหนีหมายความว่า "ถ้าฉันพบสิ่งที่ไม่ดีในการป้อนข้อมูลของผู้ใช้นี้ทำให้การส่งล้มเหลวและแจ้งให้ผู้ใช้ทำการฟอร์แมตใหม่"
  • แทนที่จะใช้ escapeshellcmd () ก็ไม่อนุญาตให้ผู้ใช้ป้อนข้อมูลใด ๆ ที่จะดำเนินการในเปลือก นั่นเป็นอันตรายและอาจไม่จำเป็นจริงๆ
  • อย่าเรียกใช้ฟังก์ชั่นเช่น phpinfo () บนไซต์ที่ใช้งานจริง (หรือถ้าคุณทำดูด้านล่าง *)
  • เมื่อออกแบบเว็บแอปพลิเคชันให้พิจารณาเสมอว่า "นี่เป็นเวคเตอร์การโจมตีที่เป็นไปได้หรือไม่" บอกว่าการฉีด SQL หากคำตอบคือ "ใช่" ให้เสียบทันที - อย่าพูดว่า "โอเคฉันจะเพิ่มมันในภายหลังเพื่อพัฒนาเป็นฟีเจอร์" ความปลอดภัยไม่เคยมีคุณสมบัติ
  • อย่าส่งข้อผิดพลาดดิบไปยังผู้ใช้ นี่หมายถึงการตั้งค่า display_errors = ปิดของ php.ini, log_errors = เปิด ดักข้อผิดพลาดรันไทม์และส่งออกบางสิ่งที่สวย ยกตัวอย่างวาฬของ Twitter: มันจะไม่ให้ข้อมูลระดับการดีบักของผู้ใช้มันแค่บอกว่า "woops มีอะไรบางอย่างพังโปรดรีเฟรช"

* คุณอาจมองโพสต์สั้น ๆ ที่ฉันเขียนว่า "การรักษาความปลอดภัย phpinfo (), การเรียงลำดับของ" และให้แน่ใจว่าได้อ่านความคิดเห็นhttp://egovsergo.com/2009/04/03/protecting-your-phpinfo/มันเป็นความคิดที่รวดเร็วที่ฉันต้องปกป้อง (บางส่วน) phpinfo () ถ้าฉันลืมที่จะลบมันในเว็บไซต์การผลิต

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


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

ฉันได้รับความประทับใจนั้นและตอบตามนั้น :) ขอบคุณสำหรับความคิดเห็น! เห็นได้ชัดว่าฉันไม่สามารถเข้าไปได้ทั้งหมด แต่นี่เป็นหลุมขนาดใหญ่ หากคุณมีคำถามที่เฉพาะเจาะจงมากขึ้นคุณสามารถตั้งคำถามเหล่านั้นไว้ใน Stack Overflow ได้และฉันและคนอื่น ๆ จะมีส่วนร่วม (และสำหรับสิ่งที่คุ้มค่าฉันเป็น ZCE)
msanford

3

พารามิเตอร์อื่น ๆ ที่ควรแก้ไขเพื่อทำให้ PHP แข็งขึ้น:

safe_mode = Off
register_globals = Off
expose_php = Off
allow_url_fopen = Off
allow_url_include = Off
log_errors = On
error_log = /var/log/phperror.log
display_errors = Off
enable_dl = Off
disable_functions="popen,exec,system,passthru,proc_open,shell_exec,show_source,phpinfo"

เก็บข้อผิดพลาด PHP ทั้งหมดในไฟล์/var/log/phperror.log :

touch /var/log/phperror.log
chmod 666 /var/log/phperror.log

1

ฉันได้เพิ่มที่เก็บdotdebไปยัง /etc/apt/sources.lst ของฉัน

deb http://packages.dotdeb.org stable all
deb-src http://packages.dotdeb.org stable all

ในขณะที่พวกเขาแพทช์ php / apache / mysql บ่อยกว่า Debian


1

พิจารณาตั้งค่าopen_basedirแบบ "ต่อไซต์" open_basedirคือการตั้งค่า php.ini ซึ่งจะป้องกันสคริปต์ของคุณจากการเข้าถึงไฟล์นอกรายการสีขาวที่กำหนดไว้ หากเซิร์ฟเวอร์ของคุณโฮสต์หลายไซต์มันจะป้องกันไม่ให้เว็บไซต์หนึ่งอ่านการตั้งค่าฐานข้อมูลจากเว็บไซต์อื่น นอกจากนี้ยังจะป้องกันสคริปต์ php จากการเข้าถึง / แก้ไขไฟล์ระบบหลัก การติดตั้งฐานแบบเปิดนั้นง่ายมากเพียงแค่เพิ่มบรรทัด " php_admin_value open_basedir /my/list/of/folders:/as/a/colon/seperated/list" ลงใน Apache vhost แต่ละรายการ

นอกจากนี้ให้พิจารณาปิดเครื่องมือสคริปต์ PHP สำหรับไซต์ / โฟลเดอร์ทั้งหมดที่ไม่ควรมีสคริปต์ PHP (เช่นโฟลเดอร์ภาพที่อัปโหลด) นี่เป็นเรื่องง่ายเพิ่ม "php_admin_value engine off" ให้กับ Apache VirtualHosts ที่ไม่ต้องการ php หากต้องการปิดใช้งาน PHP ในไดเรกทอรีให้ใส่สิ่งเดียวกันลงในแท็ก Directory

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

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

Suosin, HardenedPHP, mod_security และสิ่งที่คล้ายกันล้วนมีค่าเช่นกัน แต่ใช้พวกเขานอกเหนือจากการกำหนดค่าที่ล็อคไว้อย่างแน่นหนาไม่ใช่แทนที่จะเป็น


0

ซูโฮซินมีค่าใช้จ่ายค่อนข้างมากดังนั้นความคิดเห็น "ไม่มีค่าใช้จ่าย" จึงค่อนข้างปิด


2
เว็บไซต์ที่แฮ็คเร็วและดีแค่ไหน :) hardened-php.net/suhosin/benchmark.htmlแนะนำให้ลดลง 8.85% สำหรับเบนช์มาร์กหนึ่งมาตรฐาน นั่นอาจเป็นที่ยอมรับได้สำหรับสิทธิประโยชน์ด้านความปลอดภัยที่มีให้ นี่น่าจะเป็นความเห็นมากกว่าคำตอบ
David Pashley

Suhosin ปกป้องการโจมตีในท้องที่เป็นหลัก ดังนั้นหากคุณแบ่งปันเซิร์ฟเวอร์ของคุณกับคนที่คุณไม่ไว้วางใจมันอาจจะคุ้มค่ากับการชะลอตัว หากคุณมีเซิร์ฟเวอร์ของคุณเองหรือชิ้น vm ของคุณเองฉันไม่เห็นประเด็น

0

คุณกำลังมองหาคำแนะนำพื้นฐานไฟร์วอลล์ / ทอพอโลยี? ฉันชอบความคิดในการใช้สิ่งต่าง ๆ เช่นปอนด์เพื่อป้องกันการเข้าถึงโดยตรงไปยังเว็บเซิร์ฟเวอร์ PHP จากอินเตอร์เน็ตที่ไม่ได้ล้าง ด้วยวิธีนี้คุณสามารถแยกเว็บเซิร์ฟเวอร์จากส่วนอื่น ๆ ของเครือข่ายของคุณได้เช่นกัน


ไม่ฉันกำลังมองหาวิธีปรับปรุงความปลอดภัยของรันไทม์ PHP
David Pashley

0

การใช้ Suhosin / mod_security / SuPHP จะทำให้เซิร์ฟเวอร์ PHP ของคุณปลอดภัย การปิดใช้งานฟังก์ชั่นบางอย่างเช่น exec, passthru, system และ escapeshellcmd จะช่วยได้มากเช่นกัน


1
ไม่ใช่ escapeshellcmd () เพิ่งใช้เพื่อหนีเชือก? มันไม่มีวิธีดำเนินการตามกระบวนการใด ๆ ใครบางคนสามารถใช้เพื่อทำให้เกิดปัญหาได้อย่างไร
David Pashley
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.