สิทธิพิเศษที่จำเป็นสำหรับการใช้งานฟังก์ชั่นทริกเกอร์ใน PostgreSQL 8.4 มีอะไรบ้าง?


11

สิทธิพิเศษที่จำเป็นสำหรับการใช้งานฟังก์ชั่นทริกเกอร์ใน PostgreSQL 8.4 มีอะไรบ้าง?

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

ฉันไม่พบส่วนเอกสารที่อธิบายจุดนั้นมีความช่วยเหลืออะไรบ้าง?

คำตอบ:


10

ฟังก์ชั่นทริกเกอร์ทำงานเหมือนกับฟังก์ชั่นอื่น ๆ ที่เกี่ยวข้องกับสิทธิ์ ด้วยข้อยกเว้นเล็กน้อย:

ในการสร้างทริกเกอร์บนโต๊ะผู้ใช้จะต้องมีTRIGGER เอกสิทธิ์ในตาราง ผู้ใช้จะต้องมีEXECUTEสิทธิ์ในฟังก์ชั่นทริกเกอร์

อัพเดท หลังจากข้อเสนอแนะในความคิดเห็นที่ฉันได้ทำการวิจัยบางอย่าง มีรายการสิ่งที่ต้องทำเปิดใน Postgres Wiki:

ตรวจสอบการอนุญาตให้ทริกเกอร์กระชับ

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

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

SECURITY DEFINER

ข้อเช่นการบันทึกไว้ในคู่มือการใช้งานที่นี่ มันทำให้ฟังก์ชั่นที่จะทำงานด้วยสิทธิ์ของเจ้าของแทนผู้เรียก (ค่าเริ่มต้น)

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

REVOKE ALL ON FUNCTION foo() FROM public;

เพื่อเริ่มต้นด้วยและใช้SET search_pathสำหรับฟังก์ชั่น
ให้แน่ใจว่าได้อ่านบทที่เกี่ยวกับการเขียนSECURITY DEFINERฟังก์ชั่นได้อย่างปลอดภัย

ค้นหาตัวอย่างรหัสในคำตอบที่เกี่ยวข้องนี้ใน SO


ไม่ฉันไม่ต้องการให้ฉันต้องการSECURITY DEFINER SECURITY INVOKERแต่ดูเหมือนว่า (สำหรับฟังก์ชั่นทริกเกอร์ไม่ใช่สำหรับฟังก์ชั่นปกติ) โดยการใช้ตัวเลือกเริ่มต้น ( SECURITY INVOKER) มันไม่ได้ทำอย่างนั้น

1
@EtienneRouxel: ฟังก์ชั่นทริกเกอร์เป็นฟังก์ชั่นเช่นฟังก์ชั่นอื่น ๆ เท่าที่มีสิทธิ์เกี่ยวข้อง อะไรที่ทำให้คุณคิดอย่างอื่น
Erwin Brandstetter

@EtienneRouxel: ฉันเพิ่มแบบฟอร์มใบเสนอราคาด้วยตนเองเพื่อบันทึกข้อยกเว้นเล็กน้อย
Erwin Brandstetter

1
การทดสอบ: NOTICEฉันสร้างฟังก์ชั่นทริกเกอร์ที่เรียบง่ายที่ยก ฉันลบALLสิทธิ์จากPUBLICและจากเจ้าของฟังก์ชั่น จากนั้นถ้าฉันใช้เจ้าของหรือบทบาทอื่น ๆ ที่ไม่มีสิทธิ์พิเศษในฟังก์ชั่นนั้นฉันควรคาดหวังข้อผิดพลาดเนื่องจากการขาดสิทธิ์ แต่ทุกอย่างทำงานได้สำเร็จ

2
@EtienneRouxel: น่าสนใจ ฉันยังทดสอบ คุณไม่สามารถสร้างทริกเกอร์หากคุณไม่มีสิทธิ์ดำเนินการสำหรับฟังก์ชั่นทริกเกอร์ แต่คุณยังสามารถเพิกถอนสิทธิเอ็กซีคิวท์ได้หลังจากสร้างทริกเกอร์และทริกเกอร์จะไม่หยุดทำงาน ฉันทำวิจัย กำลังเพิ่มลิงก์ไปยังคำถาม ...
Erwin Brandstetter
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.