MySQL, sql enjeksiyonunu nasıl önler? SQL enjeksiyon ilkesi ve önleme

MySQLSql enjeksiyonu nasıl engellenir? SQL enjeksiyon ilkesi ve önleme

MySQL ve SQL enjeksiyonu

Kullanıcı tarafından girilen verileri bir web sayfasından alır ve birMySQL veritabanı, o zaman SQL enjeksiyon güvenlik sorunları olabilir.

Bu bölümde SQL enjeksiyonunun nasıl önleneceği ve SQL'de enjekte edilen karakterlerin betikler aracılığıyla nasıl filtreleneceği anlatılacaktır.

Sözde SQL enjeksiyonu, etki alanı adının veya sayfa isteğinin sorgu dizesini göndermek veya girmek için web formuna SQL komutları ekleyerek kötü niyetli SQL komutlarını yürütmek için sunucuyu kandırmaktır.

Kullanıcı girdisine asla güvenmemeliyiz, kullanıcı girdi verilerinin güvenli olmadığını varsaymalıyız ve hepimizin kullanıcı girdi verilerini filtrelemesi gerekir.

Aşağıdaki örnekte, girilen kullanıcı adı harf, sayı ve alt çizgi kombinasyonu olmalı ve kullanıcı adı 8 ila 20 karakter uzunluğunda olmalıdır:

if (preg_match("/^\w{8,20}$/", $_GET['username'], $matches))
{
   $result = mysqli_query($conn, "SELECT * FROM users 
                          WHERE username=$matches[0]");
}
 else 
{
   echo "username 输入异常";
}

Özel karakterler filtrelenmediğinde oluşan SQL durumuna bir göz atalım:

// 设定$name 中插入了我们不需要的SQL语句
$name = "Qadir'; DELETE FROM users;";
 mysqli_query($conn, "SELECT * FROM users WHERE name='{$name}'");

Yukarıdaki enjeksiyon ifadesinde, $name değişkenini filtrelemedik ve ihtiyacımız olmayan SQL ifadesi, users tablosundaki tüm verileri silecek olan $name içine eklenir.

PHP'de mysqli_query()'nin birden fazla SQL ifadesi yürütmesine izin verilmez, ancak SQLite ve PostgreSQL'de aynı anda birden fazla SQL ifadesi çalıştırılabilir, bu nedenle bu kullanıcıların verilerini kesinlikle doğrulamamız gerekiyor.

SQL enjeksiyonunu önlemek için aşağıdaki noktalara dikkat etmemiz gerekir:

  • 1. Kullanıcı girdilerine asla güvenmeyin.Kullanıcının girişini kontrol edin, normal ifadeler kullanabilir veya uzunluğu sınırlayabilirsiniz; tek tırnak ve çift "-" vb. dönüştürün.
  • 2. Asla dinamik derleme sql kullanmayın, parametreli sql kullanabilir veya veri sorgulama ve erişim için doğrudan saklı yordamları kullanabilirsiniz.
  • 3. Yönetici ayrıcalıklarına sahip veritabanı bağlantılarını asla kullanmayın, her uygulama için sınırlı ayrıcalıklara sahip ayrı veritabanı bağlantıları kullanın.
  • 4. Gizli bilgileri doğrudan saklamayın, şifreleri ve hassas bilgileri şifrelemeyin veya karma hale getirmeyin.
  • 5. Uygulamanın istisna bilgileri mümkün olduğunca az ipucu vermelidir ve orijinal hata bilgilerini sarmak için özel hata bilgilerini kullanmak en iyisidir.
  • 6. Sql enjeksiyonunun algılama yöntemi genellikle yardımcı软件Veya algılamak için web sitesi platformu, yazılım genellikle sql enjeksiyon algılama aracı jsky kullanır ve web sitesi platformu Yisi web sitesi güvenlik platformu algılama aracına sahiptir. MDCSOFT SCAN ve ark.MDCSOFT-IPS kullanmak, SQL enjeksiyonuna, XSS saldırılarına vb. karşı etkili bir şekilde savunma yapabilir.

SQL Enjeksiyonunu Önle

Perl ve PHP gibi betik dillerinde SQL enjeksiyonunu önlemek için kullanıcı tarafından girilen verilerden kaçabilirsiniz.

PHP için MySQL uzantısı, özel giriş karakterlerinden kaçmak için mysqli_real_escape_string() işlevini sağlar.

if (get_magic_quotes_gpc()) 
{
  $name = stripslashes($name);
}
$name = mysqli_real_escape_string($conn, $name);
 mysqli_query($conn, "SELECT * FROM users WHERE name='{$name}'");

Benzer İfadelerde Enjeksiyon

Gibi sorgulama yaparken, kullanıcı "_" ve "%" ile değerler girerse, şu olur: kullanıcı başlangıçta "abcd_" sorgulamak istedi, ancak sorgu sonuçları "abcd_", "abcde" ve "abcdf" içeriyor " Vb.; kullanıcı "%30" sorgulamak istediğinde de sorun çıkıyor (not: yüzde otuz).

PHP betiğinde, aşağıdaki örnekte olduğu gibi yukarıdaki durumu ele almak için addcslashes() işlevini kullanabiliriz:

$sub = addcslashes(mysqli_real_escape_string($conn, "%something_"), "%_");
// $sub == \%something\_
 mysqli_query($conn, "SELECT * FROM messages WHERE subject LIKE '{$sub}%'");

addcslashes() işlevi, belirtilen karakterden önce bir ters eğik çizgi ekler.

Sözdizimi biçimi:

addcslashes(string,characters)
تحميل احدث لوحة مفاتيح LGaçıklama
diziGerekli.Kontrol edilecek dizeyi belirtir.
karakterlerİsteğe bağlı.addcslashes() tarafından etkilenen karakteri veya karakter aralığını belirtir.

Umut Chen Weiliang Blogu ( https://www.chenweiliang.com/ ) paylaştı "MySQL sql enjeksiyonunu nasıl engeller? sql enjeksiyon ilkesi ve önleme", size yardımcı olacaktır.

Bu makalenin bağlantısını paylaşmaya hoş geldiniz:https://www.chenweiliang.com/cwl-500.html

En son güncellemeleri almak için Chen Weiliang'ın blogunun Telegram kanalına hoş geldiniz!

🔔 Kanalın üst dizinindeki değerli "ChatGPT İçerik Pazarlama Yapay Zeka Aracı Kullanım Kılavuzunu" alan ilk kişi olun! 🌟
📚 Bu rehber çok büyük değer içeriyor, 🌟Bu nadir bir fırsat, kaçırmayın! ⏰⌛💨
İsterseniz paylaşın ve beğenin!
Paylaşımlarınız ve beğenileriniz bizim sürekli motivasyonumuz!

 

发表 评论

E-posta hesabınız yayımlanmayacak. 必填 项 已 用 * 标注

yukarı kaydır