PHP, jQuery e .post():mysql_real_escape_string bagunça tudo
-
18-09-2019 - |
Pergunta
Já faz um tempo que estou arrancando o cabelo com esse.
index.php:
$(document).ready(function(){
$(".index_login_subm").click(function(){
uid = $("input:username").val();
pwd = $("input:password").val();
$.post("backend/login.php",{
uid:uid,
pwd:pwd
},function(data){
alert("Returned data: " + data);
});
return false;
});
});
login.php:
include("../../settings.php");
echo $uid;
echo $_POST['uid'];
nenhum dos ecos retorna nada.
configurações.php:
foreach ($_POST as $key => $value) {
$$key = mysql_real_escape_string($value);
}
foreach ($_GET as $key => $value) {
$$key = mysql_real_escape_string($value);
}
O código funciona bem se eu comentar o settings.php-include (bem, é claro que o echo $uid não funcionará), então deve ser algo que o mysql_real_escape_string faz.Alguém tem alguma ideia do que estou fazendo de errado?
index.php também inclui settings.php se isso fizer alguma diferença.
EDITAR:As postagens abaixo me deram vontade de esclarecer;os caminhos estão todos corretos.settings.php (e alguns outros scripts) são colocados fora da pasta raiz para torná-los inacessíveis a um usuário da web.Eles estão funcionando bem quando acessados pelos scripts.
Solução
Conforme descrito no manual do PHP, mysql_real_escape_string requer uma conexão de banco de dados real estabelecida com mysql_connect (no segundo parâmetro).Se não existir, ele tenta criar um simplesmente chamando mysql_connect().Se isso também não funcionar, retorna falso.
Portanto, você teria que criar primeiro uma conexão com o banco de dados.Mas antes de começar a fazer isso:observe que é um realmente, péssima ideia simplesmente pegar todas as variáveis POST e GET e colocá-las no namespace global.
Outras dicas
Primeiro, eu evitaria as variáveis variáveis, elas realmente não são necessárias neste contexto e são um alvo móvel se você não tiver certeza de quais chaves estão realmente alcançando esse script, e são uma prática ruim devido aos problemas de segurança que eles criam.Em vez disso, eu colocaria os valores de escape em settings.php em um array.Então você pode simplesmente var_dump() o array depois de incluir settings.php e ver o que estava disponível.
function extract_requests(){
$res = array();
foreach ($_REQUEST as $key => $value) {
if($key){
$res[$key] = $value;
}
}
return $res;
}
Segundo, chame manualmente login.php com a string de URL correta, exatamente o que você gostaria que o javascript chamasse, para ter certeza de que quaisquer problemas comportamentais não vêm do próprio script login.php.
http://localhost/somewhere/login.php?uid=50
include("../../settings.php");
$input = extract_requests();
var_dump($input);
echo $input['uid'];
echo $_POST['uid'];
Por fim, gostaria de verificar os dados que você está enviando no post().Não sou um guru de javascript, mas
uid:uid,
pwd:pwd
parece que isso causaria problemas para mim, então seria bom ter certeza de que seus dados estão sendo enviados da maneira esperada.
$(document).ready(function(){
$(".index_login_subm").click(function(){
uid = $("input:username").val();
pwd = $("input:password").val();
var inputData = {uid:uid, pwd:pwd};
alert(uid+" "+pwd);
// If you have a console.log() available, just use it on inputData here instead.
$.post("backend/login.php",inputData
,function(data){
alert("Returned data: " + data);
});
return false;
});
});
Editar:Com base na coisa mysql_real_escape_string-only-when-a-connection-has-been-initiated, removi o escape do código acima, porque, na verdade, será melhor escapar do material antes de colocá-lo no SQL.
Além disso, lembre-se de que usar javascript para login VAI volte para mordê-lo, com funcionalidades tão básicas e necessárias quanto o login, você não quer que um erro de javascript interrompa a capacidade de um visualizador fazer login.Aqui isso acontecerá.
Existe um link mysql válido?
string mysql_real_escape_string ( string $unescaped_string
[, resource $link_identifier ] )
Se o
link identifier
não for especificado, o último link aberto pormysql_connect()
é assumido.Se nenhum link for encontrado, ele tentará criar um como semysql_connect()
foi chamado sem argumentos.Se nenhuma conexão for encontrada ou estabelecida, umE_WARNING
erro de nível é gerado.
Pode ser que sua configuração de relatório de erros seja ignorada E_WARNING
erros de nível.
index.php obviamente está localizado no diretório raiz do site, mas o script que você está chamando está no catálogo "backend".
Tente usar include_once
em vez de include
e use caminhos absolutos, não relativos.
Exemplo:
<?php
include_once($_SERVER['DOCUMENT_ROOT']."/settings.php"); //absolute path to file
echo $uid;
echo $_POST['uid'];
?>
Usar caminhos absolutos facilitará sua vida se você mover arquivos.