PHP-查询新数据库的结果

时间:2016-02-10 21:19:03

标签: php mysql

下面的代码用于通过输入客户端的特定用户名和密码来查找客户端。但我想将任何查询的结果保存到称为订单的特定表。问题是我在编码方面遇到了麻烦。这是我的代码,在循环中注释“//将查询结果保存到新数据库”是,我想插入变量的代码,然后将其插入到表中。

<?php
    mysql_connect("localhost", "hidden", "hidden") or die("Error connecting to database: ".mysql_error());
    mysql_select_db("users") or die(mysql_error());

?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>Search results</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <link rel="stylesheet" type="text/css" href="style.css"/>
</head>
<body>
<?php
    $query = $_GET['query']; 
    $password = $_GET['password'];

    $min_length = 3;

    if(strlen($query) >= $min_length){ // if query length is more or equal minimum length then

        $query = htmlspecialchars($query); 
        // changes characters used in html to their equivalents, for example: < to &gt;

        $query = mysql_real_escape_string($query);
        // makes sure nobody uses SQL injection

        $raw_results = mysql_query("SELECT * FROM users
            WHERE (`username` LIKE '%".$query."%') AND (`password` LIKE '%".$password."%')") or die(mysql_error());



        if(mysql_num_rows($raw_results) > 0){ // if one or more rows are returned do following

            while($results = mysql_fetch_array($raw_results)){

                //save the queried results to new database
            }

        }
        else{
            echo "Nema rezultati za takov korisnik";
        }

    }
    else{ // if query length is less than minimum
        echo "Minimalnata dolzina na stringot e: ".$min_length;
    }
?>
</body>
</html>

1 个答案:

答案 0 :(得分:2)

您的代码存在很多安全问题。

首先,您不应传递用户名和密码等参数作为GET 参数。浏览器可能会将URL保存在历史记录中,用户可能会共享指向twitter的链接。不安全,用POST传递参数。

其次,将mysql_real_escape_string()应用于用户名将无法保护您免受SQL注入,(请参阅此SQL injection that gets around mysql_real_escape_string())。 请使用准备好的声明。 您不应该使用htmlspecialchars(),而不是回显页面的用户名。此外,您应该使用html特殊字符搜索数据库,但不能使用其html值。

例如,如果username =“&lt; username&gt;”,请使用“&lt; username&gt;”搜索数据库而不是“&amp; lt; username&amp; gt;”。您只应在向页面回显用户名时应用htmlspecialchars,例如 echo 'Hello '.htmlspecialchars($username).', how are you?';

第三,你使用mysql_ *,你不应该。在PHP 5.5.0中,不推荐使用mysql_ * ,在PHP 7中删除。请改用mysqli_ *。

第四,绝不应该使用password LIKE %$passwordFromuser%查询数据库。想象一下,你有“hellomypassword”的密码和“Bob”的用户名。所以我使用凭据登录: username =“Bob” password =“a”,因此表达式“%a%”匹配“hellomypassword”。 所以我访问了您的帐户。 与用户名相同,将'%'应用于用户名是错误的。

最后但并非最不重要的是,使用强散列算法将密码存储到数据库中。

现在,第一个查询应该只返回一行(只有一行应该有一组特定的用户名和密码),所以你不需要 while($results = mysql_fetch_array($raw_results)){}。只需获取一次结果。

然后使用结果并对表执行INSERT查询,如下所示 INSERT INTO tbName (rowName1,rowName2) VALUES (rowValue1, rowValue2)