Expondo o nome da tabela e os nomes dos campos no URL da solicitação
Fui encarregado de criar esse componente do Joomla (sim, joomla; mas não relacionado) e um professor me disse que eu deveria tornar meu código o mais dinâmico possível (um código que requer menos manutenção) e evitar a codificação. A abordagem que pensamos inicialmente é pegar parâmetros de URL, transformá-los em objetos e passá-los para consulta.
Digamos que queremos ler hotel com o ID nº 1 na tabela "hotéis". digamos que a tabela tenha os campos "hotel_id", "hotel_name" e alguns outros campos.
gora, a abordagem adotada para criar a string de consulta sql é analisar a solicitação de URL que se parecia com iss
index.php?task=view&table=hotels&hotel_id=1¶m1=something¶m2=somethingelse
e transformou-o em um objeto PHP como este (mostrado em equivalente JSON, mais fácil de entender):
obj = {
'table':'hotel',
'conditions':{
'hotel_id':'1',
'param1':'something',
'param2':'somethingelse'
}
e a consulta SQL será algo assim, onde as condições são repetidas e anexadas à string em que o campo e o valor da cláusula WHERE são a chave e o valor do objeto (ainda no formato JSON para facilitar):
SELECT * FROM obj.table WHERE hotel_id=1 AND param1=something and so on...
O problema que me incomodou foi a exposição do nome da tabela e do campo no URL da solicitação. Eu sei que isso representa um risco de segurança, expondo itens que só devem ser vistos no lado do servidor. A solução atual que estou pensando é fornecer aliases para cada tabela e campo para o lado do cliente - mas isso seria uma codificação embutida, o que é contrário à sua política. além do mais, se eu fizesse isso e tivesse mil tabelas para o alias, não seria prátic
Qual é o método adequado para fazer isso sem:
hard coding stuff mantenha o código como dinâmico e adaptávelEDITAR
Em relação às consultas arbitrárias (esqueci de incluir isso), o que atualmente as interrompe no back-end é uma função, que obtém uma referência de um objeto codificado (mais como um arquivo de configuração mostrado aqui) e analisa o URL por escolhendo parâmetros ou combinando-os.
A configuração é semelhante a:
// 'hotels' here is the table name. instead of parsing the url for a table name
// php will just find the table from this config. if no match, return error.
// reduces risk of arbitrary tables.
'hotels' => array(
// fields and their types, used to identify what filter to use
'structure' => array(
'hotel_id'=>'int',
'name'=>'string',
'description'=>'string',
'featured'=>'boolean',
'published'=>'boolean'
),
//these are the list of 'tasks' and accepted parameters, based on the ones above
//these are the actual parameter names which i said were the same as field names
//the ones in 'values' are usually values for inserting and updating
//the ones in 'conditions' are the ones used in the WHERE part of the query
'operations' =>array(
'add' => array(
'values' => array('name','description','featured'),
'conditions' => array()
),
'view' => array(
'values' => array(),
'conditions' => array('hotel_id')
),
'edit' => array(
'values' => array('name','description','featured'),
'conditions' => array('hotel_id')
),
'remove' => array(
'values' => array(),
'conditions' => array('hotel_id')
)
)
)
e assim, a partir dessa lista de configurações:
se um parâmetro enviado para uma tarefa não estiver completo, o servidor retornará um err se um parâmetro do URL for duplicado, apenas o primeiro parâmetro lido será obtid qualquer outro parâmetro que não esteja na configuração é descartadose essa tarefa não for permitida, ela não será listada para essa tabelase não houver uma tarefa, o servidor retornará um errose não houver uma tabela, o servidor retornará um erroNa verdade, modelei isso depois de ver um componente no joomla que usa essa estratégia. Reduz o modelo e o controlador para 4 funções dinâmicas que seriam CRUD, deixando apenas o arquivo de configuração como o único arquivo editável posteriormente (foi o que eu quis dizer sobre código dinâmico, só adiciono tabelas e tarefas se forem necessárias tabelas adicionais) mas receio que possa impor um risco de segurança que talvez ainda não conheça.
lguma idéia para uma alternativ