Bu PHP / MySQL deyim SQL enjeksiyon savunmasız mı?

6 Cevap php

Basit bir soru olmalı, ben sadece PHP sözdizimi ile aşina değilim ve şu kod SQL enjeksiyon saldırılarına karşı güvenli olup olmadığını merak ediyorum?:

private function _getAllIngredients($animal = null, $type = null) {
    $ingredients = null;
    if($animal != null && $type != null) {
        $query = 'SELECT id, name, brief_description, description, 
                         food_type, ingredient_type, image, price,
                         created_on, updated_on
                    FROM ingredient
                   WHERE food_type = \'' . $animal . '\'
                     AND ingredient_type =\'' . $type . '\';';
        $rows = $this->query($query);

        if(count($rows) > 0) {

vs, vs, vs

Ben biraz etrafında google'dan ve enjeksiyon güvenli kod WHERE food_type = \'' daha farklı bakmak gibi görünüyor görünüyor. $ Hayvan. '\' Sözdizimi burada kullandı.

Üzgünüm, ben burada kullanılan PHP ve MySQL hangi sürümünü bilmiyorum, ya da herhangi bir 3. parti kütüphaneler kullanılıyorsa, uzmanlık olan herkes herhangi bir giriş sunabilir?

UPDATE

\ Açıklamada hizmet ediyor Ne amaçla?:

WHERE food_type = \'' . $animal . '\'

Benim googling, ben mysql_real_escape_string ... Bu SQL Enjeksiyon ve diğer pislik korumak için bir işlevdir birçok başvurular geldi?

Sınıf bildirimi:

class DCIngredient extends SSDataController

So is it conceivable that mysql_real_escape_string is included in there?
Should I be asking to see the implementation of SSDataController?

6 Cevap

Yes Bu kod, SQL-Injection açıktır.

"\" Aksi halde PHP alıntı senin (sql-) dize sona erecek düşünüyor, sadece tırnak karakteri escapse.

Eğer SSDataControler Sınıf tüm SQL-Dize teslim olarak hazırlanmış bir dize enjekte edilmiş ise de, bu saldırıyı önlemek için artık mümkün değildir.

Yani the class SSDataControler is broken (vulnerable) by design.

Bunun gibi daha güvenli bir şey deneyin:

$db_connection = new mysqli("host", "user", "pass", "db");
$statement = $db_connection->prepare("SELECT id, name, brief_description, description, 
                     food_type, ingredient_type, image, price,
                     created_on, updated_on
                FROM ingredient
               WHERE food_type = ?
                 AND ingredient_type = ?;';");
$statement->bind_param("s", $animal);
$statement->bind_param("s", $type);
$statement->execute();

bind yöntemini kullanarak, (, dize için s i tamsayı için, vb) parametrenin türünü belirtmek ve tekrar sql enjeksiyon düşünmek asla olabilir

$animal '; drop table blah; -- yani evet, bu bir SQL enjeksiyon vunerable olduğunu içeren bir dize olabilir.

Eğer parametreleri bağlamak hazırlanmış deyimleri kullanılarak içine bakmalı, böylece enjeksiyon oluşamaz:

http://us3.php.net/pdo.prepared-statements

Eğer onun bir özel işlev, tür. Eğer kaynak enjekte SQL erişimi olan kişiler hakkında endişeleriniz varsa, onların amacı gerçekleştirmek için basit yolları vardır. Ben sadece güvenli olması için, kullanmadan önce mysql_real_escape_string() için argümanlar geçen öneririz. Bu gibi:

private function _getAllIngredients($animal = null, $type = null) {
        $animal = mysql_real_escape_string($animal);
        $type   = mysql_real_escape_string($type);
        ...
        }

Ekstra güvenli olması için, hatta htmlentities() yerine ENT_QUOTES bayrağı ile onu geçmek olabilir - ayrıca XSS türü şeyler karşı korunma yardımcı olacağını, bu DB içeriğini koyarak sürece Bir <script> etiketi içine girdiler.

Ama yapabileceğiniz en güvenli şey, çeşitli tekniklerin en iyi yapacak olan, kendi sanitasyon fonksiyonu yazmak, ve aynı zamanda kolayca gelecekte ortaya çıkabilecek yeni tehditlere karşı korumak için izin.

Re: UPDATE

\'' Bu SQL geçer zaman, hiçbir şey boşluk tarafından kırılmış, böylece tırnak içinde değişken içine hizmet vermektedir. IE: = Cold Turkey şey şey = 'Cold Turkey' değil mi bir hata ile sona erecekti nerede.

Ayrıca, sınıf uzantısı birlikte MySQL İfadeleri koymak nasıl etkilemez.

Kullanıcı veya herhangi bir 3. parti zaten sisteminizde (onlar muhtemelen yapmak) içine $ hayvanın değeri enjekte varsa, o zaman evet sql enjeksiyon vunerable olduğunu.

Bunu aşmanın yolu yapmak olacaktır

private function _getAllIngredients($animal = null, $type = null) {
    $ingredients = null;
    if($animal != null && $type != null) {
        $query = 'SELECT id, name, brief_description, description, 
                         food_type, ingredient_type, image, price,
                         created_on, updated_on
                    FROM ingredient
        $rows = $this->query($query);
        if(count($rows) > 0) {
        if($rows['animal'] == $animal && $rows['ingredient_type'] == $type) {

Not: Ben kaldırıldı NEREDE sql tablolar ve ekledi eğer döngü deyimleri

Siz de bir damla tablo yapabileceği bir şey kurtulmak için yine mysql_real_escape_string kullanmak veya herhangi bir diğer keyfi kod çalıştırmasına olabilir.

SQL deyiminde bunu bir olabilir herhangi bir noktada, değerleri nereye önemli değil ';' içinde, hangi hemen deyimi sona erer ve korsan istediği hemen hemen her şeyi yapabilir anlamına gelir bir yenisini başlatır.

Güvenli olması için, sadece ($ değişken) mysql_real_escape_string kendi değerleriniz sarın. Yani:

WHERE Something='".mysql_real_escape_string($variable)."'