アム以下の私のデータの暗号化と復号化にクラスを使用して復号化するどのようにMicrosoft SQLデータベース内の暗号化データを格納し、それを取得し、それが
<?php
class ConnectionInfo
{
public $mServerName;
public $mConnectionInfo;
public $conn;
public function GetConnection()
{
# code...
$this->mServerName = "DESKTOP-ES2IEHB\SQLEXPRESS";
$this->mConnectionInfo = array("Database"=>"thefaithdb");
$this->conn = sqlsrv_connect($this->mServerName,$this->mConnectionInfo);
return $this->conn;
}
public function my_simple_crypt($string, $action = 'e',$algo) {
// you may change these values to your own
$secret_key = 'my_simple_secret_key';
$secret_iv = 'my_simple_secret_iv';
$output = false;
$encrypt_method = "AES-256-CBC";
$key = hash($algo, $secret_key);
$iv = substr(hash($algo, $secret_iv), 0, 16);
if($action == 'e') {
$output = base64_encode(openssl_encrypt($string, $encrypt_method, $key, 0, $iv));
}
else if($action == 'd'){
$output = openssl_decrypt(base64_decode($string), $encrypt_method, $key, 0, $iv);
}
return $output;
}
}
?>
私はデータを復号化し、保存せずに暗号化するためにクラスを使用します文字列は、これは出力 It is in the link
あるすべての長さ<?php
require_once(dirname(__FILE__).'/Secure.php');
$mainpass = "ALSONG DUSTAN PHILANDER";
//MD5 encryption
$options = [
'cost' => 12,
];
$mSecure = new SecurityClass();
$encrypted = $mSecure->my_simple_crypt($mainpass, 'e','sha512');
$decrypted = $mSecure->my_simple_crypt($encrypted, 'd','sha512');
echo "encrypted $encrypted<br/>";
echo "decrypted $decrypted<br/>";
?>
であるときに、データベースに、それがうまく機能
今、私は、ストアドプロシージャ
CREATE PROCEDURE [dbo].[spGetAge]
@Item_Name nvarchar(max)
AS
SELECT Name AS IDName,Age FROM [User] WHERE Name = @Item_Name
RETURN 0
を使用して戻って、データベースからそれを取得したいときに成功しているこのコードのMSSQLデータベース
<?php
require_once(dirname(__FILE__).'/ConnectionInfo.php');
//Get up our connection
$mConnectionInfo = new ConnectionInfo();
$mConnectionInfo->GetConnection();
if ($mConnectionInfo->conn) {
# code...
echo "Connected<br/>";
}
$encrypted = $mConnectionInfo->my_simple_crypt('ALSONG DUSTAN PHILANDER' , 'e','sha384');
$myparams['Item_Name'] = $encrypted;
$encrypted2 = $mConnectionInfo->my_simple_crypt('56' , 'e','sha384');
$myparams['Item_Age'] = $encrypted2;
$parameters = array(array(&$myparams['Item_Name'],SQLSRV_PARAM_IN),
array(&$myparams['Item_Age'],SQLSRV_PARAM_IN));
$sql = "EXEC spGetUser @Item_Name = ? , @Item_Age = ? ";
$stmt = sqlsrv_prepare($mConnectionInfo->conn,$sql,$parameters);
$work = sqlsrv_execute($stmt);
if ($work) {
# code...
echo "Successful $encrypted<br/>";
}
else {
# code...
echo "Connection Failed.<br/>";
die(print_r(sqlsrv_errors(),true));
}
?>
が、その後、その後、これはPHPであることを保存するときそれ
<?php
require_once(dirname(__FILE__).'/ConnectionInfo.php');
//Get up our connection
$mConnectionInfo = new ConnectionInfo();
$mConnectionInfo->GetConnection();
if ($mConnectionInfo->conn) {
# code...
echo "Connected<br/>";
}
$encrypted1 = $mConnectionInfo->my_simple_crypt('ALSONG DUSTAN PHILANDER' , 'e','sha384');
$myparams2['Item_Name'] = $encrypted1;
$params = array(array(&$myparams2['Item_Name'],SQLSRV_PARAM_IN));
$sql2 = "EXEC spGetAge @Item_Name = ?";
$stmt2 = sqlsrv_prepare($mConnectionInfo->conn,$sql2,$params);
$work = sqlsrv_execute($stmt2);
if(!$stmt2)
{
echo "Query failed <br/>";
die(print_r(sqlsrv_errors(), true));
}
else{
$row = sqlsrv_fetch_array($stmt2,SQLSRV_FETCH_ASSOC);
$name = $row['IDName'];
if ($name==null) {
# code...
echo "Empty";
}
$decrypted = $mConnectionInfo->my_simple_crypt($row['IDName'], 'd','sha384');
$decrypted2 = $mConnectionInfo->my_simple_crypt($row['Age'], 'd','sha384');
echo "The age is $decrypted2 of $decrypted <br/>";
echo $row['IDName'] ;
echo "<br/> The name is $encrypted1";
}
?>
あるを取得するためのコード
この問題は、暗号化の入力文字列が14文字を超える場合にのみ発生します。私はそれをデータベースに保存してから解読しても、それを可能にして、それを完全に動作させることができます。助けをありがとう
データを格納するデータベースフィールドのタイプと長さを確認します。なぜこれにストアドプロシージャを使用していますか? –
@KIKOSoftware、私はnvarchar(max)を使用しました。私はそれが働くと思う。ストアドプロシージャを使用してSQLインジェクションを減らす –
ストアドプロシージャはどのようにしてSQLインジェクションを減らすことができますか?私はそれに精通していない。私が知っていることは、バインディングパラメータがその仕事をするということです。 –