2017-12-06 4 views
3

PHPとMSSQLを使用してファイル(pdf、images)をデータベースにアップロードしようとしています。 mssql phpを使用してSQLデータベースにファイルコンテンツを挿入中にエラーが発生しました

<form role="form" action="kyc.php" method="post" enctype="multipart/form-data"> 
    <div class="form-body"> 

     <div class="row"> 
      <div class="col-md-offset-1">  
       <div class="form-group"> 
        <label for="aadhaar">Aadhaar Card</label> 
        <input type="file" name="aadhaar" id="aadhaar" accept="application/pdf,image/x-png,image/gif,image/jpeg" required> 
       </div> 
      </div> 
     </div> 

     <input type="hidden" value="<?php echo $client_id; ?>" name="clientCode"> 
    </div> 
    <div class="form-actions"> 
     <button name="submit" type="submit" class="btn blue">Upload</button> 
    </div> 
</form> 

ここでポストフォームの送信が実行されるPHPコードです:

$clientCode = $_POST['clientCode']; 
$fileName=$_FILES["aadhaar"]["name"]; 
$fileType = $_FILES['aadhaar']['type']; 

//Get the content of the image and then add slashes to it 
$fileTemp=addslashes(file_get_contents($_FILES['aadhaar']['tmp_name'])); 

//Insert the image name and image content in image_table 
$query="INSERT INTO KYCSCANS (FIRMNUMBER, CLIENTCODE, FILENAME, FILETYPE, FILECONTENT, TIMESTAMP, CREATIONTIMESTAMP, ADDEDBY, FILERELATED) VALUES('Global','{$clientCode}', '{$fileName}', '{$fileType}', '{$fileTemp}', GETDATE(), GETDATE(), 'madWeb', 'temp')"; 

$insertQuery = sqlsrv_query($jarvisconnection, $query); 

if(!$insertQuery) { 
    die("Aadhaar Query Failed" . print_r(sqlsrv_errors(), true)); 
} 

ここでテーブル構造だ - 私は多くのことを試みたが、私は

SRNO - int 
FIRMNUMBER - nchar(10) 
CLIENTCODE - nvarchar(50) 
FILENAME- nvarchar(50) 
FILETYPE - nvarchar(50) 
FILECONTENT - varbinary(MAX) 
TIMESTAMP - datetime 
CREATIONTIMESTAMP - datetime 
ADDEDBY - nchar(15) 
FILERELATED - nvarchar(50) 

は、次のエラーが表示されます。

Array ([0] => Array ([0] => 42000 [SQLSTATE] => 42000 [1] => 0 [code] => 0 [2] => [Microsoft][ODBC Driver 11 for SQL Server]Syntax error, permission violation, or other nonspecific error [message] => [Microsoft][ODBC Driver 11 for SQL Server]Syntax error, permission violation, or other nonspecific error))

+0

あなたのコードはSQLインジェクション攻撃に対して脆弱です。パラメーター化された照会とプリペアドステートメントを使用して、悪意のある入力値を使用して攻撃者がデータベースを侵害しないようにする必要があります。 http://bobby-tables.comにはリスクの説明があります。 **決して** unsanitisedデータをSQLに直接挿入しないでください。 – ADyson

答えて

0

多くのものが考えられますが、ファイルのバイナリコンテンツが原因である可能性が最も高いです。適切なパラメータ化を使用して、データが確実に浄化され、セキュリティが向上するようにします。また、データベースの列に対してデータが長過ぎないことを確認し、必要に応じて切り捨てまたは拒否するために、データをチェックする必要があります。

<?php 
$clientCode = $_POST["clientCode"]; 
$fileName = $_FILES["aadhaar"]["name"]; 
$fileType = $_FILES["aadhaar"]["type"]; 
$fileTemp = file_get_contents($_FILES["aadhaar"]["tmp_name"]); 
$parameters = array(
    $clientCode, 
    $fileName, 
    $fileType, 
    array($fileTemp, SQLSRV_PARAM_IN, SQLSRV_PHPTYPE_STRING, SQLSRV_SQLTYPE_BINARY) 
); 
$query  = <<<SQL 
INSERT INTO KYCSCANS (
    FIRMNUMBER, CLIENTCODE, FILENAME, FILETYPE, FILECONTENT, 
    TIMESTAMP, CREATIONTIMESTAMP, ADDEDBY, FILERELATED 
) 
VALUES (
    'Global', ?, ?, ?, ?, GETDATE(), GETDATE(), 'madWeb', 'temp' 
) 
SQL; 

$insertQuery = sqlsrv_query($jarvisconnection, $query, $parameters); 

if ($insertQuery === false) { 
    die("Aadhaar Query Failed" . print_r(sqlsrv_errors(), true)); 
} 
+0

ありがとうございます。私はあなたのコードを使用しようとしましたが、今私は次のエラーが表示されます - データ型varchar(最大)からvarbinary(最大)への暗黙の変換は許可されていません。この問合せを実行するには、CONVERTファンクションを使用します。 私を助けてもらえますか? –

+0

私の編集内容を確認し、この機能に関する[ドキュメントを読む](http://php.net/sqlsrv_query)を参照してください。私が編集したコードを使用すると – miken32

+0

は、それは私に次のエラーました:未定義の定数SQLSRV_PHPTYPE_STRINGの 使用する - 中...未定義の定数SQLSRV_SQLTYPE_BINARYの と 使用を想定「SQLSRV_PHPTYPE_STRING」 - で「SQLSRV_SQLTYPE_BINARY」と仮定し... そしてIはcode'の$パラメータ=配列( $ clientCode、 $ファイル名、 $たfileType、 アレイ($ fileTemp、SQLSRV_PARAM_IN、SQLSRV_PHPTYPE_STRING(SQLSRV_ENC_CHAR)、SQLSRV_SQLTYPE_BINARY(1800)) ) 'にパラメータ配列を変更し、 'code' しかし、このエラー0: 文字データ、右切り捨て –

関連する問題