使用url参数登录

时间:2013-11-29 01:55:41

标签: mysql

我正在创建一个使用URL参数的各种登录系统。 参数设置没问题。我不知道问题是什么。 这是我的代码:

<?php
require_once("db_const.php");
$mysqli = new mysqli("dont", "try", "to login to", "my database");
# check connection
if ($mysqli->connect_errno) {
    echo "<p>MySQL error no {$mysqli->connect_errno} : {$mysqli->connect_error}</p>";
    exit();
}

$username = filter_input(INPUT_GET,"username",FILTER_SANITIZE_STRING);
$password = filter_input(INPUT_GET,"password",FILTER_SANITIZE_STRING);
$sql = "SELECT * from users WHERE username LIKE '{$username}' AND password LIKE '{$password}' LIMIT 1";
$result = $mysqli->query($sql);
    if (!$result->num_rows == 1) {
        echo "failed";
    } else {
        echo "success";
    }
?>   

2 个答案:

答案 0 :(得分:-1)

尝试:

$sql = "SELECT * from users WHERE username='$username' AND password='$password'";


注意

即使上面的代码解决了您的问题,它仍然非常危险,因为用户名密码参数上的 SQL注入容易受到攻击它可以通过以下方式被利用:恶意用户可以通过中断引号并添加评估为true的条件来绕过登录检查。

您可以使用mysqli::prepare来克服错误。

$stmt = mysqli->prepare("SELECT * from users WHERE username=? AND password=?");
$stmt->bind_param("ss", $username,$password);
$stmt->execute();

答案 1 :(得分:-1)

您的代码存在一些问题。

问题是使用LIKE功能。您的用法是

SELECT * from users WHERE username LIKE '{$username}' AND password LIKE '{$password}' LIMIT 1

需要额外的规范来查找匹配位置等,例如:

SELECT ... WHERE username LIKE '%{$username}%' 

在您使用的表单中,WHERE子句(如果等效于

SELECT ... WHERE username = '{$username}'

此外,甚至(特别是)使用通配符也不建议使用LIKE,因为'tom'将匹配用户'tom'和'tommy',并且计数肯定不会是== 1.

我还会敦促您测试查询错误

if (!$result) {
   echo 'An error occurred : $mysqli->error;
}

其他人已经在网址上提到了passwing用户名和密码的风险,请注意他们的意见。

此外,出于安全原因,不建议以普通形式存储密码数据库。有很多资源可以解释如何加密密码并使用加密值进行身份验证。