Vá para a segunda linha na visualização de código, logo após o arquivo de inclusão para a conexão, e adicione a função GetSQLValueString() ao início do código da seguinte forma:
<?php if (!function_exists("GetSQLValueString")) { function GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "") { $theValue = get_magic_quotes_gpc() ? stripslashes($theValue) : $theValue; $theValue = function_exists("mysql_real_escape_string") ? mysql_real_escape_string($theValue) : mysql_escape_string($theValue); switch ($theType) { case "text": $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL"; break; case "long": case "int": $theValue = ($theValue != "") ? intval($theValue) : "NULL"; break; case "double": $theValue = ($theValue != "") ? "'" . doubleval($theValue) . "'" : "NULL"; break; case "date": $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL"; break; case "defined": $theValue = ($theValue != "") ? $theDefinedValue : $theNotDefinedValue; break; } return $theValue; } } ?>
Problema
Alguns bancos de dados permitem enviar múltiplas instruções SQL em uma única consulta. Portanto, há riscos potenciais de segurança quando você passa parâmetros em uma string de consulta para uma consulta de banco de dados gerada dinamicamente. Hackers podem tentar modificar variáveis de URL ou formulário em uma consulta dinâmica anexando instruções SQL maliciosas a parâmetros existentes. Isso é geralmente conhecido como ataque de injeção SQL. Parte do código do comportamento do servidor criado pelo Dreamweaver deve ser modificado para reduzir o risco de ataques de injeção SQL. Para obter mais informações relevantes sobre a injeção SQL, consulte este artigo da Wikipédia. (Ref. 201713)
Observação: O problema descrito nesta Nota Técnica foi corrigido no Dreamweaver 8.0.2 Updater.
Esta Nota Técnica abrange os comportamentos do servidor PHP do Dreamweaver. Há notas técnicas separadas para os comportamentos do servidor ColdFusion, ASP VBScript, ASP JavaScript e JSP.Os comportamentos do servidor ASP.NET não são afetados.
Solução
Quando você deixar que uma sequência de caracteres de consulta passe um parâmetro, certifique-se de que somente as informações esperadas sejam passadas. A Adobe criou um Dreamweaver 8.0.2 Updater que reduz o risco de ataques de injeção SQL. Essas correções serão incorporadas em todas as versões futuras do Dreamweaver. Depois de atualizar o Dreamweaver 8, será necessário reaplicar os comportamentos do servidor às páginas que os usam e reimplantar essas páginas no servidor.
O restante desta Nota Técnica documenta como editar manualmente o código do Dreamweaver MX 2004 para prevenir ataques de injeção SQL com o modelo de servidor PHP. Os comportamentos do servidor que estão vulneráveis a estes ataques são listados abaixo, junto com as correções:
Conjunto de registros com um filtro
Os conjuntos de registros não filtrados não precisam ser modificados, mas os conjuntos de registros filtrados sim precisam. No exemplo abaixo, um conjunto de registros do Dreamweaver MX 2004 chamado "rs_byDate" é filtrado por um valor de data passado por meio de um parâmetro de URL.O código destacado abaixo é o que precisa ser alterado:
<?php $colname_rs_byDate = "1"; if (isset($_GET['relDate'])) { $colname_rs_byDate = (get_magic_quotes_gpc()) ? $_GET['relDate'] : addslashes($_GET['relDate']); } mysql_select_db($database_dreamqa2, $dreamqa2); $query_rs_byDate = sprintf("SELECT * FROM albums WHERE relDate = '%s'", $colname_rs_byDate); $rs_byDate = mysql_query($query_rs_byDate, $dreamqa2) or die(mysql_error()); $row_rs_byDate = mysql_fetch_assoc($rs_byDate); $totalRows_rs_byDate = mysql_num_rows($rs_byDate); ?>
Para proteger o conjunto de registros contra ataques de injeção SQL, uma função personalizada GetSQLValueString() deve ser criada próximo ao topo da página. Esta função verifica o tipo de dados do parâmetro de consulta. Depois que a função for criada, atualize o código do conjunto de registros para usar a função GetSQLValueString().
Código modificado:
$colname_rs_byDate = $_GET['relDate'];
Atualize o código recordset para criar uma string SQL usando a função GetSQLValueString() criada acima. Atualize o Valor da variável $query_rs_byDate:
Código original:
$query_rs_byDate = sprintf("SELECT * FROM albums WHERE relDate = '%s'", $colname_rs_byDate);
Código seguro modificado:
$query_rs_byDate = sprintf("SELECT * FROM albums WHERE relDate = %s", GetSQLValueString($colname_rs_byDate, "date"));
Comportamentos de servidor Insert, Update e Delete Record e assistente Record Insertion Form
Os comportamentos de servidor Insert, Update e Delete Record e o assistente Record Insertion Form já usam a função GetSQLValueString(), então precisam ser refinados para prevenir injeções SQL. As únicas alterações necessárias estão na função GetSQLValueString().
Aqui está o código original. A linha a ser alterada está destacada em amarelo:
if (!function_exists("GetSQLValueString")) { function GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "") {$theValue = (!get_magic_quotes_gpc()) ? addslashes($theValue) : $theValue; switch ($theType) { case "text": $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL"; break; case "long": case "int": $theValue = ($theValue != "") ? intval($theValue) : "NULL"; break; case "double": $theValue = ($theValue != "") ? "'" . doubleval($theValue) . "'" : "NULL"; break; case "date": $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL"; break; case "defined": $theValue = ($theValue != "") ? $theDefinedValue : $theNotDefinedValue; break; } return $theValue; } }
Atualize a definição da variável $theValue:
Código original:
$theValue = (!get_magic_quotes_gpc()) ? addslashes($theValue) : $theValue;
Código seguro modificado:
$theValue = get_magic_quotes_gpc() ? stripslashes($theValue) : $theValue; $theValue = function_exists("mysql_real_escape_string") ? mysql_real_escape_string($theValue) : mysql_escape_string($theValue);
Logon do usuário para o comportamento do servidor
Aqui estão as etapas para corrigir o comportamento de servidor Fazer logon de usuário:
Modifique o código que constrói a consulta SQL de logon.
Código original:
$LoginRS__query=sprintf("SELECT username, password FROM login WHERE username='%s' AND password='%s'", get_magic_quotes_gpc() ? $loginUsername : addslashes($loginUsername), get_magic_quotes_gpc() ? $password : addslashes($password));
Código seguro modificado:
$LoginRS__query=sprintf("SELECT username, password FROM login WHERE username=%s AND password=%s", GetSQLValueString($loginUsername, "text"), GetSQLValueString($password, "text"));
Verificar o novo usuário para o comportamento do servidor
Verificar o novo usuário para o comportamento do servidor requer que Inserir registro do comportamento do servidor seja primeiro adicionado à página. A função GetSQLValuesString() está incluída no comportamento do servidor Inserir Registro.Tudo o que precisa ser feito é atualizar a GetSQLValuesString() para tratar melhor a injeção SQL e atualizar o comportamento do servidor Verificar novo usuário para usar essa função quando um parâmetro for passado.
Modifique o código para construir a consulta SQL de logon para usar a GetSQLValuesString() para passar parâmetros. No início da página, localize o código na seção que começa com // *** Redirect if username exists.
Código original:
$LoginRS__query = "SELECT username FROM login WHERE username='" . $loginUsername . "'"
Código seguro modificado:
$LoginRS__query = sprintf("SELECT username FROM login WHERE username=%s", GetSQLValueString($loginUsername, "text"));
Conjunto de páginas principais e de detalhe
Para o objeto do aplicativo Conjunto de páginas principais e de detalhe, as alterações são principalmente no conjunto de registros que o Dreamweaver cria para a Página detalhada. Se você não tiver um conjunto de registros filtrado na Página principal, nenhuma alteração deve ser feita na Página principal. Se você tiver um conjunto de registros filtrado, consulte conjunto de registros com filtro para atualizar o código do conjunto de registros.
Dreamweaver cria um conjunto de registros filtrado na página Detalhes, então o código do conjunto de registros precisa ser atualizado para usar uma função GetSQLValueString() para passar parâmetros e sprintf() para construir a string SQL.
Atualize o código de declaração da variável e construa a consulta SQL usando a função GetSQLValuesString().
Código original:
$recordID = $_GET['recordID']; $query_DetailRS1 = "SELECT * FROM albums WHERE ID = $recordID";
Código seguro modificado:
$colname_DetailRS1 = "-1"; if (isset($_GET['recordID'])) { $colname_DetailRS1 = (get_magic_quotes_gpc()) ? $_GET['recordID'] : addslashes($_GET['recordID']); } $query_DetailRS1 = sprintf("SELECT * FROM albums WHERE ID = %s", GetSQLValueString($colname_DetailRS1, "int"));
Assistente de formulário de atualização de registro
Informações adicionais
Consulte o seguinte artigo para obter mais informações sobre injeção SQL: artigo da Wikipedia sobre injeção SQL.
Boletim de segurança da Adobe: APSB 06-07 Vulnerabilidade de injeção de SQL do comportamento do servidor do Dreamweaver.
Criar belos sites no Dreamweaver
Crie, codifique e gerencie sites dinâmicos com uma ferramenta completa e eficiente.