موقعٌ مستخدمُ قاعدته يستطيع حذف الجداول وقراءة كلّ قاعدة أخرى يبعد حقنةَ SQL واحدة عن خسارة كلّ ما على الخادم. والعلاج لا يكلّف شيئًا: امنح كلّ موقع مستخدمَه الخاصّ بحقوق على قاعدته وحدها.

مستخدم لقاعدة واحدة

CREATE USER 'site_shop'@'localhost' IDENTIFIED BY 'a-long-random-password';
GRANT SELECT, INSERT, UPDATE, DELETE ON shop.* TO 'site_shop'@'localhost';
FLUSH PRIVILEGES;

هذه الأفعال الأربعة هي ما يحتاجه تطبيق قيد التشغيل. وانتبه لما غاب: DROP وALTER وCREATE وكلّ شيء على *.*.

ما يحتاجه المثبِّت، حينًا قصيرًا

المثبِّت أو الترحيل يحتاج فعلًا إلى إنشاء الجداول وتعديلها. امنحه ذلك للتثبيت واسترجعه بعده — فصلاحيّةٌ لا تُمسَك إلّا حين تُستعمَل لا يُساء استعمالها حين لا تُستعمَل.

GRANT CREATE, ALTER, INDEX, DROP ON shop.* TO 'site_shop'@'localhost';
-- after the install
REVOKE CREATE, ALTER, INDEX, DROP ON shop.* FROM 'site_shop'@'localhost';

وهذه أبدًا

GRANT ALL ON *.* يعطي موقعًا واحدًا قراءةً وكتابةً على كلّ قاعدة أخرى على الخادم، وحقّ إنشاء المستخدمين فوق ذلك. وهو الافتراضيّ في عددٍ من الشروح أكثر ممّا ينبغي بكثير.
  • FILE — يقرأ ملفّات الخادم ويكتبها بصفة مستخدم قاعدة البيانات.
  • SUPER — يغيّر الإعدادات العامّة ويقتل جلسات الآخرين.
  • GRANT OPTION — يتيح للمستخدم منح الحقوق، ولنفسه من بينهم.

افحص ما منحته سلفًا

SELECT user, host FROM mysql.user;
SHOW GRANTS FOR 'site_shop'@'localhost';

جزء المضيف نصف الأمان

'user'@'localhost' لا يتّصل إلّا من الجهاز نفسه. و'user'@'%' يتّصل من أيّ مكان في الإنترنت، فلا يبقى في الطريق إلّا كلمة المرور.

EGPNL ينشئ المستخدم بالصلاحيّات الصحيحة حين تُنشئ قاعدة بيانات، فأهمّ ما تكون هذه الصفحة على خادم افتراضيّ تديره أنت بنفسك.