Module 6: Security & Performance

Scaling for 500k+ Users

1. Security: Input & Output

Always clean input and escape output.

$id = required_param('id', PARAM_INT);
$text = optional_param('text', '', PARAM_TEXT);

echo s($text); // Escapes HTML entities

2. Caching (MUC)

The Moodle Universal Cache (MUC) is critical for performance.

3. Performance Tips

4. Capability Checks

Never assume a user can do something. Always check permissions.

$context = context_course::instance($course->id);

// Check if user has capability
if (!has_capability('mod/quiz:view', $context)) {
    print_error('nopermission');
}

// Or enforce it (stops execution if false)
require_capability('mod/quiz:view', $context);

5. SQL Injection Prevention

Moodle's DML API handles parameter binding automatically. Never concatenate variables into SQL strings.

// BAD (Vulnerable)
$DB->get_records_sql("SELECT * FROM {user} WHERE username = '$name'");

// GOOD (Safe)
$DB->get_records_sql("SELECT * FROM {user} WHERE username = ?", [$name]);
// OR
$DB->get_records_sql("SELECT * FROM {user} WHERE username = :name", ['name' => $name]);

6. CSRF Protection (Sesskey)

Cross-Site Request Forgery (CSRF) is prevented using a session key (sesskey).

// In a form
$mform->addElement('hidden', 'sesskey', sesskey());

// In a script processing a POST request
require_sesskey();

7. Session Locking

To prevent race conditions, Moodle locks the user's session while a request is processing. This means a user cannot load two pages simultaneously (the second one waits).

\core\session\manager::write_close();
// Now perform long-running task...