之前我使用的是MySQL,并被告知它不安全,所以现在我已经在PDO中重新编写了我的管理员登录面板,这里的用户和其他论坛说不能注入。但是黑客仍在进入...我在登录后编辑了页面并告诉被黑客告诉我我已经把它放到了什么黑客告诉我......
我需要知道我的代码是否安全。他告诉我他正在进入SQL。
首先我将他们的IP存储在一个会话中,所以如果他们的IP发生了变化,它会将它们记录下来(或用户名)
if ( isset($_SESSION['last_ip']) == false )
{
$_SESSION['last_ip'] = $_SERVER['REMOTE_ADDR'];
}
if ( $_SESSION['last_ip'] !== $_SERVER['REMOTE_ADDR'] )
{
session_unset();
session_destroy();
}
然后这是我的登录信息:
session_start();
include 'functions/functions.php';
$db = mysqlconnect();
$password = md5($_POST['mypassword']);
$mod = 1;
$statement = $db->prepare("SELECT * FROM users WHERE username = ? AND password = ?");
$statement->execute(array($_POST['myusername'],$password));
$result = $statement->fetchObject()->mod;
$count = $statement->rowCount();
if ( $result == 1 ) {
$db = mysqlconnect();
// Register $myusername, $mypassword and redirect to file "login_success.php"
$_SESSION['user'] = $_POST['myusername'] ;
//Test if it is a shared client
if ( !empty($_SERVER['HTTP_CLIENT_IP']) ) {
$ip=$_SERVER['HTTP_CLIENT_IP'];
//Is it a proxy address
} elseif ( !empty($_SERVER['HTTP_X_FORWARDED_FOR']) ) {
$ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
$ip=$_SERVER['REMOTE_ADDR'];
}
$sqll = "UPDATE users SET lastip=? WHERE username=?";
$q = $db->prepare($sqll);
$q->execute(array($ip,$_SESSION['username']));
$_SESSION['user'] = $_POST['myusername'] ;
$sqlll = "INSERT INTO user_log (username,ip) VALUES (?, ?)";
$qq = $db->prepare($sqlll);
$qq->execute(array($_SESSION['username'],$ip));
header("Location: home.php");
} else {
echo "Wrong Username or Password";
}
可以注入代码吗?
这是我的home.php页面,阻止用户查看它。
/// My conenct is here
$sql = "SELECT * FROM users WHERE username='$_SESSION[user]'";
$result = mysql_query($sql) or die(mysql_error());
$values = mysql_fetch_array($result);
if( isset($_SESSION['user']) ) {
} else {
echo "Bye Bye";
die;
}
if ( $values['mod'] == 1 ) {
echo "welcome";
} else {
echo"Your account has been reported for hacking";
die;
}
答案 0 :(得分:1)
假设您显示的查询是您使用的唯一查询,黑客如何使用您认为会阻止他的代码很有趣。 在IT世界中,前门经常被三重锁定,但后门是敞开的。 在这种情况下,它不是后门,而是你用来看门的小窗口,看你是不是开口骗子。
对所有查询使用预准备语句和变量绑定。
这是一般规则。你忘记了“所有查询”中的“全部”。
您的陈述:
$sql = "SELECT * FROM users WHERE username='$_SESSION[user]'";
是你打开的窗口。 很明显,你的黑客在会话数据中欺骗了用户名。简单的解决方案是:
在这种情况下删除标签或使用mysql_real_escape_string的价值较低,因为黑客完全可以没有任何不可存储的字符。
顺便说一下,您并不需要使用PDO来使用变量绑定。在mysql中完全可能。
$verbLok = mysqli_connect(Iam, not, gonna, tellyou);
$result = array();
if (($stmtLok = $verbLok->prepare( "SELECT * FROM users WHERE username = ? limit 1")))
{
$stmtLok->bind_param("s", $_SESSION[user]);
$stmtLok->execute();
$result = $stmtLok->get_result();
$stmtLok->close();
}
mysqli_close($verbLok);
应该为你做的伎俩。 $ result将保存结果行数组。我不再熟悉常规查询,但据我记得它与你的代码类似。
有关如何对查询进行SQL代码注入攻击的有趣读物可以找到on this page。
答案 1 :(得分:-1)
一个好的SQL注入预防措施是转义可用于终止SQL命令评估中的任何和所有文本以启动新命令。
要做到这一点,你应该转义输入中的任何引号,并使用更好的SQL - 使用字段和表名称的反引号,使用引号来包装任何非代码文本等。
SELECT * FROM `users` WHERE `id` = '1'
然后使用mysql_real_escape_string
或使用#039手动替换所有引号;等,也要确保逃避任何HTML,以确保它不会搞乱其他事情,使用htmlentities
等。