• 13-03-2025, 20:22:48
    #1
    Arkadaşlar başlık biraz absürt oldu ama bir tuhaf sorum olacak ben açıkçası çözemedim,

    Şimgi bir script var örneğin drupal veya wordpress gibi düşünebilrsiniz. Kurulum kısmında mysql şifresini: '....@$3....' yapınca config içine aynı şekilde işlediği için bağlantı sağlamıyor.
    $cfg['mysqlhost'] = 'localhost'; // Database host URL
    $cfg['mysqlport'] = '3306'; // Database port, if non-default
    $cfg['mysqluser'] = 'qwe'; // Database user
    $cfg['mysqlpassword'] = '....@....'; // Database password
    $cfg['mysqldb'] = 'qwe'; // Database name

    Bu şekilde oluyor config, burada kaçış yaptığımda ise çift tırnakta kalıyor veya kaçışı yapamıyor.
    eğer mysql şifresi tek tırnak ile başlayıp biterse çift içine al tam tersi ise tek tırnak içine al dedim yine olmadı burada.

    function cot_installConfigReplace(&$file_contents, $config_name, $config_value)
    {
    file_put_contents('debug-log.txt', "GELEN DEĞER: $config_value\n", FILE_APPEND);
    if (strpos($config_value, '"') === 0 && strrpos($config_value, '"') === strlen($config_value) - 1) {
    $config_value_clean = substr($config_value, 1, -1);
    $config_value_escaped = "'" . addslashes($config_value_clean) . "'";
    }
    elseif (strpos($config_value, "'") === 0 && strrpos($config_value, "'") === strlen($config_value) - 1) {
    $config_value_clean = substr($config_value, 1, -1);
    $config_value_escaped = '"' . addslashes($config_value_clean) . '"';
    }
    else {
    $config_value_escaped = "'" . addslashes($config_value) . "'";
    }
    file_put_contents('debug-log.txt', "DÜZENLENEN ŞİFRE: $config_value_escaped\n", FILE_APPEND);
    $file_contents = preg_replace(
    "/(\\\$cfg\\['" . preg_quote($config_name, '/') . "'\\]\\s*=\\s*)('|\").*?\\2;/m",
    "\$1$config_value_escaped;",
    $file_contents
    );
    
    file_put_contents('config-debug.php', $file_contents);
    }
    Bu şekilde bir çözüm düşündüm ama olmadı, burada nasıl çözüme ulaşabiliriz ? veya dikkatimden kaçan yada göremediğim kısım nedir ?

    Üstadlarımızdan her türlü önerilere açığımdır efendim






    /*------------------------------------------------------------*/


    ilgili dosyaları inceleyebilmeniz için; https://files.rootali.net/index.php?share=Cotonti-0.9.25.ref
    Tüm kurulum dosylarına buradan erişebilirsiniz.
    Standart bir kurulum yapın ilk defa kurulum deneyecek olanlar için video bırakayım: https://www.youtube.com/watch?v=kAbDyPuOcAQ
    İlgili kurulum modülü ise: modules/install/inc/install.functions.php içinde yer alıyor diğer dosyalara da bakabilirsiniz.

    Ben başaramadım yapabilen varsa tecrübesiyle aydınlatırsa sevinirim
  • 13-03-2025, 20:26:28
    #2
    Ben şifre kısmını anlayamadım. Yahut anlayamayan bir benmiyim...
    Trimmi yapıyor yani.
    '....@$3...' yapınca sadece '...@...' mı kalıyor.
    Yani her halukarda manuel config oluturun. İnstall ile yapmak mecburiyeti yoksa.
    Yani şifreni bi tam anlayabilsek belki üzerinde düşünücez ama
  • 13-03-2025, 20:26:59
    #3
    Buyrun direk sorunsuz devam edin

    function cot_installConfigReplace(&$file_contents, $config_name, $config_value) 
    {
        // Gelen değeri temizle
        $config_value = trim($config_value);
        
        // Özel karakterleri işle
        if (preg_match('/^["\'].*["\']$/', $config_value)) {
            // İçeriği tırnaklardan ayır
            $content = substr($config_value, 1, -1);
            
            // Başlangıç tırnağını kontrol et
            if ($config_value[0] === '"') {
                // Çift tırnaktan tek tırnağa çevir
                $config_value_escaped = "'" . addcslashes($content, "'\\") . "'";
            } else {
                // Tek tırnaktan çift tırnağa çevir
                $config_value_escaped = '"' . addcslashes($content, "\"\\") . '"';
            }
        } else {
            // Tırnaksız gelen değeri tek tırnağa al
            $config_value_escaped = "'" . addcslashes($config_value, "'\\") . "'";
        }
        
        // Config içeriğini güncelle
        $pattern = "/(\\\$cfg\\['" . preg_quote($config_name, '/') . "'\\]\\s*=\\s*)(['\"]).+?\\2(\s*;)/";
        $replacement = "\${1}$config_value_escaped\${3}";
        $file_contents = preg_replace($pattern, $replacement, $file_contents);
        
        return true;
    }
  • 13-03-2025, 20:31:16
    #4
    AzveNET adlı üyeden alıntı: mesajı görüntüle
    Ben şifre kısmını anlayamadım. Yahut anlayamayan bir benmiyim...
    Trimmi yapıyor yani.
    '....@$3...' yapınca sadece '...@...' mı kalıyor.
    Yani her halukarda manuel config oluturun. İnstall ile yapmak mecburiyeti yoksa.

    Evet aynen dediğiniz gibi oluyor: şifrem bu: '....@$3...'
    Configde olması gereken ise "'....@$3...'"
    ama hiç bir şekilde bu formata alamıyorum.

    function cot_installConfigReplace(&$file_contents, $config_name, $config_value)
    {
    // Burada özel karakterleri kaçışlıyoruz:
    $config_value_escaped = str_replace(
    ['\\', '$', "'"],
    ['\\\\', '\\$', "\\'"],
    $config_value
    );
    
    $pattern = "#^\\\$cfg\\['$config_name'\\]\\s*=\\s*'.*?';#m";
    $replacement = "\$cfg['$config_name'] = '$config_value_escaped';";
    
    $file_contents = preg_replace($pattern, $replacement, $file_contents);
    }
    Bu şekilde denedim yine olmadı.

    Manuel config olmaması için çabalıyorum aksi halde bu şekilde bir sorun olmaz


    Bu şifreyi Wordpress ile denediğimde sorunsuz bahsettiğim kaçışı yapıyr acaba nasıl bir kullanmışlar
  • 13-03-2025, 20:31:42
    #5
    Şifre içinde özel karakterler (@, $, \) olduğu için config dosyasına düzgün şekilde yazılamıyor. Muhtemelen addslashes() yeterli gelmiyor veya yanlış yerde kullanılıyor.

    Sorunun temelinde, şifreyi PHP koduna yazarken kaçış karakterlerinin doğru şekilde işlenmemesi yatıyor.

    addslashes() yerine, var_export() kullanmayı dene. var_export(), değeri doğrudan PHP koduna uygun şekilde yazmana yardımcı olur:

    $config_value_escaped = var_export($config_value, true);
    Bu şekilde PHP'nin kendi kurallarına uygun olarak tırnakları ayarlamasını sağlayabilirsin.

    preg_replace() kullanımında regex'in $cfg['mysqlpassword'] değerini düzgün değiştirdiğinden emin olmak için şunu deneyebilirsin:

       $file_contents = preg_replace(
           "/(\\\$cfg\\['" . preg_quote($config_name, '/') . "'\\]\\s*=\\s*)(['\"])(.*?)(\\2);/m",
           "\$1$config_value_escaped;",
           $file_contents
       );
    Burada (.*?) yerine, .*? kullanarak mevcut değeri daha güvenli şekilde yakalıyoruz.

    Debug için, şifrenin cot_installConfigReplace() fonksiyonuna nasıl ulaştığını kontrol etmek için şu satırı ekleyebilirsin:

    file_put_contents('debug-log.txt', "Gelen: " . var_export($config_value, true) . "\n", FILE_APPEND);
    Bunları dene. Hâlâ çözülmezse, fonksiyonun tam çağrıldığı yeri ve config.php dosyasının formatını kontrol etmek gerek.
  • 13-03-2025, 20:33:58
    #6
    Hugme adlı üyeden alıntı: mesajı görüntüle
    Buyrun direk sorunsuz devam edin

    function cot_installConfigReplace(&$file_contents, $config_name, $config_value)
    {
        // Gelen değeri temizle
        $config_value = trim($config_value);
        
        // Özel karakterleri işle
        if (preg_match('/^["\'].*["\']$/', $config_value)) {
            // İçeriği tırnaklardan ayır
            $content = substr($config_value, 1, -1);
            
            // Başlangıç tırnağını kontrol et
            if ($config_value[0] === '"') {
                // Çift tırnaktan tek tırnağa çevir
                $config_value_escaped = "'" . addcslashes($content, "'\\") . "'";
            } else {
                // Tek tırnaktan çift tırnağa çevir
                $config_value_escaped = '"' . addcslashes($content, "\"\\") . '"';
            }
        } else {
            // Tırnaksız gelen değeri tek tırnağa al
            $config_value_escaped = "'" . addcslashes($config_value, "'\\") . "'";
        }
        
        // Config içeriğini güncelle
        $pattern = "/(\\\$cfg\\['" . preg_quote($config_name, '/') . "'\\]\\s*=\\s*)(['\"]).+?\\2(\s*;)/";
        $replacement = "\${1}$config_value_escaped\${3}";
        $file_contents = preg_replace($pattern, $replacement, $file_contents);
        
        return true;
    }

    Sizin fonksiyon ile şifreyi hiç almadı
    $cfg['mysqlpassword'] = '';
  • 13-03-2025, 20:36:18
    #7
    Kodespa adlı üyeden alıntı: mesajı görüntüle
    Sizin fonksiyon ile şifreyi hiç almadı
    $cfg['mysqlpassword'] = '';
    boş değerleride alacak şekilde güncelledim tekrar dener misin

    function cot_installConfigReplace(&$file_contents, $config_name, $config_value) 
    {
        // Gelen değeri temizle
        $config_value = trim($config_value);
        
        // Özel karakterleri işle
        if (preg_match('/^["\'].*["\']$/', $config_value)) {
            // İçeriği tırnaklardan ayır
            $content = substr($config_value, 1, -1);
            
            // Başlangıç tırnağını kontrol et
            if ($config_value[0] === '"') {
                // Çift tırnaktan tek tırnağa çevir
                $config_value_escaped = "'" . addcslashes($content, "'\\") . "'";
            } else {
                // Tek tırnaktan çift tırnağa çevir
                $config_value_escaped = '"' . addcslashes($content, "\"\\") . '"';
            }
        } else {
            // Tırnaksız gelen değeri tek tırnağa al
            $config_value_escaped = "'" . addcslashes($config_value, "'\\") . "'";
        }
        
        // Config içeriğini güncelle - pattern değiştirildi
        $pattern = "/(\\\$cfg\\['" . preg_quote($config_name, '/') . "'\\]\\s*=\\s*)(['\"'])(.*?)\\2(\s*;)/";
        $replacement = "\${1}$config_value_escaped\${4}";
        
        // Değişikliği uygula
        $new_contents = preg_replace($pattern, $replacement, $file_contents);
        
        // Eğer değişiklik yapıldıysa güncelle
        if ($new_contents !== null) {
            $file_contents = $new_contents;
            return true;
        }
        
        return false;
    }
  • 13-03-2025, 20:39:18
    #8
    Lawliet adlı üyeden alıntı: mesajı görüntüle
    Şifre içinde özel karakterler (@, $, ) olduğu için config dosyasına düzgün şekilde yazılamıyor. Muhtemelen addslashes() yeterli gelmiyor veya yanlış yerde kullanılıyor.

    Sorunun temelinde, şifreyi PHP koduna yazarken kaçış karakterlerinin doğru şekilde işlenmemesi yatıyor.

    addslashes() yerine, var_export() kullanmayı dene. var_export(), değeri doğrudan PHP koduna uygun şekilde yazmana yardımcı olur:

    $config_value_escaped = var_export($config_value, true);
    Bu şekilde PHP'nin kendi kurallarına uygun olarak tırnakları ayarlamasını sağlayabilirsin.

    preg_replace() kullanımında regex'in $cfg['mysqlpassword'] değerini düzgün değiştirdiğinden emin olmak için şunu deneyebilirsin:

       $file_contents = preg_replace(
           "/(\\\$cfg\\['" . preg_quote($config_name, '/') . "'\\]\\s*=\\s*)(['\"])(.*?)(\\2);/m",
           "\$1$config_value_escaped;",
           $file_contents
       );
    Burada (.*?) yerine, .*? kullanarak mevcut değeri daha güvenli şekilde yakalıyoruz.

    Debug için, şifrenin cot_installConfigReplace() fonksiyonuna nasıl ulaştığını kontrol etmek için şu satırı ekleyebilirsin:

    file_put_contents('debug-log.txt', "Gelen: " . var_export($config_value, true) . "\n", FILE_APPEND);
    Bunları dene. Hâlâ çözülmezse, fonksiyonun tam çağrıldığı yeri ve config.php dosyasının formatını kontrol etmek gerek.

    Sanırım bu şekilde diyorsun doğru mu anladım bilmiyorum;

    function cot_installConfigReplace(&$file_contents, $config_name, $config_value)
    {
    // Gelen değeri debug için logla
    file_put_contents('debug-log.txt', "Gelen: " . var_export($config_value, true) . "\n", FILE_APPEND);
    
    // var_export ile güvenli PHP formatında değer oluştur
    $config_value_escaped = var_export($config_value, true);
    
    // Regex ile değiştirilecek deseni belirle
    $pattern = "/(\$cfg\['" . preg_quote($config_name, '/') . "'\]\s*=\s*)(['"])(.*?)(\2);/m";
    $replacement = "$1$config_value_escaped;";
    
    // Config dosyasındaki değeri değiştir
    $file_contents = preg_replace($pattern, $replacement, $file_contents);
    
    // Değiştirilmiş içeriği debug için kaydet
    file_put_contents('config-debug.php', $file_contents);
    }


    Eğer bundan bahsettiysen yine olmadı config içine aşağıdaki gibi yazdı şimfi de;
    $cfg['mysqlpassword'] = ''....@....'';
  • 13-03-2025, 20:41:38
    #9
    Hugme adlı üyeden alıntı: mesajı görüntüle
    boş değerleride alacak şekilde güncelledim tekrar dener misin

    function cot_installConfigReplace(&$file_contents, $config_name, $config_value)
    {
        // Gelen değeri temizle
        $config_value = trim($config_value);
        
        // Özel karakterleri işle
        if (preg_match('/^["\'].*["\']$/', $config_value)) {
            // İçeriği tırnaklardan ayır
            $content = substr($config_value, 1, -1);
            
            // Başlangıç tırnağını kontrol et
            if ($config_value[0] === '"') {
                // Çift tırnaktan tek tırnağa çevir
                $config_value_escaped = "'" . addcslashes($content, "'\\") . "'";
            } else {
                // Tek tırnaktan çift tırnağa çevir
                $config_value_escaped = '"' . addcslashes($content, "\"\\") . '"';
            }
        } else {
            // Tırnaksız gelen değeri tek tırnağa al
            $config_value_escaped = "'" . addcslashes($config_value, "'\\") . "'";
        }
        
        // Config içeriğini güncelle - pattern değiştirildi
        $pattern = "/(\\\$cfg\\['" . preg_quote($config_name, '/') . "'\\]\\s*=\\s*)(['\"'])(.*?)\\2(\s*;)/";
        $replacement = "\${1}$config_value_escaped\${4}";
        
        // Değişikliği uygula
        $new_contents = preg_replace($pattern, $replacement, $file_contents);
        
        // Eğer değişiklik yapıldıysa güncelle
        if ($new_contents !== null) {
            $file_contents = $new_contents;
            return true;
        }
        
        return false;
    }
    Yine hüsran
    $cfg['mysqlpassword'] = "....@....";