문제
Uploadify를 사용하고 있으며 PHP 파일에서 세션을 설정할 수 없습니다. 내 스크립트는 다음과 같습니다.
$("#uploadify").uploadify({
'uploader' : '/extra/flash/uploadify.swf',
'script' : '/admin/uploads/artistsphotos',
'scriptData' : {'PHPSESSID' : '<?= session_id(); ?>'},
'cancelImg' : '/images/cancel.png',
'folder' : '/img/artists',
'queueID' : 'fileQueue',
'auto' : false,
'multi' : true,
'onComplete' : function(a, b, c, d, e){
},
'onAllComplete': function(event,data){
$bla = $('#art').find(':selected',this);
$fi = $bla.val();
$.ajax({
type: "POST",
url: "/admin/uploads/artistsphotosupload",
data: "artist="+$fi,
success: function(msg){
console.log(msg);
}
});
}
});
그리고 내가 시도하면 PHP에서 :
$_SESSION['name'] = 'something';
다른 파일로 액세스 할 수 없으며 session_start ()가 있습니다. 솔루션을 활성화 했습니까?
해결책
일반적으로 세션 ID는 게시물에서 읽지 않습니다. 당신은 이것을 할 수 있습니다 :
$_COOKIE['PHPSESSID'] = $_POST['PHPSESSID'];
session_start();
다른 팁
Uploadify에는 Flash Player가 작성한 자체 세션 ID가 있기 때문에이를 해결할 수 없습니다. 다시 말해 Flash Player는 업로드 스크립트에 새 사용자로 액세스하고 새 세션을 얻습니다. 이를 해결할 수있는 유일한 방법은 현재 Page Session_ID를 게시물을 통해 업로드 스크립트로 전달하는 것입니다.
특히 이미 로그인을위한 세션 지향 PHP 백엔드가있는 경우 구현하기가 훨씬 쉬운 솔루션을 찾았습니다.
jQuery 문에 다음 코드를 작성하십시오.
'script' : '/upload.php?<?= session_name(); ?>=<?= session_id(); ?>',
현재 세션 이름과 세션 ID를 마술처럼 첨부합니다.
이것은 효과가 있지만 보안 관점에서 볼 때 실제로 나쁜 관행입니다. 이를 통해 유효한 SessionID를 가진 사람은 SessionID를 변경하여 해당 세션을 가장 할 수 있습니다. 비밀 키 (백엔드 코드에만 알려진)와 함께 SessionID의 기본 동기 암호화조차 수행 한 다음 Upload.php 스크립트에서 해독하는 것이 좋습니다.
현재 업로드 + PHP 세션과 비슷한 문제가 있습니다.
Error_Log () 사용 Uploadify Flash 앱이 파일 데이터를 서버로 보내면 올바른 세션 _id를 업로드 스크립트로 전달하는 것을 모니터링 할 수 있습니다.
'scriptData': { 'session_id': session_id},
(Session_ID 이전 세트 : var session_id = '';)
따라서 예, 내 페이지의 세션 ID와 업로드 스크립트의 세션 ID가 실제로 동일인지 확인할 수 있습니다.
그러나 스크립트가 실행되고 세션을 시작하면 다음과 같이 세션을 시작합니다.
session_id ($ session_id); session_start ();
어떻게 든 모든 세션 데이터가 파괴되었습니다 (또한 세션 데이터를 배열로 설정하여 각 요청에 따라 데이터를 새로 고칠 수 있고 업로드를 사용하면 삭제됩니다).
나는 이것을 디버깅하는 방법에 대한 단서가 없다 :/
편집 : 수호신은 세션을 파괴 할 수 있습니다.
Uploadify 구현을 통해 외부 .js 파일 전에 이것을 추가하십시오.
<!-- Get sesssionId -->
<script type="text/javascript" charset="utf-8">
var sessionId = "<?php echo session_id(); ?>";
</script>
그런 다음 업로드 스크립트에 추가하십시오.
$('#uploadify').uploadifySettings('scriptData', {'sessionId': sessionId});
PHP 업로드 스크립트에는이 문제가 필요합니다.
// Start session
session_id($_POST['sessionId']);
session_start();
다 끝났어!
보안과 방법 모두에 관한 모든 훌륭한 답변을 읽은 후, 나는 문제에 대해 나만의 방식으로 일했으며 다른 사람들의 이익을 위해 여기에 게시하겠습니다. 솔루션을 위해 바닥으로 건너 뛰십시오. 모든 것이 중요합니까? ;).
Uploadify는 자체 기본 세션을 사용합니다 ...
이는 업로드 화.php에 액세스 할 때 이전에 저장 한 세션 변수에 액세스 할 때 현재 (uploadify) 세션에서 액세스 할 수 없다는 성가심입니다. 당신은 본질적으로 당신이 만든 세션과 완전히 관련이없는 세션 객체를보고 있습니다. AAAH, 그래서 우리는 무엇을합니까? JavaScript를 통해 전달합니까?
JavaScript를 통해 세션에 대한 참조를 전달할 수 있지만 JavaScript는 클라이언트 (사용자) 측이기 때문에 사용자는 서버로 전송되기 전에 세션 참조를 변경할 수 있습니다. 그는 자신의 세션 ID를 효과적으로 가짜로 만들 수있었습니다. 이것은 적어도 내 신청서의 경우 실제로 끔찍하게 위험합니다.
해결책...
afaik은 ID에서 참조 할 수없는 Default Session_Start ()를 자체적으로 사용하지 마십시오. 대신, session_start ()를 사용할 때마다 사용하려는 세션에 대한 ID를 설정하십시오 (이제 좋은 관행이라고 생각합니다).
매번 세션을 시작하려고합니다
session_id ( "idhere");
session_start ();
중요 : 각 사용자에게 고유 한 세션을 설정합니다.
세션은 서버와 무모한 포기와 연결되는 다른 모든 클라이언트간에 공유되는 변수입니다. 사이트의 각 개별 사용자마다 고유 한 세션 변수를 저장하려면 Session_ID는 해당 사용자에 비해 완전히 고유 한 동적 ID 여야합니다. 쿠키 또는 더 안전하게 데이터베이스 (사용자의 고유 ID?)에서 액세스 할 수 있습니다.
편집 : 약간의 연구 후에는 기본 세션 (ID없이)이 SessionID "phpsessid"를 사용하는 것으로 보입니다. 따라서 아직 시도하지는 않았지만 Session_ID ( "PhpsSessId")를 설정하지만 UPLOADIFY.PHP에서 세션을 시작하기 전에 문제를 해결할 수 있습니다.
그러나 여전히 플러그인이 같은 세션 내에서 동일한 세션 변수를 사용하는 경우 문제가 발생할 수 있으므로 어쨌든 고유 한 ID로 세션을 만드는 것이 가장 좋습니다.
문서에 레이블 가죽을 넣으십시오 id = "id_usuario_logueado" and value $_SESSION[id]
다음 코드를 작성하십시오 jQuery
성명:
'scriptData': {'id_usuario':$('#id_usuario_logueado').text()},
PHP의 후반에
$id_usuario = $_POST['id_usuario'];
백엔드 스크립트에 인증이 필요하고 리디렉션이 필요한 경우 302 문제가 발생하면 인증이 필요하지 않은 새 컨트롤러 또는 스크립트를 만듭니다.
그런 다음 위의 코드에서 '스크립트'를 변경합니다. ?> ',
그런 다음 백엔드 스크립트에서 전달 된 ID를 확인하고 다른 전략으로 업로드 요청을 인증합니다.
다음은 UPLOADIFY의 직접 답변입니다. 업로드와 함께 세션을 사용합니다
당신의 .php
그것은 ajax라고 부릅니다.
'scriptData': {'<?php echo session_name();?>':'<?php echo session_id();?>'},
그리고 당신의 uploadify.php
(수신/저장 프로그램)
$session_name = session_name();
if (!isset($_GET[$session_name])) {
exit;
} else {
session_id($_GET[$session_name]);
session_start();
}
2.1.4를 사용하고 있으며 세션 변수에 대한 매력처럼 작동합니다.
$(document).ready(function() {
nombre = $('#uploadify1').val(); //first input
autor = $('#uploadify1').val(); // second one
$("#uploadify").uploadify({
'uploader' : UPLOADIFY_URL+'scripts/uploadify.swf',
'script' : 'ticket_docs_uploadify.php',
'cancelImg' : UPLOADIFY_URL+'cancel.png',
'folder' : 'ticket_document_uploads',
'queueID' : 'fileQueue',
'checkScript' : 'ticket_docs_check.php?nombre='+nombre+'&autor='+autor,
'fileDesc' : 'I am testing uploadify',
'buttonText' : 'Upload',
'scriptData' : {'sessTempTickedId': '<?php echo $_SESSION['sessTempTickedId'];?>', 'pkEmployeeID': '<?php echo $_SESSION['pkEmployeeID'];?>', 'EmployeeDepartment': '<?php echo $_SESSION['EmployeeDepartment'];?>' },
'auto' : false,
'multi' : true,
'onComplete' : function(a, b, c, d, e){
//alert(a+b+c+d+e);
},
'onAllComplete': function(event,data){
//something here alert('asdasd'); alert(json_decode(data));
}
});
});
<?php include_once('../../common/inc/connectdb.inc.php');
if (!empty($_FILES))
{
$tempFile = $_FILES['Filedata']['tmp_name'];
$targetPath = $_SERVER['DOCUMENT_ROOT'] . $_REQUEST['folder'] . '/';
//change the file name here
$fileName = time();
$arrFile = pathinfo($_FILES['Filedata']['name']);
$strFileExt = strtolower($arrFile['extension']);
$strFileName = $arrFile['filename'];
$strFileBaseName = $arrFile['basename'];
$fileName = $fileName.'.'.$strFileExt;
$targetFile = str_replace('//','/',$targetPath) . $fileName;
$sql = "INSERT INTO ticket_documents (fkTicketID,fkEmployeeID,fkDepartmentID,TicketDocumentName,TicketDocumentLabel) VALUES ('".$_POST['sessTempTickedId']."','".$_POST['pkEmployeeID']."','".$_POST['EmployeeDepartment']."','".$fileName."','".$_FILES['Filedata']['name']."')";
mysql_query($sql) or die(mysql_error());
move_uploaded_file($tempFile,$targetFile);
echo "1";
}
?>