セッションやuploadify
質問
を使用してい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は、POSTから読まれることはありません。 あなたがこれを行うことができます:
$_COOKIE['PHPSESSID'] = $_POST['PHPSESSID'];
session_start();
他のヒント
あなたはこれを解決することはできません。つまり、フラッシュプレーヤーは、新しいユーザーとしてuploadifyスクリプトにアクセスして、新しいセッションを取得します。これを解決することができる唯一の方法はuploadifyスクリプトにポストを通じて、現在のページのsession_idを渡すことです。
私はあなたがすでにログインなどのためのセッション指向PHPのバックエンドを持っている場合は特に、実装がはるかに容易である解決策を見つけた:ます。
ちょうどjQueryの声明の中で次のコードを記述します:
'script' : '/upload.php?<?= session_name(); ?>=<?= session_id(); ?>',
魔法のようにあなたの現在のセッション名とセッションIDを添付しますた。
これは動作しますが、セキュリティの観点からは本当に悪い習慣であることがあります。これは、有効なセッションIDを持つ人だけのセッションIDを変更することにより、そのセッションを偽装できるようになります。それは、(バックエンドのコードにのみ知られている)秘密鍵でセッションIDのも、基本的な同期の暗号化を行い、その後、upload.phpスクリプトでそれを解読する方が良いでしょう。
私は、現状では、同様の問題がuploadify+PHPのセッションへ。
利用ではerror_log()を監視できることがuploadify flashアプリを送信するファイルデータをサーバーを通過したときは、正しいsession_idのアップロードのスクリプト:
'scriptData':{'session_id':session_id},
(session_idした場合は、直前に設定した:var session_id=";)
なので、できることを確認あり、セッションidを自分のページのセッションidのuploadifyスクリプトは同じです。
ただし、スクリプトを、さまざまなコースを提供していまセッション:
session_id($session_id);session_start();
なんとかすべてのセッションデータが破壊され(また設定セッションデータ配列だったのでリフレッシュとにより、電力消費を監視し、成長の申請ごとに、その利用の場合uploadifyで拭).
少しも不思議じゃないかこのデバッグ:/
編集:suhosinが破壊するセッション:
uploadify実装を使用して外部の.jsファイルの前にこれを追加します。
<!-- Get sesssionId -->
<script type="text/javascript" charset="utf-8">
var sessionId = "<?php echo session_id(); ?>";
</script>
次にuploadifyスクリプトにこれを追加します。
$('#uploadify').uploadifySettings('scriptData', {'sessionId': sessionId});
PHPのアップロードスクリプトはこれを必要とします。
// Start session
session_id($_POST['sessionId']);
session_start();
すべてやった!
セキュリティおよび方法の両方に関するすべての華麗な回答を読んだ後、私は問題の周りに自分の道を働いてきた、と私は他人の利益のためにそれをここに投稿します。解決のために下にスキップ、それは正しい重要なことすべてですか? ;)
Uploadifyは、それが自分のデフォルトのセッションの使用しています...
このはuploadify.phpアクセスする際に、以前に保存されていたすべてのセッション変数は、現在の(uploadify)セッションからアクセスすることができないことを意味厄介です。あなたは、本質的にあなたが作ったセッションとは全く無関係であるセッションオブジェクトを見ています。あー、私たちは何をしますかは、Javascriptを通してそれを渡す?
それは、サーバーにオフに送信される前にあなたはjavascript経由のセッションへの参照を渡す「缶」が、JavaScriptはクライアント(ユーザー)側である、そして、このため、ユーザーは、セッション参照を変更することができます。彼はセッションID効果的に偽物でした。これは、少なくとも私のアプリケーションの場合には、実際にterrifyingly危険です。
ソリューション...
私の知る限りでは、IDによって参照することができない、それ自身のデフォルトのsession_start()を使用しないでください。代わりに、あなたは(にsession_startを使用するたび)は、(私は今かかわらず、良い習慣であると感じている)、使用したいセッションのIDを設定します。
あなたがセッションを開始したいEVERY SINGLE TIME
SESSION_ID( "IDHere");
のsession_start();
重要:各ユーザーに一意のセッションを設定する
。セッションは、サーバーと無謀な放棄と接続する他のすべてのクライアント間で共有変数です。あなたのサイトの各ユーザに一意であるセッション変数を保存したい場合は、SESSION_IDは、そのユーザに対する完全にユニークなダイナミックIDのいくつかの並べ替えする必要があります。これは、クッキーからアクセス、またはそれ以上の安全データベース(ユーザーの固有ID?)することができます。
編集:研究のビットの後、それは(IDなし)デフォルトのセッションはセッションID「PHPSESSID」を使用しているようです。だから、あなたはあまりにも問題を解決することがありuploadify.phpにセッションを開始する前に、私は、(「PHPSESSID」)SESSION_IDを設定し、それをまだ試していないもののます。
しかし、それでもまだ、プラグインがちょうどそう問題が跳ね上がる可能性があり、同じセッション内のあなたに同じセッション変数を使用することが起これば、それはとにかくそれ自身の固有のIDを使用して、セッションを作るために、おそらく最善です。
タグ
id = "id_usuario_logueado" and value $_SESSION[id]
と文書内のラベルを非表示にするに置きます
ちょうどjQuery
文で次のコードを記述します:
'scriptData': {'id_usuario':$('#id_usuario_logueado').text()},
以降のPHPの
$id_usuario = $_POST['id_usuario'];
私はあなたのバックエンドのスクリプトが認証を必要とし、あなたは302の問題を取得しますリダイレクトする場合は、解決策を見つけました。
次に、変更上記のコードから
'スクリプト': '/管理/アップロード/ artistsphotos'、
に
'スクリプト':?「/管理/アップロード-保護されていない/ artistsphotos / ID =
次に、あなたのバックエンドのスクリプトで簡単に渡されたIDをチェックして、異なる戦略にアップロード要求を認証します。
ここでuploadifyから直接答えがあります
の AJAXを呼び出して、あなたの.php
でます:
'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";
}
?>