4

mysql および sql エスケープ文字列の明らかなセキュリティ上の欠陥を無視すると、 msgsページのリロード時に sql テーブルが空でいっぱいになる理由を誰も知りません。ページがリロードされるたびに、フォームが送信されます。なぜこれが起こっているのか、どうすれば止められるのか混乱していますか?

  <?php
    ob_start();
    session_start();
    $con = mysql_connect("localhost","username","pass");
    if (!$con)
      {
      die('Could not connect: ' . mysql_error());
      }

    $dates = date('Y-m-d H:i:s');
    $uid = $_SESSION['user_id'];
    $msg_id = (int) $_GET['msg_id'];
    mysql_select_db("db_table", $con);

    $result = mysql_query("SELECT users.first_name, users.last_name ,  intro.intro, intro.outro FROM intro INNER JOIN users ON intro.user_id = users.user_id WHERE intro.message_id = {$msg_id}");
    while($row = mysql_fetch_array($result))
    {
       echo  "<div id=\"start\"><div class=\"namedate\"><h1>". $row['first_name'] ." ".  $row['last_name'] .  "</h1><h2>test</h2></div><div id=\"holdmsg\"><div class=\"cent\"><strong>" . $row['intro'] . "</strong><br><i>" . $row['outro'] ."</i></div></div></div> "  ;
    }

PART RELEVANT TO THE FORM は、ページの上部にあるこの部分と $_GET です。

<form action="" method="post">      
<?php 

$sql="INSERT INTO messages (user_id, intro_id , msg, date ) VALUES (('$uid'), {$msg_id} ,'$_POST[msg]', ('$dates'))";

if (!mysql_query($sql,$con))
  {
  die('Error: ' . mysql_error());
  }

mysql_close($con);

?>

    <textarea rows="2"style="float:left" name="msg" type="text"placeholder="Elaborate on your idea..."></textarea>
    <input id="togz2" style="float:right; "type="submit" value="SUBMIT" name="submit" class="butts">
    </div></div>
</form>
4

2 に答える 2

3

なぜこのようにしないのですか?

if (mysql_query($sql,$con))
  {
   header('location:yourpage.php');
}else{
  die('Error: ' . mysql_error());
}

また、挿入クエリの上にそのようなステートメントは表示されません

if(isset($_REQUEST['submit'])){ //to check if posted

  $sql="INSERT ......
}

それに加えて、データベースに挿入する前にデータを検証する必要もあります。

于 2013-01-22T10:02:18.197 に答える
2

これは、ページの読み込み時に重複エントリを防ぐ方法の良い例です

リンクhttp://www.webhostingtalk.com/showthread.php?t=700175を参照してください。

<?php
session_start();
$faction = $_REQUEST['faction'] ;
if (!is_array($_SESSION['serials'])) $_SESSION['serials'] = array ();
if ($_REQUEST['serial']){
  if ( in_array ($_REQUEST['serial'] , $_SESSION['serials'] ) ){
    // duplicate submition, nullify it
    $faction = '';
  }else{
    $_SESSION['serials'][] = $_REQUEST['serial'] ;
  }
}


if ($faction) { // form submited
  // if faction is not set completely ignore submition

}
?>

<form>
<input type="hidden" name="faction" value="42">
<input type="hidden" name="serial" value="<?=rand(1000000 , 9999999)?;>">
....
the rest of the form is here
....
</form> 

別の解決策:-

挿入が成功したら、新しいページにリダイレクトする必要があります。

于 2013-01-22T09:48:48.897 に答える