Hata mesajının SQL göstermesini engelleyin


10

Masamda, iyi çalışan yinelenen girişleri önlemek için 'col1' üzerinde bir dizin oluşturdum, ancak yinelenen bir giriş eklemeye çalıştıklarında bir kullanıcıya görüntülenen hata iletisi, SQL'i de içerdiğinden bana bir güvenlik sorunu gibi görünüyor tablo öneki.

Hata iletisinde Joomla'nın SQL göstermesini durdurmanın bir yolu var mı?

Global yapılandırmada hata raporlama ayarlarını değiştirmeyi denedim ama anlayabildiğim kadarıyla hiçbir etkisi yok ...

Örnek mesaj:

Hata

Kaydetme işlemi şu hatayla başarısız oldu: 'TestKey' anahtarı için yinelenen 'Test' girişi SQL = INSERT INTO `jml_mycomp_tbl1` (` id`, `col1`,` sipariş``, `durum`,` oluşturulan_by`) DEĞERLER ('0' 'test', '2', '1', '730')


1
Joomla için yeniyim, ama kesinlikle haklısınız, bir üretim ortamındaki kullanıcı alanı hataları herhangi bir SQL içermemelidir. Sadece güvenlik için değil, kullanıcılar için anlamsız olduğu ve kötü bir kullanıcı deneyimi sağladığı için. Üretim ortamında, display_errors(PHP ayarı) kapalı olmalı ve bu tür hatalar yalnızca sunucu tarafı hata günlüğünüze kaydedilmelidir.
MrWhite

Sadece merak ettiniz, muhtemelen bunu zaten kontrol ettiniz, ancak herhangi bir hata ayıklama ayarının etkinleştirilmemesi mümkün değil mi? Şunları kontrol edin: Global Config> hata ayıklama sistemi ayarı. Kontrol edin: Global Config> Hata raporlama seviyesi. Kontrol edin: Eklentiler> Hata ayıklama eklentisi Sadece garip bir şey olup olmadığını merak ediyorum. Soruyorum çünkü bu öğrenmeyi
Chad Windnagle

@ChadWindnagle Merhaba Chad, evet bunu açmayı denedim ama hiçbir etkisi yok ...
doovers

üzgünüm sadece düzenlenmiş, sadece güncellenmiş içeriği gördüğünüzü bana bildirir misiniz? thnx!
Chad Windnagle 14:14

@ChadWindnagle Hayır Düzenlemenizi görmemiştim! Hata raporlama deneyin vermedi ama ben sadece şimdi denedim ama hala hiçbir etkisi eklentisi (ipucu için teşekkürler) devre dışı bırakmayı unuttum!
Doovers

Yanıtlar:


6

Belki bir try catch komutu kullanabilirsiniz:

try
{
//Your code to run the SQL here 
}
catch (Exception $e)
{
$this->setError('The error message you want');
return false;
}

Öneri için teşekkürler ama JTableen iyi çözümü kullandığımdan beri cevabımdaki checkyöntemi geçersiz kılmaktı.
Doovers

Bu iyi bir cevap
David Addoteye

3

Bu davranışı önlemek mümkün görünmediğinden, aşağıdaki çözümü uyguladım. Bir JTable checkyöntem geçersiz kılma işlemine yinelenen bir denetim ekleyin :

// Check for duplicate entry
$db = JFactory::getDbo();
$query = $db->getQuery(true);

$query->select('COUNT(*)');
$query->from($this->get('_tbl'));
$query->where($db->quoteName('col1') . ' = ' . $db->quote($this->col1));

$db->setQuery($query);
$result = $db->loadResult();

if ($result) 
{
    $this->setError(" Duplicate entry for col1 = '" . $this->col1 . "'");
    return false;            
}

1

Öncelikle yinelenenleri kontrol etmek ve kullanıcıya uygun bir hata (yazdığınız bir hata) döndürmek için eki yapan kodunuzu değiştirmelisiniz ve MySQL tarafından döndürülen gerçek hatayı göstermeye güvenmemelisiniz.


Evet bunu yapmak zorunda olabilir düşündüm ama yine de Joomla kullanıcıya gösterilen bir hata mesajında ​​SQL göstermek için mutluyuz. Şüphesiz bu bir güvenlik meselesidir ?? Ben rastgele tablo önek bütün mesele bir güvenlik önlemi olarak düşündüm hayır? Belki en iyi uygulama kendi hata işlemenizi yapmaktır, ancak öngöremediğiniz bir durum olabilir ... Bana biraz garip geliyor!
doovers

Şey, Joomla! kullanıcıya SQL hata mesajını göstermez, kodunuzu gösterir.
Ivo

Kabul etmiyorum, kodum hata iletisini göstermiyor, ancak Joomla çekirdek kodunun göstermesine izin veriyor. Bence, çekirdek kod bir güvenlik endişesi olduğu için hiçbir durumda tablo önekini görüntülememelidir ...
doovers

Neden INSERT yerine INSERT IGNORE kullanmıyorsunuz?
Ivo

İyi bir öneri ve bunu yapabilirdim ama ben kullanıyorum beri yöntemi JTablegeçersiz kılmak checkve orada bir yinelenen test için daha eğilimli olacaktır . Ben sadece SQL ile değil, kullanıcıya bir hata mesajı görüntülemek istiyorum!
doovers
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.