Php mysql şifresini şifrelemek nasıl (veya otomatik kod tarayıcı kırmızı bayrak yenmek için nasıl)

8 Cevap php

Yönetimi tekrar vurur.

Nasıl benim php kaynağını ve kırmızı bayrak benim MySQL bağlantı dizesi okumak için gidiyor kod tarayıcı karşılamak gerekir?

  • Linux Sunucu (yakında Güneş olmak)
  • php 4.2 (yakında son sürüm olacak)
  • MySQL veritabanı
  • Güvenlik duvarı dışında bir DMZ Sunucular
  • Sadece MySQL hesabı okuyun
  • Veritabanında olmayan kamu bilgi değil bir tek bayt

Ben otomatik kod test çözümü ile bayraklı kırmızı olacak başka hiçbir nedenle bağlantı dizesinde benim MySQL şifresini şifrelemek zorunda. Yönetim anlamadan Pen Testing kavramı ile büyülenmiş.

Ben bir yerde tüm diğer tedbirlerle dosyasında şifre şifrelemek için daha fazla güvenli değildir tam iyi biliyorum, ama ben uymayan eğer benim siteleri aşağı alınacaktır. Ben performansı acıyor biliyorum ama bu site kadar popüler değil ve zaten büyük bir veritabanı odaklı uygulama değildir.

Benim girişimi:

//encrypt and decrypt are functions I stole wholesale off of the php.net manual
...
$SuperSecure[0] = array(encrypt("test"), encrypt("test")); //dev
...
$dbcnx = mysql_connect('localhost', decrypt($SuperSecure[0][0]), decrypt($SuperSecure[0][1]));

Daha iyi bir yolu var mı? Daha da önemlisi, ben bir şey eksik ve bu gerçekten gerekli mi?

Düzenleme: Artık milli mücadele edemez. Ben bu direktifi görmezden gelirseniz Sitem aşağı geliyor ve bu işimi kaybetme aptal. Ben mümkün olduğu kadar (ve az performans etkisi ile) gibi kolayca yapmak için.

8 Cevap

Doğrudan mysql_connect içine parolayı yazmak istemiyorsanız, neden böyle bir şey yazmak değil:

$username = 'test';
$password = 'test';
mysql_connect('localhost', $username, $password);

Tarayıcı ne kadar zeki bilmeden gerçekten herhangi bayraklarını yükseltmek için yeterli ne obsfucation söylemek mümkün olmayacaktır.

Bu bir sadece kodu muhafaza birine daha kafa karıştırıcı yapar, anlamsızdır. Korkak olmayın, akılsız kod-tarama savunucuları almak ve içeri vermeyin

Eğer bir php.ini dosyasında varsayılan mysql ev sahibi, kullanıcı adı ve parola tanımlayın değil misiniz? Sonra mysql_connect fonksiyonu gibi görünüyor:

`mysql_connect();`

Bir hacker php.ini dosyasını sahip olmadıkça, onlar adı veya şifre erişmek mümkün olmayacaktır. Onlar işlevi değişti bile echo. Tabii onlar direktifleri yankı olabilir, ama şifre sunucu dosya olan, bir kenara php.ini gelen, kaynak dosyaları herhangi bulunamadı gibi, yeterince karartılmış olduğunu düşünüyorum.

Birisi phpinfo(); o da düz sitede görüntülenir olacağını yaptıysa, göz önüne alındığında, ama yine de çalışmaya devam eder.


Bu çözelti, başka bir yanıt sağladığı ODBC çözeltisine çok benzer. Ayrıca tarayıcı Lütfen php.ini dosyasını kontrol ederse, o kırmızı yerine işaretleme sonunda gidiyor kusur vardır.


Eğer aynı zamanda onun alay etmek istiyorsanız, ben size bağlanmak için gereken önce tüm içeren rasgele dosyalarında mysql kod parçacıkları koyarak rastgele öneririm. AKA

Index.php

Global $password;
$password = "S";

RandomFile.php

Global $password;
$password .= "T";

RandomFile2.php

Global $password;
$password .= "A";

RandomFile3.php

Global $password;
$password .= "CK";

RandomFile4.php

Global $password;
mysql_connect($host, $username, $password."Overflow");

