我目前有一个javascript文件'score.js',它使用jQuery.js,通过链接正确调用。 score.js中的代码是:
function originalUpdateScore(answer,correct){
if (answer == correct)
{
$.post('updateScore.php');
}
window.location.reload(true);
}
此函数调用'updateScore.php':
<?php
include("dbstuff.inc");
$con = mysqli_connect($host, $user, $passwd, $dbname)
or die ("Query died: connection");
$updateScore = "UPDATE `user` SET `tempScore`=`tempScore`+1
WHERE (user.Username='$_SESSION[logname]')";
mysqli_query($con, $updateScore);
?>
但是数据库未正确更新。如果我更换行:
$updateScore = "UPDATE `user` SET `tempScore`=`tempScore`+1
WHERE (user.Username='$_SESSION[logname]')";
使用:
$updateScore = "UPDATE `user` SET `tempScore`=`tempScore`+1
WHERE (user.Username='123pf')";
其中123pf是SESSION变量在调用javascript的php文件中包含的值,它正确更新。为什么使用会话变量不起作用?我在查询中是否错误地调用了它?
提前致谢。
答案 0 :(得分:5)
您是否在updateScore.php内的任何地方呼叫session_start
?
如果您尚未启动会话,我不相信会话变量可用。
答案 1 :(得分:1)
另外,你有完成对$ _SESSION ['logname']的控制吗?如果没有,有人可以轻松更改其日志名称以注入SQL并损坏/危害您的数据库。例如,如果他们能够将其日志名称设置为此,则可能会丢失用户表:
$_SESSION['logname']="'; DROP TABLE user;-- ";
通过这样的方式打开你自己就是骗子。在这种情况下,任何用户都可以随时访问updateScore.php来增加他们的统计数据,因为该脚本既不会检查他们的答案,也不会检查JS构建的令牌以确定分数是否正常。将这种逻辑保留在前端(javascript)而不在后端验证(PHP)是一个坏主意; javascript&amp; AJAX是非常有用的快捷方式,可以改善用户体验,但它们不能被视为唯一的有效性检查器。
答案 2 :(得分:0)
这可能只是一个转录错误,但您在问题中显示的代码使用$ _SESSION [logname],它应该是$ _SESSION ['logname']。