这个问题在这里已有答案:
我有一个数据库,用于存储用户和设备的数据。每个用户都有一个设备列表。当用户登录到他的帐户时,下面的php
代码会生成用户设备列表:
$query_user="SELECT * FROM devices WHERE users_id = '".$user_id."'";
$result = mysqli_query($db, $query_user);
// generating device list and ON and OFF device links
while($row = $result->fetch_assoc())
{
echo "<br><p>". $row["device"] ."</p><a href=on.php?data=" . $row["device"] . ">ON</a><br><a href=off.php?data=" . $row["device"] . ">OFF</a><br>";
}
该代码还生成ON
和OFF
链接,以便用户可以操纵他的设备。当用户单击例如ON
时,以下URL
将传递给浏览器:
https://.../on.php?data=device23
处理URL数据的on.php
代码的一部分:
if(isset($_GET["data"]))
{
$device_name = $_GET["data"];
}
$query_user="UPDATE devices SET status='ON' WHERE device = '".$device_name."'";
mysqli_query($db, $query_user);
所以我的问题是这种方法容易受到SQL注入的影响,例如有人可以输入:
https://.../on.php?data=device17
在浏览器中打开device17
。
我的问题是如何生成ON
和OFF
链接设备列表并将数据安全传递给on.php
和off.php
文件。
编辑:
我的主要问题是如何为每个用户设备生成ON和OFF链接(每个用户拥有不同数量的设备)。当用户单击例如device23(或任何其他设备的ON链接,最初我不知道设备名称,我从第一个db查询获取设备名称)时,我必须将设备名称传递给on。 php文件,因此它可以预先形成更新设备状态的SQL查询。
在UPDATE
中制作on.php
语句时,我会仔细检查设备是否属于用户:
$query_user = "UPDATE devices SET status='ON' WHERE users_id = ? AND device = ?";
这是一个问题解决了。现在还有其他一些问题。
注意我已经避免通过连接将PHP变量直接放入SQL查询中。这是您确定的SQL注入风险。解决这个问题的方法是to use query parameters。
$stmt = mysqli_prepare($db, $query_user);
if ($stmt === false) {
error_log(mysqli_error($db));
die("Sorry, there has been a software error");
}
$ok = mysqli_stmt_bind_param($stmt, "ss", $user_id, $device_name);
if ($ok === false) {
error_log(mysqli_stmt_error($db));
die("Sorry, there has been a software error");
}
$ok = mysqli_stmt_execute($stmt);
if ($ok === false) {
error_log(mysqli_stmt_error($db));
die("Sorry, there has been a software error");
}
在每次调用mysqli函数之后检查错误是一种好习惯。如果出现错误,它们将返回false,然后由您来检查,记录它以便以后进行故障排除,并使用友好的错误消息终止PHP请求。
最后一个问题是您的代码正在更新GET请求中的数据。通常建议避免这种情况,因为索引站点的搜索引擎将遵循页面上的GET链接。如果搜索引擎索引器可以查看您的链接页面,它将跟随每个链接,因此所有设备都将打开。
在这种情况下,由于打开设备仅限于登录用户的设备,并且搜索引擎索引器不太可能在会话中记录有效用户,因此可能不会有风险。但是,只有在想要更新数据时才应该养成使用POST的习惯。
但你不能为POST请求制作一个简单的href
链接。因此,您必须制作一个锚标记并使用Javascript来发出AJAX POST请求,如上面RamRaider的评论中所述。
没有什么能阻止用户在浏览器中键入这样的URL并执行链接所做的事情,而您正在创建。这是完全有效的(事实上,浏览器通过点击该链接做了什么)
除此之外,是的,您的脚本可以用于SQL注入。您可能需要考虑使用预准备语句来访问您的数据库(https://www.w3schools.com/PHP/php_mysql_prepared_statements.asp)并另外实现某种身份验证机制(如用户/密码身份验证,系统一次性密码,......)
更新:链接(重复)问题的答案似乎很合理,以防止PHP中的SQL注入。
on / off-request的处理程序必须做两件事:
我建议你开始使用prepared statements进行sql语句。它将保护您免受sql-inject攻击。