PHP CMS登录黑客

时间:2012-02-17 18:34:51

标签: php database login content-management-system

最近有人攻击我的PHP CMS并种植了SQL注入。有没有办法让我的登录代码更受保护并防止黑客入侵?任何帮助都会很棒,谢谢。

登录表格

<div id="loginform">

  <form method="post" action="check-login.php" name="form1">

    <label for="username" /><span style="color:#FFFFFF; font-family:'Trebuchet MS', Arial, Helvetica, sans-serif;">username:</span></label>

    <input type="text" name="myusername" id="username"/>

    <label for="password"/><span style="color:#FFFFFF; font-family:'Trebuchet MS', Arial, Helvetica, sans-serif;">password:</span></label>

    <input type="password" name="mypassword" id="password"/>

    <label for="submit"></label>

    <input type="submit" name="sumbit" value="Login">

  </form>

</div>

PHP

mysql_connect ($host, $username, $password) or die ("can't connect");
mysql_select_db ($db_name) or die (mysql_error());

$myusername = $_POST['myusername'];
$mypassword = $_POST['mypassword'];

$sql = "SELECT * FROM $tbl_name WHERE username='$myusername' and password='$mypassword'";
$result = mysql_query($sql);

$count = mysql_num_rows($result);
if ($count == 1){
 session_register("myusername");
 session_register("mypassword");
 header("Location:cms/admin.php");
}else{
 echo "Wrong username or password";
}

5 个答案:

答案 0 :(得分:6)

哇。这是禁忌:

$myusername = $_POST['myusername'];
$mypassword = $_POST['mypassword'];

您需要至少使用mysql_real_escape_string来清理这些输入。

将其更改为:

$myusername = mysql_real_escape_string($_POST['myusername']);
$mypassword = mysql_real_escape_string($_POST['mypassword']);

htmlentities()htmlspecialchars()也很有用,但我建议不要在数据进入数据库时​​使用它们。

答案 1 :(得分:2)

您的代码存在的问题是您直接将登录框中的用户输入放入SQL查询中。这确实是一个安全漏洞并允许SQL注入。

您可以使用mysql_real_escape_string()函数解决此问题 - 只需将登录表单中的变量通过它传递给SQL查询。

但是,我首选的解决方案是使用PDO或MySQLi编写的语句 - 我强烈建议您学习并使用此方法。

答案 2 :(得分:1)

YES

$myusername = $_POST['myusername'];
$mypassword = $_POST['mypassword'];

应该受到保护

$myusername = mysql_real_escape_string ($_POST['myusername']);
$mypassword = mysql_real_escape_string ($_POST['mypassword']);

去检查这些链接:

http://php.net/manual/fr/function.mysql-real-escape-string.php http://ca.php.net/manual/fr/function.addslashes.php

答案 3 :(得分:1)

简短回答:是的。您的登录代码对SQL注入是开放的。您需要查看转义用户输入。花几个小时阅读SQL注入,理解概念并探索可用的不同解决方案。使用PDO及其预处理语句是处理PHP中输入转义的好方法。 This SO question及其最佳答案是开始阅读的好资源。

答案 4 :(得分:0)

登录系统总是难以实现,虽然通过检查用户名和密码以匹配现有记录似乎非常容易。 有很多方法可以实现它。

  1. 使用盐和胡椒涂在用户注册时提交的密码上。
  2. 使用您在注册时使用的相同哈希算法检查匹配密码。
  3. 每次成功登录时更改用户passowrd的哈希值。
  4. 如果您使用会话和Cookie,有很多方法可以保护它们。
  5. 清理所有类型的用户输入非常重要。
  6. 请勿在会话或Cookie中存储用户名和密码。 (非常糟糕)
  7. 使用验证码来防止任何类型的机器人攻击。
  8. 一体化,你要研究很多事情。如果您使用的CMS不使用此类机制,请重新设计它然后使用。如果这是不可能或不可行的,使用最稳定的CMS,如Wordpress,Joomla或我最喜欢的Drupal!