Bu düzenli ifade ^ [^ \ s] + $ SQL enjeksiyonu önlemek mi?

6 Cevap php

Kullanıcı bir giriş hesabı gibi kullanıcı girişini kontrol etmek için kullanılır.

6 Cevap

Hayır, regexp üzgünüm, çok tüm SQL enjeksiyonu ile yardımcı olmaz. Biraz SQL enjeksiyon bakalım:

First, suppose you create your SQL commands as strings, such as the following:
snprintf( sqlcommand, dimensionof(sqlcommand), "INSERT INTO users (username, password) VALUES ('%s', '%s')", username, password );

SQL enjeksiyonu ile endişe kullanıcı amaçlanan başka bir şey yapmak için oluşturulan SQL komutu neden olur (bu durumda kullanıcı adı veya şifre) bir giriş değeri oluşturmak olabilir. Adı "; DAMLA / ** / TABLOSU / ** / kullanıcıları; yerdomuzu ',' f ') -" olsaydı Örneğin, daha sonra oluşturulan SQL deyimi olacak:

INSERT INTO users (username, password) VALUES ('aardvark','f');DROP/**/TABLE/**/users;--', 'password_value')

Yani, düzenli ifadenin bir kaç puan ile kaçırdı:

  • SQL dize 'patlak' olağan yöntemi çıkmamış tek tırnak karakterleri içerir.
  • / ** / A ayırıcı değil bir alandır.

Ve should not fix that regular expression. Diğerleri cevap gibi, filtreleme girdi bu yaklaşım tehlikelidir. En azından, size mysql_real_escape_string() Cletus tarafından önerilen diyebiliriz.

Ancak, Jishi ve Mark Byers iyi cevabı var: ziyade dize manipülasyon üzerinden SQL sorguları oluşturarak daha parametreli SQL sorguları kullanın. Bu yaklaşım gerekli karakterleri kaçmak için giriş verileri işleme göre yanılmaz değildir.

Onlar erken ve en doğru olduğu gibi Jishi veya işaretle Byers 'cevapları kabul edin.

Değil sen aslında, SQL enjeksiyonu önlemek için yani mysql_real_escape_string() tasarlanmış bir işlevi kullanabilirsiniz SQL enjeksiyonu önlemek gereken bir düzenli ifade bulmak isterdim neden emin.

Şimdi adları karakterleri (tip ve / veya numara) sınırlamak isteyebilirsiniz ama bu tamamen ayrı bir konu. Ya da en azından öyle olmalı.

SQL enjeksiyonu önlemek için Hayır'ı sorgu oluşturmak için dizeleri kullanmayın. Parametrelerini kullanın.

Hazırlanan tablolara kadar okuyun. SQL-enjeksiyon önlemek için en iyi yollarından biri bu. PHP için mysqli'nin ve ADO.NET de desteklenen.

Never use regular expressions to filter out SQL string - sefil başarısız olur. Bunun yerine hazır deyimleri kullanın. PDO kullanırken İşte bir örnek:

$sql = "
    SELECT * FROM users
    WHERE login = :l AND password = :p
";
$pdo = new PDO($dsn, $dbUser, $dbPassword);
$stmt = $pdo->prepare($sql);
$stmt->bindValue('l', $_POST['login']);
$stmt->bindValue('p', md5($_POST['password']));
$stmt->execute();
print_r($stmt->fetch());

Bu çok daha yazarak gibi görünebilir, ama bir SQL dizeleri sanitasyon güvenli yoldur. Ve, yine, düşük seviyeli veritabanı işlemleri gizlemek için İlişkisel Mapper çeşit kullanarak olmalıdır (aka the boring stuff).

Devamı üzerinde PDO, prepared statements ve bound values php.net üzerinde.

SQL enjeksiyonu önlemek için, parameters yerine SQL doğrudan kullanıcı girişi koyarak daha kullanmanız gerekir. Alternatif olarak, aynı zamanda dahili Bunu yapan bazı nesne-ilişkisel mapper kullanabilirsiniz.

Bu şekilde, kullanıcı girişi "kötü" karakterler hakkında bakım gerekmez. (Tabii ki, kullanıcı girişi additional doğrulama acıtmayacak yapıyor.)