Sadece şifreyi karartmak edeceğiz, çünkü gereksiz IS. PHP komut decrypt orijinal şifre almak bilmek beri kaynağı olan herkes veritabanına giriş yapabilirsiniz.

Example

en şifrenizi örneğin, bir sayıdır 42 ve encrypt tersini yapar iki ve decrypt tarafından çarpar bir işlevi olduğunu söyleyelim.

Sonra, bir yerde kod 84 mağaza olacak. Ancak, PHP decrypt işlevini bilmek zorunda ve ilk veritabanına bağlanmadan önce 42 dönüştürecektir. Ihtiyacınız olan her şey PHP dosyası durmak zorunda beri Yani, gerekli bilgileri karartmak için anlamsızdır.

Lütfen kaynağı olan bazı kötü korsan her zaman echo ile kod örneği mysql_connect yerini alabilir ve düz metin parola alacak ...

Easy obfuscation

Belki şifre algılamasını atlamak için kod "t"."e"."s"."t" yerine gibi bir şey "test" kullanmak yeterlidir ...

Sen (şifrelemek değil) şifreyi karartmak için rot13 kullanabilirsiniz

XOR! Saygıdeğer bir defalık pad temeli. Bu, meşru bir şifreleme var sonra rot13 () daha hoş görünmesini sağlar ve yetkili herkes bunu anlamaya gerekir. Aynı zamanda, hiç kimse şifrenizi grepping olacaktır.

<?
$pass = 'foobar';
$key = 'monkey';
$secret = $pass XOR $key;
$list = array($key, $secret);
foreach($list as $x) {
    print "Keypart: ";
    print implode(unpack('H*',$x));
    print "\n";
}
?>

Veee aniden PHP dizileri yok nasıl nefret ediyorum ... Şimdi, bunun çıktısını almak ...

<?
#Keypart: 6d6f6e6b6579
#Keypart: 666f6f626172

$secret = '666f6f626172';
$key = '6d6f6e6b6579';
$pass = pack('H*', $key) XOR pack('H*', $secret);
print "$pass\n";
?>

İlk bölümü şifreleme jeneratör ve ikinci kısmı programa koymak zorunda budur. Sadece kural karşı şifreyi XOR bytestring ne olursa olsun şifre olarak aynı uzunlukta olmasıdır. Eğer değilse muhtemelen istenmeyen bir şey yapmayacağım, ama ben bir dizge bina gibi hissetmiyorum.

Sen veritabanına erişmek için ODBC bağlantısı kullanabilirsiniz. ODBC soyutlama katmanı ayrı bir dosyada onun bağlantı özelliklerini saklar (in UnixODBC, bu odbc.ini ve ~ /. Odbc.ini / etc / s). Bu şekilde, sistem DSN veritabanına erişmek için nasıl biliyorsunuz, ve komut üzerinde durulacaktır.

Bu daha karmaşık işlevleri ve düz bir MySQL bağlantı yaptığı sorguları bazı erişimi yok gibi olsa da, ODBC kullanarak dikkatli tavsiye ediyorum.

Ben burada noktayı eksik, ama bana bu sorayım olabilir.

Neden mysql_connects ve veritabanı bağlantıları ile ilgili diğer mevcut yöntemlerle kodunuzu peppering ziyade, o çalışma zamanında dahil, yapılandırma dosyasının bazı forma mysql bağlantı bilgi depolamak ve veritabanı soyutlama bazı formunu kullanarak değil mi?

Ben şüpheli otomatikleştirilmiş kod tarama çözümü plaintext ini dosyaları, veya xml ini dosyalarını okumak olacağını bulur ve şifreniz düşünce dağınık değil ki bazı çerçeveler, Zend gibi, yapılandırma dosyaları bu tür başa çıkmak çok kolay kodunuzu, ya da herhangi bir noktada erişilebilir web ...

Eğer bir yerde tüm diğer tedbirleri var gibi geliyor (sadece gerekli privs ile ağ, güvenli mysql hesabı dışında sunucusu.). Ben ne yapıyorsun yanlış anlaşılmasından, ya da burada en iyi uygulamaları önlemek için bir neden yoktur muyum?

Selamlar