php, jquery 및 .post () : mysql_real_escape_string은 물건을 엉망으로 만들어
-
18-09-2019 - |
문제
나는이 머리카락을 잠시 동안 찢어 버렸다.
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'];
에코는 아무것도 반환하지 않습니다.
settings.php :
foreach ($_POST as $key => $value) {
$$key = mysql_real_escape_string($value);
}
foreach ($_GET as $key => $value) {
$$key = mysql_real_escape_string($value);
}
settings.php-include out (물론 echo $ uid가 작동하지 않을 것입니다)에 주석하면 코드가 잘 작동하므로 MySQL_Real_escape_string이하는 일이어야합니다. 누구든지 내가 뭘 잘못하고 있는지 아는 사람이 있습니까?
index.php는 또한 settings.php가 포함되어 있다면 차이가 있습니다.
편집 : 아래 게시물로 인해 명확히하고 싶었습니다. 경로는 모두 정확합니다. settings.php (및 다른 스크립트)는 모두 루트 폴더 외부에 놓여 웹 사용자가 액세스 할 수 없도록합니다. 그들은 스크립트에 의해 액세스 할 때 잘 작동합니다.
해결책
설명한대로 PHP 매뉴얼에서, mysql_real_escape_string에는 mysql_connect (두 번째 매개 변수)에서 설정된 실제 데이터베이스 연결이 필요합니다. 없으면 단순히 mysql_connect ()를 호출하여 하나를 만들려고합니다. 이것이 작동하지 않으면 거짓을 반환합니다.
따라서 먼저 데이터베이스 연결을 만들어야합니다. 하지만이 작업을 시작하기 전에 : 정말 나쁜 생각 모든 게시물을 가져 와서 변수를 가져 와서 글로벌 네임 스페이스에 뱉어 내십시오.
다른 팁
먼저, 변수 변수를 피하고,이 맥락에서는 실제로 필요하지 않으며 실제로 어떤 키가 해당 스크립트에 도달 할 것인지 확실하지 않으면 보안 문제로 인해 나쁜 관행을 제공합니다. 그들이 만든 것. 대신, 나는 탈출 된 값을 settings.php 내에 배열에 넣을 것이다. 그런 다음 settings.php를 포함한 후 배열을 간단히 var_dump ()하고 사용 가능한 항목을 볼 수 있습니다.
function extract_requests(){
$res = array();
foreach ($_REQUEST as $key => $value) {
if($key){
$res[$key] = $value;
}
}
return $res;
}
둘째, 올바른 URL 문자열로 login.php를 수동으로 호출하십시오. JavaScript가 호출하려는 내용은 정확히로 Login.php 스크립트에서 동작 문제가 발생하지 않도록 할 수 있습니다.
http://localhost/somewhere/login.php?uid=50
include("../../settings.php");
$input = extract_requests();
var_dump($input);
echo $input['uid'];
echo $_POST['uid'];
마지막으로 Post ()에서 보내는 데이터를 확인하겠습니다. 나는 자바 스크립트 전문가는 아니지만
uid:uid,
pwd:pwd
나에게 문제가 발생할 수 있으므로 데이터가 예상되는 방식으로 전송되는지 확인하는 것이 좋습니다.
$(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;
});
});
편집 : mysql_real_escape_string-donly-when-a-connection has-been-initiated를 기반으로 위의 코드에서 탈출을 제거했습니다. SQL로.
또한 로그인에 JavaScript를 사용하여 할 것이다 로그인만큼 기본적이고 필요한 기능을 가진 당신을 물기로 돌아와서, 당신은 viewer가 로그인 할 수있는 능력을 깨뜨리는 JavaScript 오류를 원하지 않습니다. 여기서 그렇게 할 것입니다.
유효한 MySQL 링크가 있습니까?
string mysql_real_escape_string ( string $unescaped_string
[, resource $link_identifier ] )
만약
link identifier
지정되지 않고 마지막 링크가 열립니다mysql_connect()
가정됩니다. 그러한 링크가 발견되지 않으면 마치 마치 마치 마치mysql_connect()
논쟁없이 부름 받았다. 연결이 없거나 확립되지 않은 경우E_WARNING
레벨 오류가 생성됩니다.
오류보고 설정이 무시할 수 있습니다 E_WARNING
레벨 오류.
Index.php는 분명히 웹 사이트의 루트 디렉토리에 있지만 호출중인 스크립트는 "백엔드"카탈로그에 있습니다.
사용해보십시오 include_once
대신에 include
상대가 아닌 절대 경로를 사용합니다.
예시:
<?php
include_once($_SERVER['DOCUMENT_ROOT']."/settings.php"); //absolute path to file
echo $uid;
echo $_POST['uid'];
?>
절대 경로를 사용하면 파일을 이동하면 삶이 더 쉬워집니다.