我想基于密钥在名为“keys”的MySQL表中搜索查询,然后返回该查询的其他值。 (例如“id”)
这就是我的表格:
id key customer
88633631 gNjp4CW6E/VfdBqli6zBLw== Name1
41317488 bi74frT3LFGTRkvoW7B31Q== Name2
..这就是我的PHP代码的样子:
<?php
require 'config.inc.php';
/* Declare variables */
$key = $_GET["key"];
$id = "";
$customer = "";
/* Connect to database and grab the keys */
@mysql_connect($g_mysql_host,$g_mysql_usr,$g_mysql_pass)
or die("Couldn't connect to database server");
@mysql_selectdb($g_mysql_db)
or die("Couldn't select database");
$query = "SELECT * FROM `keys` WHERE `key` = $key";
$result = mysql_query($query);
if (!$result) exit("INVALID KEY");
else {
while ($row = mysql_fetch_array($result)) {
echo $row['id'];
}
}
?>
但这不起作用。我认为这个问题是由密钥末尾的2个等于引起的,但我不确定。 如果我想搜索“id”然后打印搜索到的“id”的“密钥”,它就会起作用。
我不想在结尾删除2个等号,因为它们与AES128填充有关。
实际上,问题不是由密钥末尾的2个等于引起的。它是由字符串中的“+”字符引起的,但如果我将其删除,则无法解密AES128加密文本。
答案 0 :(得分:1)
你这样做有几个问题。
首先,您没有引用您的价值:'$key'
$query = "SELECT * FROM `keys` WHERE `key` = '$key'";
其次,您的代码对SQL注入是开放的。逃避你的价值:
$key = mysql_real_escape_string($_GET["key"]);
以上代码是您需要做的绝对最低限度
接下来的事情是mysql_
函数已被弃用了很长时间,并已在PHP 7中删除。
您需要切换到mysqli_
或PDO
。你越早切换越好。
请阅读此问题以获取更多信息:How can I prevent SQL injection in PHP?
除了上面提到的所有问题之外,如果你没有使用keywords and reserved words作为表或列名,那么你将自己保存(如果他们必须阅读你的代码,那就更有其他人了)正如杰伊布兰查德所指出的那样。
答案 1 :(得分:0)
这种情况正在发生,因为你没有转义应该是
的输入"SELECT * FROM `keys` WHERE `key` = '$key'"
但无论如何这不是最好的方法,你必须使用预备语句和包装器,如PDO
像这样的东西
$stmt = $db->prepare('SELECT * FROM `keys` WHERE `key` = :key');
$stmt->bindValue(":key", $_GET["key"]);
if ($stmt->execute()) {
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
echo $row['id'];
}
}
答案 2 :(得分:0)
如果更改以下行
怎么办?$query = "SELECT * FROM `keys` WHERE `key` = $key";
到
$query = "SELECT * FROM `keys` WHERE `key` = '".$key."' ";