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