Ben nasıl bu SELECT sorgusu temizleyebilir?

5 Cevap php

Ben tam root erişimi olan özel bir sunucu (Ubuntu Sunucu 8.10) üzerinde PHP 5 ve MySQL 5 koşuyorum. Ben SQL çok sayıda yapının bu tür seçer ben miras ettik ve ben var bazı LAMBASI kod temizlik yapıyorum:

SELECT ... FROM table WHERE
  LCASE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
    strSomeField, ' ', '-'), ',', ''), '/', '-'), '&', ''), '+', '')
  ) = $somevalue

Veritabanı ilk etapta böyle bir seçme gerektiren inşa edilmiştir asla ve $ somevalue alan açılmakta güvenlik açığı takmak için Parametrelenecek gerekir gerçeğini görmezden gelerek, ne bir şey içine NEREDE durumunu tespit için en iyi seçenek az saldırgan? Ben MSSQL veya Oracle kullanılarak olsaydı ben sadece birlikte bir kullanıcı-tanımlı bir işlev koymak istiyorum, ama ben C kodlama mutluyum rağmen, MySQL ile benim deneyim daha sınırlı ve daha önce onunla bir UDF inşa ettik

Update: zaten orijinal kodu bu onların kaşlarını kaldırdı ettik herkes için, $ somevalue ['ürün'] GET aslında $ gibi bir şeydir-orada tema üzerine bir kaç varyasyon vardır. Bu durumda seçme ürün adı-sonra önce bir tanım parametre olarak geçirilen olabilir ne eşleşecek şekilde karakterleri sıyırma tarafından veritabanından geri ürün çekiyor.

5 Cevap

ne daha az saldırgan bir şey içine NEREDE durumunu tespit için en iyi seçenektir?

Uygulama katmanı değiştirin mı, veritabanında olması bu mantık için görüşme yoktur. Bir düz eski PHP işlevi olun.

ETA: argh ne demek istediğini görüyorum. Dolma, sonra bütün kalan bu "veritabanı ilk etapta böyle bir seçme gerektiren inşa edilmiş asla gerçeği!" :-) Sen could hareket (CREATE FUNCTION) ... kesinlikle sorgu daha güzel görünmesini istiyorsunuz saklanan bir üretim dışarı DEĞİŞTİR, ama bu tür halının altına sorun süpürme hala bütün tablo taranır ve SELECT sorgusu yapmak için işlenmiş olması gerekir gerçekten de. Özür dilerim, şema değiştirmeden çok daha iyi yapabileceğini sanmıyorum.

(Ben bu Normalde gerçekten bir düz eski PHP fonksiyon o yapardım? Bir metin başlığı bir 'temizlenme' ID-tarzı simge olsun, ve 'gerçek' ayrı bir sütun olarak saklamak için bir işlev olduğunu tahmin ediyorum başlık. Sonra kolayca seçin, ve performans için dizin bunu yapabilirsiniz.)

Düzenli ifade kütüphanesi göz atın:

Özellikle:

REGEXP_REPLACE?(text, pattern, replace ...)

Ah canım, o eğlenceli biri. İşte strSomeField için ne bir özeti:

  • alanlarda ve öne doğru eğik tire haline
  • virgül, imi, ve artı-işaretler kaldırılır
  • küçük harfe dönüştürülmüş

Bu kolayca MySQL recompliation gerektirir inanıyorum MarkusQ bağlantılı regexp_replace kullanıcı-tanımlı fonksiyon eklemeden MySQL yapılamaz.

Bu gerekli değildir, böylece sadece tablodaki tüm verileri işleme seçeneği var mı? Yukarıda özetlendiği gibi aynı işleme gerçekleştirmek ve yeni değerlerle satırları güncelleştirmek, strSomeField bütün değerlerini seçmek için bir PHP komut dosyası oluşturun. Ya da bu uygulamanın diğer parçaları kıracak?

Bir Önişlenmiş strSomeField sütunu ile yeni bir alan oluşturmak yaparsanız, strSomeField değişirse otomatik olarak güncelleştiren bir tetikleyici eklemek gerekir. Bazı baş ağrıları ortadan kaldırmak olabilir.

after stripping out characters so it matches what could be previously passed as a URI parameter.

Oh. Aynı tuzak tekrar ve tekrar.

Do not use product name as a key!

Don't you think SO authors are less experienced than you?
But look at the SO question url:
stackoverflow.com/questions/587422/how-can-i-clean-up-this-select-query
They use a numeric key and the rest just for decoration.
So, name can be edited at any time but the page will remain the same. And sure, no problems like yours one.

Bu veritabanı sorunu değil. Bu tasarım sorunu var. Arıza söyleyebilirim.