本文目录导读:

- What it does
- Configuration
- Example Usage
- Common Use Cases
- Important Notes
- Checking Disabled Classes
- Error Handling
- Best Practices
- Example: Complete Implementation
- Security Considerations
- Platform-Specific Notes
The disable_classes directive is a PHP configuration setting that allows you to disable specific classes from being used in your PHP scripts. Here's a comprehensive guide:
What it does
- Blocks instantiation of specified classes
- Prevents usage of disabled classes
- Returns fatal errors when tried to use
Configuration
In php.ini
disable_classes = "ClassName1, ClassName2, ClassName3"
At runtime (must be in php.ini or Apache config)
# Not settable at runtime with ini_set() # Must be set in php.ini or httpd.conf
Example Usage
# Disable dangerous/sensitive classes disable_classes = "PDO, mysqli, Redis, Memcached" # Or with comma-separated names disable_classes = "COM, DotNet, OCI8"
Common Use Cases
Security Hardening
# Disable potentially dangerous classes disable_classes = "Phar, COM, .NET, Imap"
Prevent Abuse
# Restrict database access disable_classes = "PDO, mysqli, mysql, sqlite3"
Disable Deprecated Features
disable_classes = "ereg, split, eregi"
Important Notes
✅ Can be used with
- Built-in PHP classes
- User-defined classes
- Extension classes
❌ Cannot be used to
- Disable functions (use
disable_functionsinstead) - Disable class methods (only entire classes)
- Disable interfaces or traits
Checking Disabled Classes
// Check if a class is disabled
if (class_exists('PDO')) {
// Class is available
} else {
// Class is disabled or not exists
}
// Get disabled classes
$disabled = ini_get('disable_classes');
if (!empty($disabled)) {
$disabledList = explode(',', $disabled);
}
Error Handling
When trying to use a disabled class:
// This will cause a fatal error
$pdo = new PDO(); // Fatal error: Class 'PDO' not found
// Better approach
if (class_exists('PDO')) {
$pdo = new PDO();
} else {
// Handle gracefully
die('Database functionality is disabled');
}
Best Practices
- Always check before using: Use
class_exists()to verify availability - Document restrictions: Clearly document what's disabled
- Test thoroughly: Ensure your application handles missing classes gracefully
- Consider alternatives: Provide fallbacks for disabled functionality
Example: Complete Implementation
// Safe class usage with fallback
class Database {
public function connect() {
$disabled = ini_get('disable_classes');
if ($disabled && in_array('PDO', explode(',', $disabled))) {
throw new Exception('PDO is disabled by configuration');
}
try {
$this->connection = new PDO(...);
} catch (Exception $e) {
// Handle disabled class scenario
}
}
}
Security Considerations
⚠️ Important: disable_classes is not a security boundary. Users can potentially:
- Use
eval()to create workarounds - Bypass restrictions through serialization
- Use reflection or other techniques
It's best used in conjunction with:
open_basedirdisable_functions- Proper file permissions
- System-level security measures
Platform-Specific Notes
Linux/Apache
<Directory /var/www/html>
php_admin_value disable_classes "PDO, mysqli"
</Directory>
Nginx with PHP-FPM
; in php.ini disable_classes = "PDO, mysqli"
Windows/IIS
disable_classes = "COM, DotNet"
Remember that this directive should be used carefully and is best combined with other security measures for comprehensive PHP security.