Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it L'avatar di strae
    Registrato dal
    Apr 2008
    Messaggi
    407

    [database] E' possibile rendere il parametro connessione al db obbligatorio?

    Ciao ragazzi, noi tutti sappiamo come funzionano le query ai vari db:
    resource pg_query ([ resource $connection ], string $query )
    resource mysql_query ( string $query [, resource $link_identifier ] )
    nel caso che il parametro $connection o $link_identifier siano omessi, PHP recupera l'ultima connessione attiva e utilizza quella.

    A me servirebbe invece che quel parametro sia obbligatorio.

    Qualcuno sà se è possibile, magari ricompilando il php con qualche opzione o settare qualche parametro nel php.ini?

    Ve ne sarei davvero molto grato!
    You HAVE to assume your visitor is a maniac serial killer, out to destroy your application. And you have to prevent it.
    I can accept failure, everyone fails at something - But I can't accept not trying.

  2. #2
    Utente di HTML.it L'avatar di bubi1
    Registrato dal
    Dec 2009
    Messaggi
    1,230
    Beh, anche se non riuscirei a indovinare nessuna ragione perche' cio` possa essere necessario, e' facile.
    Ad esempio nel caso del mysql, vai nel sorgente, apri ext/mysql/php_mysql.c, trova la funzione php_mysql_do_query, sposta i controlli dal case 1 dello switch nel case 2, togli il case 1, ricompila, e poi se ti passeranno 1 parametro anziche 2, lo script restituira wrong param count.

    Ma considera che:
    Dovrai farlo per ogni driver/estensione disponibile sul tuo sistema: mysql, mysqli, mysqlnd per renderlo obbligatorio.
    Dovrai ricordarti ad ogni nuova versione di modificare il sorgente.
    E potresti dover incotrare altri problemi imprevisti.

  3. #3
    Utente di HTML.it L'avatar di strae
    Registrato dal
    Apr 2008
    Messaggi
    407
    Originariamente inviato da bubi1
    Beh, anche se non riuscirei a indovinare nessuna ragione perche' cio` possa essere necessario, e' facile.
    Ad esempio nel caso del mysql, vai nel sorgente, apri ext/mysql/php_mysql.c, trova la funzione php_mysql_do_query, sposta i controlli dal case 1 dello switch nel case 2, togli il case 1, ricompila, e poi se ti passeranno 1 parametro anziche 2, lo script restituira wrong param count.

    Ma considera che:
    Dovrai farlo per ogni driver/estensione disponibile sul tuo sistema: mysql, mysqli, mysqlnd per renderlo obbligatorio.
    Dovrai ricordarti ad ogni nuova versione di modificare il sorgente.
    E potresti dover incotrare altri problemi imprevisti.
    Si infatti, quella è una soluzione ma non mi piace del tutto.. avrei di gran lunga preferito un settaggio nell'ini set.

    Il motivo per cui mi serve questa funzione è la realizzazione di un sistema di moduli/plugin all'interno di un'applicazione che stò sviluppando.

    Praticamente, voglio forzare chi scrive un modulo/plugin a utilizzare le classi che fornisco invece che, per qualsiasi motivo, lanciare una query con pg_query o mysql_query (utilizzerò postgresql, ma la cosa potrebbe essere interessante un domani anche per mysql).

    Finora l'unica soluzione alternativa era, all'interno della classe che gestisce query e connessioni, creare un'altra connessione a un db senza dati usando un utente senza permessi subito dopo la connessione reale, così che tutte le funzioni pg_* o mysql_* avrebbero puntato sulla connessione 'fantasma' invece che su quella reale (che è protetta all'interno della classe, e quindi non invocabile a piacimento dall'esterno).
    Ma questo significherebbe anche duplicare letteralmente le connessioni al db, e ciò è male

    Se ti và di leggerti tutte le risposte che mi hanno dato su stackoverflow trovi qui il 3d
    You HAVE to assume your visitor is a maniac serial killer, out to destroy your application. And you have to prevent it.
    I can accept failure, everyone fails at something - But I can't accept not trying.

  4. #4
    Utente di HTML.it L'avatar di bubi1
    Registrato dal
    Dec 2009
    Messaggi
    1,230
    No, nell'ini puoi solo disabilitare completamente la funzione, tutto qui.

    Potresti provare il runkit. Se lo installi, lui ha un parametro di configurazione che permette di agire sulle funzioni interne del php.
    Se tutto funziona come dovrebbe, potresti semplicemente rimuovere/modificare la mysql_query() direttamente durante il runtime dello script, prima di chiamare il modulo/plugin esterno.

  5. #5
    Utente di HTML.it L'avatar di strae
    Registrato dal
    Apr 2008
    Messaggi
    407
    Ah-ehm.. ho provato ad aprire il file che mi hai indicato, e la funzione che dici tu:
    Codice PHP:
    /* {{{ php_mysql_do_query
     */
    static void php_mysql_do_query(INTERNAL_FUNCTION_PARAMETERSint use_store)
    {
        
    char *query;
        
    int query_len;
        
    zval *mysql_link NULL;
        
    int id = -1;
        
        if (
    zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC"s|r", &query, &query_len, &mysql_link) == FAILURE) {
            return;
        }

        if (!
    mysql_link) {
            
    id php_mysql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU);
            
    CHECK_LINK(id);
        }

        
    php_mysql_do_query_general(queryquery_lenmysql_linkidNULLuse_storereturn_value TSRMLS_CC);

    ...ma non capisco proprio come modificarla

    L'unico pezzo che mi sembra possa fare al caso mio è:
    Codice PHP:
        if (!mysql_link) {
            
    id php_mysql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU);
            
    CHECK_LINK(id);
        }
    //che, se ho capito quel che fà, dovrebbe essere
        
    if (!mysql_link) {
            return;
        }
    //così se il mysql_link non è settato, invece di cercare l'ultima connessione aperta, esce dalla funzione. 
    Giusto?
    You HAVE to assume your visitor is a maniac serial killer, out to destroy your application. And you have to prevent it.
    I can accept failure, everyone fails at something - But I can't accept not trying.

  6. #6
    Utente di HTML.it L'avatar di bubi1
    Registrato dal
    Dec 2009
    Messaggi
    1,230
    Che versione di php e' quella? Nel 5.2.11 che io io, la funzione e' cosi:

    Codice PHP:
    static void php_mysql_do_query(INTERNAL_FUNCTION_PARAMETERSint use_store)
    {
            
    zval **query, **mysql_link;
            
    int id;

            switch(
    ZEND_NUM_ARGS()) {
                    case 
    1:
                            if (
    zend_get_parameters_ex(1, &query)==FAILURE) {
                                    
    RETURN_FALSE;
                            }
                            
    id php_mysql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU);
                            
    CHECK_LINK(id);
                            break;
                    case 
    2:
                            if (
    zend_get_parameters_ex(2, &query, &mysql_link)==FAILURE) {
                                    
    RETURN_FALSE;
                            }
                            
    id = -1;
                            break;
                    default:
                            
    WRONG_PARAM_COUNT;
                            break;
            }
            
    php_mysql_do_query_general(querymysql_linkidNULLuse_storereturn_value TSRMLS_CC);

    e credo sia piu' facile intuire cosa bisogna fare Cmq, quello che hai fatto sopra sul tuo sorgente dovrebbe funzionare lo stesso

    Ma ti sugerirei di dare un occhiata al runkit come ti ho suggerito sopra, potrebbe essere una soluzione piu' adatta al tuo caso.

  7. #7
    Utente di HTML.it L'avatar di strae
    Registrato dal
    Apr 2008
    Messaggi
    407
    ah ok io ho guardato nei file della 5.3.1, non credevo fosse così diverso dalla 5.2 (e attualmente ancora uso la 5.2).

    Adesso mi guardo il runkit come hai suggerito, se è possibile evitare di mettere le mani dove non sò esattamente quello che faccio è meglio, poi modificare direttamente i sorgenti porta molti svantaggi in termini di portabilità (come anche tu hai suggerito).

    Intanto grazie per le risposte, mi guardo il runkit e se ho problemi torno
    You HAVE to assume your visitor is a maniac serial killer, out to destroy your application. And you have to prevent it.
    I can accept failure, everyone fails at something - But I can't accept not trying.

  8. #8
    Utente di HTML.it L'avatar di strae
    Registrato dal
    Apr 2008
    Messaggi
    407
    Ho dato un'occhiata a runkit, ma se ho capito bene permette di ridefinire le funzioni definite dall'utente nei vari script PHP, e non di ridefinire le funzioni native (o dei moduli).. anche perchè non saprei con cosa rimpiazzarla

    Cioè, dici che
    Codice PHP:
    runkit_function_redefine('mysql_query'"
        char *query;
        int query_len;
        zval *mysql_link = NULL;
        int id = -1;
        
        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, \"s|r\", &query, &query_len, &mysql_link) == FAILURE) {
            return;
        }
        if (!mysql_link) {
            return;
        } 

        php_mysql_do_query_general(query, query_len, mysql_link, id, NULL, use_store, return_value TSRMLS_CC);
    "
    ); 
    dovrebbe funzionare? non ne sono troppo convinto.. al momento non riesco a installarlo quindi non posso provarlo di persona
    You HAVE to assume your visitor is a maniac serial killer, out to destroy your application. And you have to prevent it.
    I can accept failure, everyone fails at something - But I can't accept not trying.

  9. #9
    Utente di HTML.it L'avatar di bubi1
    Registrato dal
    Dec 2009
    Messaggi
    1,230
    No, no Puoi ridefinire anche funzioni interne del php, basta impostare un certo flag nella configurazione ini, qualcosa tipo runkit.internaloverride (non ne sono sicuro, guarda nel manuale).
    E cmq non gli passi del codice c++, gli passi sempre del codice php.

    Guarda, puoi fare cosi:
    runkit_function_rename('mysql_query', 'mysql_query_strae');
    E tu usi nel tuo framework la funsione mysql_query_strae()

    Cosi lo sviluppatore di plugin non sapra' che pesci pigliare

    Oppure:
    runkit_function_copy('mysql_query', 'mysql_query_strae');
    runkit_function_redefine('mysql_query', '$query,$link','
    //faccio i miei controlli per trovare link attivi, o guardo semplicemente il numero degli argomenti
    //mostro eventuali errori
    mysql_query_strae($query,$link);
    ');

    Cosi la ridefinisci, facendo dei controlli prima.
    Tutto questo e' da fare ovviamente in una porzione di codice che viene eseguita prima che parta il plugin/modulo.

    Se hai dei problemi con runkit, anche apd dovrebbe avere delle funzioni che permettono di ridefinire delle funzioni.

  10. #10
    Utente di HTML.it L'avatar di strae
    Registrato dal
    Apr 2008
    Messaggi
    407
    Originariamente inviato da bubi1
    No, no Puoi ridefinire anche funzioni interne del php, basta impostare un certo flag nella configurazione ini, qualcosa tipo runkit.internaloverride (non ne sono sicuro, guarda nel manuale).
    E cmq non gli passi del codice c++, gli passi sempre del codice php.

    Guarda, puoi fare cosi:
    runkit_function_rename('mysql_query', 'mysql_query_strae');
    E tu usi nel tuo framework la funsione mysql_query_strae()

    Cosi lo sviluppatore di plugin non sapra' che pesci pigliare

    Oppure:
    runkit_function_copy('mysql_query', 'mysql_query_strae');
    runkit_function_redefine('mysql_query', '$query,$link','
    //faccio i miei controlli per trovare link attivi, o guardo semplicemente il numero degli argomenti
    //mostro eventuali errori
    mysql_query_strae($query,$link);
    ');

    Cosi la ridefinisci, facendo dei controlli prima.
    Tutto questo e' da fare ovviamente in una porzione di codice che viene eseguita prima che parta il plugin/modulo.

    Se hai dei problemi con runkit, anche apd dovrebbe avere delle funzioni che permettono di ridefinire delle funzioni.
    guarda sono davvero indeciso; rinominare tutte le funzioni potenzialmente pericolose (e per sostiuire le quali fornirò delle classi apposite) ha dei vantaggi, ma credo che il livello di isolamento (nel caso del db) maggiore lo si ha tramite la seconda chiamata al db, collegandosi a un db vuoto con utente senza permessi.

    Bhoo, dovrò fare un sacco di test prima di decidere
    You HAVE to assume your visitor is a maniac serial killer, out to destroy your application. And you have to prevent it.
    I can accept failure, everyone fails at something - But I can't accept not trying.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.