Giriş Sterilizasyonu
user girişine asla güvenmeyin. Kullanmadan önce daima tüm giriş verilerini doğrulayın ve sterilize edin. XOOPS, metin girişini temizlemek için MyTextSanitizer sınıfını ve doğrulama için çeşitli yardımcı işlevleri sağlar.
İlgili Belgeler
Section titled “İlgili Belgeler”- En İyi Güvenlik Uygulamaları - Kapsamlı güvenlik kılavuzu
- CSRF-Koruma - Token sistemi ve XoopsSecurity sınıfı
- SQL-Enjeksiyon-Önleme - database güvenliği uygulamaları
Altın Kural
Section titled “Altın Kural”user girdilerine asla güvenmeyin. Harici kaynaklardan alınan tüm veriler şu şekilde olmalıdır:
- Doğrulandı: Beklenen biçim ve türle eşleştiğini kontrol edin
- Sterilize edilmiştir: Potansiyel olarak tehlikeli karakterleri kaldırın veya bunlardan kaçının
- Kaçış: Çıktı alırken, belirli bağlam için kaçış yapın (HTML, JavaScript, SQL)
MyTextSanitizer Sınıfı
Section titled “MyTextSanitizer Sınıfı”XOOPS, metin temizleme için MyTextSanitizer sınıfını (genellikle $myts olarak adlandırılır) sağlar.
Örneği Alma
Section titled “Örneği Alma”// Get the singleton instance$myts = MyTextSanitizer::getInstance();Temel Metin Temizleme
Section titled “Temel Metin Temizleme”$myts = MyTextSanitizer::getInstance();
// For plain text fields (no HTML allowed)$title = $myts->htmlSpecialChars($_POST['title']);
// This converts:// < to <// > to >// & to &// " to "// ' to 'Textarea İçerik İşleme
Section titled “Textarea İçerik İşleme”displayTarea() yöntemi kapsamlı metin alanı işleme sağlar:
$myts = MyTextSanitizer::getInstance();
$content = $myts->displayTarea( $_POST['content'], $allowhtml = 0, // 0 = No HTML allowed, 1 = HTML allowed $allowsmiley = 1, // 1 = Smilies enabled $allowxcode = 1, // 1 = XOOPS codes enabled (BBCode) $allowimages = 1, // 1 = Images allowed $allowlinebreak = 1 // 1 = Line breaks converted to <br>);Yaygın Temizleme Yöntemleri
Section titled “Yaygın Temizleme Yöntemleri”$myts = MyTextSanitizer::getInstance();
// HTML special characters escaping$safe_text = $myts->htmlSpecialChars($text);
// Strip slashes if magic quotes are on$text = $myts->stripSlashesGPC($text);
// Convert XOOPS codes (BBCode) to HTML$html = $myts->xoopsCodeDecode($text);
// Convert smileys to images$html = $myts->smiley($text);
// Make clickable links$html = $myts->makeClickable($text);
// Complete text processing for preview$preview = $myts->previewTarea($text, $allowhtml, $allowsmiley, $allowxcode);Giriş Doğrulaması
Section titled “Giriş Doğrulaması”Tam Sayı Değerlerini Doğrulama
Section titled “Tam Sayı Değerlerini Doğrulama”// Validate integer ID$id = isset($_REQUEST['id']) ? (int)$_REQUEST['id'] : 0;
if ($id <= 0) { redirect_header('index.php', 3, 'Invalid ID'); exit();}
// Alternative with filter_var$id = filter_var($_REQUEST['id'] ?? 0, FILTER_VALIDATE_INT);if ($id === false || $id <= 0) { redirect_header('index.php', 3, 'Invalid ID'); exit();}E-posta Adreslerini Doğrulama
Section titled “E-posta Adreslerini Doğrulama”$email = filter_var($_POST['email'], FILTER_VALIDATE_EMAIL);
if (!$email) { redirect_header('form.php', 3, 'Invalid email address'); exit();}Doğrulanıyor URLs
Section titled “Doğrulanıyor URLs”$url = filter_var($_POST['url'], FILTER_VALIDATE_URL);
if (!$url) { redirect_header('form.php', 3, 'Invalid URL'); exit();}
// Additional check for allowed protocols$parsed = parse_url($url);$allowed_schemes = ['http', 'https'];if (!in_array($parsed['scheme'], $allowed_schemes)) { redirect_header('form.php', 3, 'Only HTTP and HTTPS URLs are allowed'); exit();}Tarihler Doğrulanıyor
Section titled “Tarihler Doğrulanıyor”$date = $_POST['date'] ?? '';
// Validate date format (YYYY-MM-DD)if (!preg_match('/^\d{4}-\d{2}-\d{2}$/', $date)) { redirect_header('form.php', 3, 'Invalid date format'); exit();}
// Validate actual date validity$parts = explode('-', $date);if (!checkdate($parts[1], $parts[2], $parts[0])) { redirect_header('form.php', 3, 'Invalid date'); exit();}Dosya Adlarını Doğrulama
Section titled “Dosya Adlarını Doğrulama”// Remove all characters except alphanumeric, underscore, and hyphen$filename = preg_replace('/[^a-zA-Z0-9_-]/', '', $_POST['filename']);
// Or use a whitelist approach$allowed_chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-';$filename = '';foreach (str_split($_POST['filename']) as $char) { if (strpos($allowed_chars, $char) !== false) { $filename .= $char; }}Farklı Giriş Türlerini Kullanma
Section titled “Farklı Giriş Türlerini Kullanma”Dizi Girişi
Section titled “Dizi Girişi”$myts = MyTextSanitizer::getInstance();
// Short text (titles, names)$title = $myts->htmlSpecialChars(trim($_POST['title']));
// Limit lengthif (strlen($title) > 255) { $title = substr($title, 0, 255);}
// Check for empty required fieldsif (empty($title)) { redirect_header('form.php', 3, 'Title is required'); exit();}Sayısal Giriş
Section titled “Sayısal Giriş”// Integer$count = (int)$_POST['count'];$count = max(0, min($count, 1000)); // Ensure range 0-1000
// Float$price = (float)$_POST['price'];$price = round($price, 2); // Round to 2 decimal places
// Validate rangeif ($price < 0 || $price > 99999.99) { redirect_header('form.php', 3, 'Invalid price'); exit();}Boole Girişi
Section titled “Boole Girişi”// Checkbox values$is_active = isset($_POST['is_active']) ? 1 : 0;
// Or with explicit value check$is_active = ($_POST['is_active'] ?? '') === '1' ? 1 : 0;Dizi Girişi
Section titled “Dizi Girişi”// Validate array input (e.g., multiple checkboxes)$selected_ids = [];if (isset($_POST['ids']) && is_array($_POST['ids'])) { foreach ($_POST['ids'] as $id) { $clean_id = (int)$id; if ($clean_id > 0) { $selected_ids[] = $clean_id; } }}Select/Option Giriş
Section titled “Select/Option Giriş”// Validate against allowed values$allowed_statuses = ['draft', 'published', 'archived'];$status = $_POST['status'] ?? '';
if (!in_array($status, $allowed_statuses)) { redirect_header('form.php', 3, 'Invalid status'); exit();}İstek Nesnesi (XMF)
Section titled “İstek Nesnesi (XMF)”XMF kullanıldığında, İstek sınıfı daha temiz giriş yönetimi sağlar:
use Xmf\Request;
// Get integer$id = Request::getInt('id', 0);
// Get string$title = Request::getString('title', '');
// Get array$ids = Request::getArray('ids', []);
// Get with method specification$id = Request::getInt('id', 0, 'POST');$search = Request::getString('q', '', 'GET');
// Check request methodif (Request::getMethod() !== 'POST') { redirect_header('form.php', 3, 'Invalid request method'); exit();}Doğrulama Sınıfı Oluşturma
Section titled “Doğrulama Sınıfı Oluşturma”Karmaşık formlar için özel bir doğrulama sınıfı oluşturun:
<?phpnamespace XoopsModules\MyModule;
class Validator{ private $errors = [];
public function validateItem(array $data): bool { $this->errors = [];
// Title validation if (empty($data['title'])) { $this->errors['title'] = 'Title is required'; } elseif (strlen($data['title']) > 255) { $this->errors['title'] = 'Title must be 255 characters or less'; }
// Email validation if (!empty($data['email'])) { if (!filter_var($data['email'], FILTER_VALIDATE_EMAIL)) { $this->errors['email'] = 'Invalid email format'; } }
// Status validation $allowed = ['draft', 'published']; if (!in_array($data['status'], $allowed)) { $this->errors['status'] = 'Invalid status'; }
return empty($this->errors); }
public function getErrors(): array { return $this->errors; }
public function getError(string $field): ?string { return $this->errors[$field] ?? null; }}Kullanımı:
$validator = new Validator();$data = [ 'title' => $_POST['title'], 'email' => $_POST['email'], 'status' => $_POST['status'],];
if (!$validator->validateItem($data)) { $errors = $validator->getErrors(); // Display errors to user}database Depolaması için Temizleme
Section titled “database Depolaması için Temizleme”Veri tabanına veri kaydederken:
$myts = MyTextSanitizer::getInstance();
// For storage (will be processed again on display)$title = $myts->addSlashes($_POST['title']);
// Better: Use prepared statements (see SQL Injection Prevention)$sql = "INSERT INTO " . $xoopsDB->prefix('mytable') . " (title) VALUES (?)";$result = $xoopsDB->query($sql, [$_POST['title']]);Ekran için Sterilizasyon
Section titled “Ekran için Sterilizasyon”Farklı bağlamlar farklı kaçışlar gerektirir:
$myts = MyTextSanitizer::getInstance();
// HTML contextecho $myts->htmlSpecialChars($title);
// Within HTML attributesecho htmlspecialchars($title, ENT_QUOTES, 'UTF-8');
// JavaScript contextecho json_encode($title);
// URL parameterecho urlencode($title);
// Full URLecho htmlspecialchars($url, ENT_QUOTES, 'UTF-8');Yaygın Tuzaklar
Section titled “Yaygın Tuzaklar”Çift Kodlama
Section titled “Çift Kodlama”Sorun: Veriler birden çok kez kodlanıyor
// Wrong - double encoding$title = $myts->htmlSpecialChars($myts->htmlSpecialChars($_POST['title']));
// Right - encode once, at the appropriate time$title = $_POST['title']; // Store rawecho $myts->htmlSpecialChars($title); // Encode on outputTutarsız Kodlama
Section titled “Tutarsız Kodlama”Sorun: Bazı çıkışlar kodlanmış, bazıları kodlanmamış
Çözüm: Her zaman tutarlı bir yaklaşım kullanın, tercihen çıktıyı kodlayın:
// Template assignment$GLOBALS['xoopsTpl']->assign('title', htmlspecialchars($title, ENT_QUOTES, 'UTF-8'));Eksik Doğrulama
Section titled “Eksik Doğrulama”Sorun: Yalnızca doğrulamadan temizleme
Çözüm: Her zaman önce doğrulayın, sonra temizleyin:
// First validateif (!preg_match('/^[a-z0-9_]+$/', $_POST['username'])) { redirect_header('form.php', 3, 'Username contains invalid characters'); exit();}
// Then sanitize for storage/display$username = $myts->htmlSpecialChars($_POST['username']);En İyi Uygulamaların Özeti
Section titled “En İyi Uygulamaların Özeti”- Metin içeriği işleme için MyTextSanitizer’ı kullanın
- Belirli bir format doğrulaması için filter_var() kullanın
- **Sayısal değerler için tip dökümü kullanın
- Seçili girişler için izin verilen değerleri beyaz listeye alın
- Sterilize etmeden önce doğrulayın
- Çıkışta kaçış, girişte değil
- database sorguları için hazırlanmış ifadeleri kullanın
- Karmaşık formlar için doğrulama sınıfları oluşturun
- İstemci tarafı doğrulamaya asla güvenmeyin - her zaman sunucu tarafını doğrulayın
#güvenlik #sterilizasyon #doğrulama #xoops #MyTextSanitizer #giriş işleme