【解決方法】解析エラー: 構文エラー、予期しない ” (T_ENCAPSED_and_WHITESPACE)、C:\wamp64\www\ に ‘-‘ または識別子 (T_STRING) または変数 (T_VARIABLE) または数値 (T_NUM_STRING) が必要です…

プログラミングQA


こんにちは、次のエラーがあります: 解析エラー: 構文エラー、予期しない ” (T_ENCAPSED_AND_WHITESPACE)、C:\wamp64\www\ で ‘-‘ または識別子 (T_STRING) または変数 (T_VARIABLE) または数値 (T_NUM_STRING) が必要です…直し方がわかりません。 私を助けてください。 ありがとう

私のコード

<!-- download.php file -->
<?php

// Get the file ID from the URL
$filename = $_GET['id'];

// Query the database for the file record
$sql = "SELECT filename FROM pdf_data where id=$id;
$result = mysqli_query($conn, $sql);

// Check if a result was returned
if (mysqli_num_rows($result) > 0) {
  // Fetch the file name and path
  $row = mysqli_fetch_assoc($result);
  $filename = $row['filename']; //line15
  $file_path = "pdf/" . $filename;

  // Send the file to the user's browser for download
  header('Content-Type: application/octet-stream');
  header('Content-Disposition: attachment; filename="' . $filename . '"');
  readfile($file_path);
} else {
  // Display an error message if the file was not found
  echo "File not found.";
}
?>

私が試したこと:

ユーザーダウンロードPDFファイルを作成したい

解決策 1

二重引用符を閉じません:

PHP
$sql = "SELECT filename FROM pdf_data where id=$id;

試す:

PHP
$sql = "SELECT filename FROM pdf_data where id=$id";

しかし … 文字列を連結して SQL コマンドを作成しないでください。 データベース全体を破壊する可能性のある、偶発的または意図的な SQL インジェクション攻撃にさらされる可能性があります。 代わりに、常にパラメーター化されたクエリを使用してください。

文字列を連結すると、SQL が次のようなコマンドを受け取るため、問題が発生します。

SQL
SELECT * FROM MyTable WHERE StreetAddress = 'Baker's Wood'

ユーザーが追加した引用符は、SQL に関する限り文字列を終了させ、問題が発生します。 しかし、それはもっと悪いかもしれません。 代わりに「x’;DROP TABLE MyTable;–」と入力すると、SQL は非常に異なるコマンドを受け取ります。

SQL
SELECT * FROM MyTable WHERE StreetAddress = 'x';DROP TABLE MyTable;--'

どの SQL が 3 つの別個のコマンドとして認識されるか:

SQL
SELECT * FROM MyTable WHERE StreetAddress = 'x';

完全に有効な SELECT

SQL
DROP TABLE MyTable;

完全に有効な「テーブルの削除」コマンド

SQL
--'

そして、それ以外はすべてコメントです。
一致する行を選択し、DB からテーブルを削除し、それ以外は無視します。

したがって、常にパラメーター化されたクエリを使用してください。 または、DB をバックアップから頻繁に復元する準備をしてください。 バックアップは定期的に取っていますよね?

コメント

タイトルとURLをコピーしました