2017-04-20 14 views
0

私はutf-8の問題に関するsimilairの問題に関する多くの記事を読んできましたが、いくつか試しましたが、原因を見つけることができません。暗号化されたen base64エンコードされた文字列データベース内で同じではありません

私はlivecodeを使用しており、一部の文字列をデータベースに暗号化したいと考えています。だから、私はLivecodeで暗号化し、次にbase64encodeをPHP/PDO経由でデータベースに送ります。 encrypt - > base64encode - > base64decode - > livecode内のdecryptが正常に機能します。

私はbase64のコード化されたデータをMariaDBデータベースに送りますが、+はスペースになっています。 データベース、テーブル、カラムはすべてutf8mb4_unicode_ciです。 データベースのphpmyadminでスペースを手動で+に変更し、Livecodeで読み込んだ場合、base64decodes - > decrypts correct!

これは私がDBに接続して更新するために使用するPHPファイルです:

<?php 
// the connect.php file 
$servername = "localhost"; 
$username = "blabla"; 
$password = "blabla"; 

try { 
    //$db = new PDO("mysql:host=$servername;dbname=blabla",$username, $password); 
    $db = new PDO("mysql:host=$servername;dbname=blabla;charset=utf8", $username, $password); 
    //$db = new PDO("mysql:host=$servername;dbname=blabla;charset=utf8mb4", $username, $password,array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8mb4' COLLATE 'utf8mb4_unicode_ci'")); 
    // set the PDO error mode to exception 
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    //echo "Connected successfully"; 
} 
catch(PDOException $e) 
{ 
    echo "Connection failed: " . $e->getMessage(); 
} 
?> 

あなたは私もPDOを試してみました

<?php 
//this is the file to update the DB 
require_once 'connect.php'; 
// 
try { 
    $stmt = $db->prepare("UPDATE tabel_users SET user=:user, 
    password=:password, email=:email, userlevel=:userlevel WHERE 
    id_user=:id_user"); 
    $stmt->bindParam(':id_user', $_POST['id_user'], PDO::PARAM_INT); 
    $stmt->bindParam(':user', $_POST['user'], PDO::PARAM_STR); 
    $stmt->bindParam(':password', $_POST['password'], PDO::PARAM_STR); 
    $stmt->bindParam(':email', $_POST['email'], PDO::PARAM_STR); 
    $stmt->bindParam(':userlevel', $_POST['userlevel'], PDO::PARAM_STR); 
    //$stmt->bindParam(':user', $_POST['user'], PDO::PARAM_LOB); 
    //$stmt->bindParam(':password', $_POST['password'], PDO::PARAM_LOB); 
    //$stmt->bindParam(':email', $_POST['email'], PDO::PARAM_LOB); 
    //$stmt->bindParam(':userlevel', $_POST['userlevel'], PDO::PARAM_LOB); 
    $affected_rows = $stmt->rowCount(); 

    if($stmt->execute()) { echo "Ge-update informatie verzonden naar de 
    database!"; } else { echo "Failure!"; }; 

} 
catch(PDOException $e) 
{ 
    echo "Not updated: " . $e->getMessage(); 
} 

//var_dump($_POST) 
$db = NULL; 

?> 

も接続ファイル内のいくつかの文字セットを試してみました見ることができます:: PARAM_LOB VARCHAR VARBIN BLOBを試しましたが、これは何も変わりませんでした。

私の最初の推測は、LivecodeがPHPファイルに投稿している間に変なことをするということでした。しかし、送信する直前に変数をチェックすると、送信する文字列に+が付きます。だから私はそれが間違っているところで実際にそれを得ることはありません。

+0

注意してください。データベースに暗号化されたパスワードを保存することは、常に悪い考えです!あなたが保存する必要があるのは、パスワードの片方の塩漬けのハッシュです。 LC9に入っている新しいmessageDigestもあります。これは、md5とsha1の両方が今日のコンピュータを扱うには弱すぎるため、より安全なハッシュを可能にします。 – hliljegren

+0

データベースの暗号化されたパスワードが悪い考えであるのはなぜですか?はい、私は新しいメッセージDigestが来ていることを知っています、それはdp6からdp7にシフトされました。だからもう少し待たなければならない。 – jjsjjs

+0

Okでは、パスワードを暗号化する代わりに、ハッシュについてもっと読んだことがあります。これは一方的な解決方法です。デハッシュはできません。ありがとう! – jjsjjs

答えて

3

あなたの問題はデータベースではありません。phpがbase64文字列をデコードしているので、 '+'を ''(プラススペース)に変換します。パスワードパラメータを投稿する前に、パスワードパラメータをurlencodeする必要があります。 URLEncodeのLiveCodeドキュメントは次のとおりです。

詳細はhereで説明されているように、投稿のコンテンツタイプによって異なります。

+0

ところで、私は言及することを忘れて、Livecode(間のPHPファイルなし)から直接テーブルを更新し、それが正しく動作します。しかし、私もそれを使用する他のいくつかが必要です – jjsjjs

+0

はい!これはちょうどうまくいくようです! - >暗号化 - > Base64Encode - > URLEncode(Livecode内) - > PHP/PDO経由でDBに投稿する。次に、PHP/PDO経由でDBから取得 - >(URLDecode未使用) - > Base64Decode - > Decrypt。私はLCでURLDecodeを使用すると、OKですが、URLdecodeがなければOKです。皆さん、ありがとうございました! – jjsjjs

+0

その理由は、基本的にWebフォームをPHPに提出している可能性が高いからです。 Webフォームはエスケープスペースとして+を使用します。したがって、 "+"を送信したい場合は、それを%2BにURLエンコードする必要があります。これは誤ってスペースに変換されません。 – uliwitness

0

私は同じ問題を抱えていましたが、PHPからlivecodeに移行しました。問題はPHP暗号化とライブコード暗号化の問題であると判断しました。暗号化せずにベースのエンコーディングをしようとすると、素敵に再生されます。私はそれに答えることはできませんが、暗号化されたバイナリの "ヘッダー"と関係があると専門家が覚えています。理想的には私はこの問題に対する答えを見たいと思います。

+1

上記の私の解決策を見てください、私はbase64Encodeの後にURLEncodeを追加しましたが、私はbase64decodeの前にURLDecodeを使用しませんでした。このようにして、暗号化され、base64エンコードされ、URLエンコードされます。それは正しく動作します。いくつかのテストは今、すべてOKですか? – jjsjjs

-1

私が常に符号化後のコードを使用する他のシステム(ジャバスクリプト)を用いてデータを共有するためにbase64エンコーディングを使用する:

はtEncodedDataの空きスペースとを交換します。

LCは、base64encodeのスペースを追加します。私はそれらを削除すると正常に動作します。

関連する問題