4

MySQLでエラーが発生します:

You have an error in your SQL syntax; check the manual that corresponds 
to your MySQL server version for the right syntax to use near '''')' at line 2'.

HTMLコード:

<form action="read_message.php" method="post">
  <table class="form_table">
    <tr>
      <td style="font-weight:bold;">Subject:</td>
      <td><input style=" width:300px" name="form_subject"/></td>
      <td></td>
    </tr>
    <tr>
      <td style="font-weight:bold;">Message:</td>
      <td id="myWordCount">&nbsp;(300 words left)</td>
      <td></td>
    </tr>
    <tr>
      <td><input type="hidden" name="sender_id" value="<?php echo $sender_id?>"></td>
      <td><textarea cols="50" rows="4" name="form_message"></textarea></td>
      <td valign="bottom"><input type="submit" name="submit_message" value="send"></td>
    </tr>
  </table>
</form>

mysqlテーブルに挿入するコード:

<?php
  include_once"connect_to_mysql.php";
  //submit new message
  if($_POST['submit_message']){

    if($_POST['form_subject']==""){
      $submit_subject="(no subject)";
    }else{
      $submit_subject=$_POST['form_subject'];   
    }
    $submit_message=$_POST['form_message'];
    $sender_id = $_POST['sender_id'];
    if($shortMessagesLeft<1){
      $form_error_message='You have left with '.$shortMessagesLeft.' Short Message. Please purchase it from the <a href="membership.php?id='.$id.'">shop</a>.';
    }
    else if($submit_message==""){
      $form_error_message = 'Please fill in the message before sending.';
    }
    else{
      $message_left = $shortMessagesLeft-1;
      $update_short_message = mysql_query("UPDATE message_count SET short_message = '$message_left' WHERE user_id = '$id'");
      $sql = mysql_query("INSERT INTO private_messages (to_id, from_id, time_sent, subject, message) 
        VALUES('$sender_id', '$id', now(),'$submit_subject','$submit_message')") or die (mysql_error());
    }
  }

?>

エラーは何を意味し、私は何を間違っているのですか?

4

5 に答える 5

14

$submitsubjectorに一重引用符があります$submit_message

なぜこれが問題なのですか?

一重引用符文字は、MySQL の文字列を終了し、それ以降はすべて SQL コマンドとして扱われます。あなたは本当にSQLをそのように書きたくありません。せいぜいアプリケーションが断続的に壊れてしまい (ご覧のように)、最悪の場合、巨大なセキュリティ上の脆弱性が発生しただけです。

誰かが'); DROP TABLE private_messages;送信メッセージで送信したと想像してください。

SQL コマンドは次のようになります。

INSERT INTO private_messages (to_id, from_id, time_sent, subject, message) 
        VALUES('sender_id', 'id', now(),'subjet','');

DROP TABLE private_messages;

代わりに、値を適切にサニタイズする必要があります。

最小で、各値を実行する必要mysql_real_escape_string()がありますが、実際には準備済みステートメントを使用する必要があります。

コードを使用していた場合はmysql_real_escape_string()、次のようになります。

if($_POST['submit_message']){

if($_POST['form_subject']==""){
    $submit_subject="(no subject)";
}else{
    $submit_subject=mysql_real_escape_string($_POST['form_subject']); 
}
$submit_message=mysql_real_escape_string($_POST['form_message']);
$sender_id = mysql_real_escape_string($_POST['sender_id']);

これは、準備済みステートメントと PDO に関する素晴らしい記事です。

于 2012-06-19T02:36:56.843 に答える
4

これは SQL インジェクションと呼ばれます。は'、mysql クエリで文字列を開いたり閉じたりしようとします。クエリに含まれる文字列は常にエスケープする必要があります。

例えば、

これの代わりに:

"VALUES ('$sender_id') "

これを行う:

"VALUES ('". mysql_real_escape_string($sender_id)  ."') "

(もちろん、または同等のもの)

ただし、PDO、名前付きパラメーター、準備済みステートメント、または他の多くの方法を使用して、これを自動化することをお勧めします。これとSQLインジェクションについて調べてください(ここにいくつかのテクニックがあります)。

それが役に立てば幸い。乾杯

于 2012-06-19T02:37:54.243 に答える
0

sqldump が完全にダウンロードされていることを確認してください。この問題は、半分または不完全にダウンロードされた sqldump をインポートしようとするときによく発生します。sqldump ファイルのサイズを確認してください。

于 2015-05-20T09:36:08.900 に答える