下面的代码应该检查数据库中是否有人在数据库中有一行,其中包含从登录cookie获取的用户名。如果有,则应该包含一个页面,如果有的话这个user_id数据库中的一个人应该回应。到目前为止,这是我的代码,请告诉我如何做到这一点。我之前已经知道有人告诉我,像我这样的mySQL语句正在变得贬值。这里是我的代码:
<?php
include("dbconnect.php");
mysql_select_db("maxgee_close2");
$username = $_COOKIE['maxgee_me_user'];
$result = mysql_query("select user_id from users where username = '$username'");
$row = mysql_fetch_array($result);
mysql_free_result($result);
$check = mysql_query("SELECT * FROM events_main WHERE user_id ='$row['user_id']'") or die(mysql_error());
if(1==1){
if (mysql_num_rows($check)>0)
{
include("example.php");
}
else
{
echo "example";
}
}
?>
答案 0 :(得分:1)
在双引号字符串中,您的数组变量$row['user_id']
被错误地解析,因为您引用了数组键而没有包围{}
中的所有内容。如果不引用数组键,则允许在双引号字符串中省略{}
,但{}
会增加可读性。
check = mysql_query("SELECT * FROM events_main WHERE user_id ='{$row['user_id']}'") or die(mysql_error());
//-------------------------------------------------------------^^^^^^^^^^^^^^^^^^
// Also acceptable, but not as tidy, and troublesome with multidimensional
// or variable keys - unquoted array key
check = mysql_query("SELECT * FROM events_main WHERE user_id ='$row[user_id]'") or die(mysql_error());
//-------------------------------------------------------------^^^^^^^^^^^^^^^^^^
如上所述,$_COOKIE
永远不会被视为安全值。如果继续使用旧的mysql_*()
API,则必须从SQL注入中转义其值:
$username = mysql_real_escape_string($_COOKIE['maxgee_me_user']);
答案 1 :(得分:0)
2件事情刚刚开始,就像Waleed说你对SQL注入开放一样,不是很好的事情发生在你身上。我会研究阅读有关MySQLi和PDO的教程,从那里尝试并深入研究更好的方法或运行查询。
您是否也选择使用Cookie代替会话来存储用户名?可以在客户端修改Cookie,以便说出具有firebug的智能用户希望它们的任何内容。会话存储在服务器端,而客户端(最终用户)仅被赋予会话的ID。如果您将其作为会话发送,则无法修改用户名。 (他们可以尝试将会话ID更改为另一组随机的数字,但这就像是在撒谎,请原谅我的法语。
下面是一些pseduo代码,可以帮助你实现我的想法
<?php
include("dbconnect.php");
$database = "maxgee_close2"; //Set the database you want to connect to
mysql_select_db($database); //Select database
$username = $_SESSION['maxgee_me_user']; //Grab the username from a server-side stored session, not a cookie!
$query = "SELECT user_id FROM `users` WHERE `username` = '" . mysql_real_escape_string($username) . "' LIMIT 1"; //Note the user of mysql_real_escape_string on the $username, we want to clean the variable of anything that could harm the database.
$result = mysql_query($query);
if ($row = mysql_fetch_array($result)) {
//Query was ran and returned a result, grab the ID
$userId = $row["user_id"];
mysql_free_result($result); //We can free the result now after we have grabbed everything we need
$query_check = "SELECT * FROM `events_main` WHERE `user_id` = '" . mysql_real_escape_string($userId) . "'";
$check = mysql_query($query_check);
if (mysql_num_rows($check)>0) {
include("example.php");
}
else {
echo "example";
}
}
?>
该代码可能/可能不起作用,但真正的关键变化是您正在运行的事实 了mysql_free_result($结果); 在您的脚本有机会从数据库中获取用户ID之前。
总而言之,我真的会回去阅读更多教程。