创建一个网站,让人们可以通过评级来发表他们对发布的意见,并将其存储到由PHP驱动的MySQL数据库中。
我有一个特定版本的反馈表单,(在这个例子中说)的ID为35.当我向用户发送另一个ID为36并且用户同时打开两个窗口时,PHP处理代码存储来自ID 35但ID为36的响应。当数据库的'reaction_reacted'值为'1'时,页面重定向到上一页。
有没有办法解决这个问题?
以下是我的代码示例。提交时,$ promo_id,reaction_id和用户名将从上一页传递给它。
session_start();
include 'connect.php';
mysql_connect($host,$db_user,$db_password);
mysql_select_db($database);
$promo_id = $_SESSION['promo_id'];
$reaction_id = $_SESSION[reaction_id];
$username = $_SESSION['username'];
if(isset($_SESSION['username']))
{
// Check to see if Receipt and DJID values are entered
$queryb = "select reaction_ID from reactiondata where reaction_ID='$reaction_id' AND reaction_username='$username' AND reaction_promoID='$promo_id' and reaction_reacted='1'";
$result2 = mysql_query($queryb) or die(mysql_error());
while($row = mysql_fetch_array($result2)){
header('Location: ' . $_SERVER['HTTP_REFERER']);
// session_destroy();
// exit;
}
if ($reaction_id && $promo_id != null)
{
$p4support = $_POST['DJsupport'];
$p4favouritemix = $_POST['FavMix'];
$p4score = $_POST['score'];
$p4comment = $_POST['DJcomment'];
$query = "UPDATE reactiondata SET reaction_username='$username', reaction_promoID='$promo_id', reaction_support='$p4support', reaction_favouritemix='$p4favouritemix', reaction_score='$p4score', reaction_comment='".mysql_real_escape_string($p4comment)."', reaction_reacted='1' WHERE reaction_ID='$reaction_id'";
mysql_query($query) or die('Error in MySQL query. Here is the error message: '.mysql_error());
$query7 = "UPDATE reactiondata SET reaction_time=NOW() WHERE reaction_ID='$reaction_id'";
mysql_query($query7) or die('Error in MySQL query. Here is the error message: '.mysql_error());
}
由于
CP
P.S我知道我正在使用折旧的mysql_query方法,我只是希望页面在我开始阻止SQL注入攻击之前正常运行。
答案 0 :(得分:0)
最简单的解决方案(其中一个......)是将reaction_id
作为隐藏表单字段添加到表单而不是使用会话。这样,当发布表单时,反应始终与正确的ID相关联。
您不应该使用会话,因为会话将跨越浏览器中所有打开的窗口和选项卡,因此不适合维护特定选项卡的状态。