问题描述
|
使用$ _GET从MysqL表中更新/删除数据是否不安全?
我不能使用$ _POST,因为它需要使用
<form>
标签
例如:
<a href=\"status.PHP?approve=\'123\'>Unapprove</a>
<?PHP
if (isLoggedIn() && groupId() == 2) {
if (isset($_GET[\'id\']) && is_numeric($_GET[\'id\']) {
$query = $db->prepare(\"UPDATE table set unapprove=\'1\' where id = :id\");
$query->bindParam(\':id\',$_GET[\'id\'],PDO::ParaM_STR);
$query->execute();
}
}
?>
请提供示例,您如何从我的示例或更好的方法中获得帮助。
解决方法
尽管不受SQL注入的限制,但是您正在执行的操作并不安全,因为会受到跨站点请求伪造的影响。
考虑登录到您的站点并访问具有此图像的另一个站点的影响:
<img src=\"yoursite.com/admin/status.php?approve=123\" />
理想情况下,始终对非幂等请求使用POST。
无论如何,您都需要添加一个特定于会话和链接的秘密令牌:
href=\"status.php?approve=123&token=[random_stuff]\"
顺便说一句,链接中的“ 4”可能应该是“ 5”。
, 不,这不安全。
它所需要的只是一个机器人或一个预缓存代理等,它可以跟随所有链接(应该可以安全地跟随它们),并且您将自动获得所有未经批准的内容。
使用<form>
。
, 只要您验证并清理输入,它本身就不是不安全的。输入是输入,但请记住,所有输入都是邪恶的。也考虑权限。您如何控制对此的访问?
边界检查数字数据。从上面的代码中,可以插入可能超出范围的数字。
另外,作为一种好的做法,我总是将所有内容都经过mysqli_real_escape_string()
(如果您愿意,也可以通过OOP等效项)。
, 使用$ _GET或$ _POST对数据库都没有关系,并且它也不安全,因为您正在检查用户是否已登录。但这是不安全的。登录的用户可以在其浏览历史记录中包含delete-url,这可能导致他们稍后在访问该页面时意外地在历史记录中选择资源而导致资源被删除。
最好发布此类数据。
如果愿意,可以创建表单而不是链接。您可以设置提交按钮的样式,使它们看起来像链接。每个链接创建一个表单。这样,即使没有Javascript,您也将具有相同的功能和外观,并且与获取相比,您仍然具有发布的相对安全性。