可能的重复项:
在 PHP 中停止 SQL 注入的最佳方法
我的登录脚本被黑客入侵(黑客可以绕过登录并进入成员部分)。
这是我的登录信息:
<form action="<?php echo $_SERVER['PHP_SELF']?>" method="post">
<table width="450px"><tr><td>
<?php
if(isset($_POST['login']))
{
$user= mysql_real_escape_string($_POST['username']);
$user22 = strip_tags($user);
$pass= mysql_real_escape_string($_POST['password']);
$pass2 = strip_tags($pass);
$pass1 = md5($pass2);
$mod = 1 ;
$sql = "SELECT * FROM users WHERE username='".$user22."' AND password = '".$pass1."'";
$result = mysql_query($sql) or die(mysql_error());
$battle_get = mysql_fetch_array($result);
if ( $battle_get['mod'] == 1 ) {
$month = time() + 3600*24*30;
$hour = time() + 3600*1*1;
$LastLogin = date('l, M d, Y H:i:s');
$_SESSION['user'] = $_POST['username'];
setcookie("save_user", stripslashes(htmlentities($user22)), $hour);
setcookie("save_pass", stripslashes(htmlentities($user22)), $month);
$username = stripslashes(htmlentities($user22));
$result = mysql_query("UPDATE users SET LastLogin = '$LastLogin' WHERE username='$username'");
header("location: home.php");
}
}
?></td></tr></table>
<ul><li class="topper" style="width:410px;"></li>
<table>
<tr><td>Username</td><td><input type="text" name="username" id="textfield"></td></tr>
<tr><td>Password</td><td><input type="password" name="password" id="textfield"></td></tr>
</table><li class="bottomer" style="width:410px;"></li></ul>
<table><tr><td><input type="submit" name="login" value="login" id="button"></td></tr></table>
</form>
然后在我的配置文件中,我有这段代码,它可以阻止用户每次登录等更改 IP。
if(isset($_SESSION['last_ip']) == false){
$_SESSION['last_ip'] = $_SERVER['REMOTE_ADDR'];
}
if ($_SESSION['last_ip'] !== $_SERVER['REMOTE_ADDR']){
session_unset();
session_destroy();
}
if(empty($_SESSION['user'])){
echo"Please login into the rpg first" ;
die;
}
我在每个页面上都包含配置文件(上面的代码),如果为空,则阻止用户在站点一侧查看...... 黑客告诉我他正在使用sql进入.....
我做错了什么?
行
$sql = "SELECT * FROM users WHERE username='".$user22."' AND password = '".$pass1."'";
很危险(SQL注入),我建议你用预准备语句和PdoMySQL
。
请参阅 http://www.php.net/manual/en/ref.pdo-mysql.php
他正在使用SQL注入。他正在将"用户名"的 $_POST 更改为类似
"username; OR 1=1"
因为 1=1 是"真的",所以它让他进来了。您不受";"
有很多关于SQL注入以及如何保护自己的信息。
查看 Sql Injection,并在此处查看示例:http://www.unixwiz.net/techtips/sql-injection.html
您的特定 sql 如下所示:
$sql = "SELECT * FROM users WHERE username='".$user22."' AND password = '".$pass1."'";
这对于SQL注入来说已经成熟了。
请看下面的一些内容:
- http://www.learnphponline.com/security/sql-injection-prevention-mysql-php
- http://www.tech-evangelist.com/2007/11/05/preventing-sql-injection-attack/
- http://www.phpbuilder.com/columns/ProPHPSecurity_excerpt.php3
- http://25yearsofprogramming.com/blog/2011/20110205.htm
这些只是在 php 中搜索如何防止 sql 注入攻击时的一些顶级链接。
在这里阅读一些关于SQL注入的信息。
请看这篇文章。
他解释了sql注入和mysql_real_escape_string();