Php 我如何使$\更安全。?
我正在使用get方法执行一些操作,例如,approve、markasspam、delete,用于评论系统。我知道这样做是非常不安全的,但我无法控制。因为使用$_GET方法的原因是使用PHP_SELF在页面本身内执行操作,仅供参考,我也使用post方法using checkbox执行操作 现在,为了使它有点安全,我想随机化数字或生成哈希或其他东西,然后比较它,获取id并执行操作 我当前的代码有点像这样Php 我如何使$\更安全。?,php,get,security,Php,Get,Security,我正在使用get方法执行一些操作,例如,approve、markasspam、delete,用于评论系统。我知道这样做是非常不安全的,但我无法控制。因为使用$_GET方法的原因是使用PHP_SELF在页面本身内执行操作,仅供参考,我也使用post方法using checkbox执行操作 现在,为了使它有点安全,我想随机化数字或生成哈希或其他东西,然后比较它,获取id并执行操作 我当前的代码有点像这样 <?php if($approve == 1 ) { ?> &
<?php
if($approve == 1 )
{
?>
<a href="<?php echo $_SERVER['PHP_SELF']."?approve=".$id; ?>">Unapprove</a>
<?php
} else
{
?>
<a href="<?php echo $_SERVER['PHP_SELF']."?unapprove=".$id; ?>">Approve</a>
<?php
}
?>
| <a href="<?php echo $_SERVER['PHP_SELF']."?spam=".$id; ?>">Spam</a>
| <a class="edit-comments" href="edit-comments.php?id=<?php echo $id; ?>">Edit</a>
| <a href="<?php echo $_SERVER['PHP_SELF']."?delete=".$id; ?>">Delete</a>
我不想使用approve、unapprove、delete或spam,而是想随机化或散列这些单词,让它们尽可能长,然后执行操作
我该怎么做?你对此有何看法
编辑:请仅注意
已验证的用户(即管理员)将
能够执行此操作。即使
虽然它通过了身份验证
系统我想增加更多的安全性
即使是管理员。避免实验
还是意外
代码并不精确,它只是让您了解我想要实现的示例 在此使用GET或POST参数在上下文中无关紧要-脚本首先需要的是某种身份验证。(完成后,您可以进入安全详细信息,其中GET的安全性略低于POST-有关详细信息,请参阅注释。) 我想你有两个选择:
- 使用.htaccess保护整个脚本-无需更改脚本本身
- 引入PHP端用户身份验证,并仅在登录用户发出请求时执行操作。需要对脚本进行基本更改,但最灵活
hash
、record
和action
。每当您的工具列出许多记录并输出“删除/批准/取消批准”链接时,它都会在哈希表中为每个注释生成三条记录:一条用于删除,一条用于批准,一条用于取消批准。“delete/approve/unapprove”链接将获得正确的散列作为唯一参数,而不是记录ID和命令
为未使用的散列添加一个超时函数(加上删除所有实际使用的散列),您就完成了。您可以这样做,
$\u GET
不是代码中不安全的东西。不安全性来自您没有检查用户是否有权删除评论
在您当前的代码中,任何人都可以随时、频繁地删除任何内容
如果您有一个包装代码,可以确保在此处输入好的理由时不会执行由您发布的If语句,那么就可以了
但是您应该尝试验证参数的内容是否真的是整数,而不是仅仅对它们进行赋值并直接在数据库中使用它们
在您的编辑中
您应该检查您的参数是否真的是int。intval(“test”)
也将返回一个整数,大部分为0
你可以考虑正则表达式,以验证字符串仅由数字组成:<代码> PREGGHORM('/[09] +/',$yGET [ ID ' ]);代码>
如果是这样,您可以执行该操作。您不应该使用GET进行任何更改服务器上数据的操作。从未。您使用它只是为了获取数据
如果不能使用表单作为操作按钮(因为在它们之外还有另一种形式),你应该考虑这个设计:
- 您可以使用AJAX执行对服务器的POST请求
- 在禁用javascript的环境中,您使用诸如user.php?action=delete之类的GET链接,它在单独的页面上显示非常简单的表单。表单中的标题询问:“您确定要删除用户X吗?”它有两个按钮:1)“是”-将POST请求提交给操作脚本,2)“否”-将用户发送回他所在的页面
请不要告诉我这是生产代码。请澄清,为什么您不能使用POST在页面本身内执行操作?@NullUserException不幸的是,您知道我是一个初学者。是的,我不能在这个项目中使用。我将非常感谢并欢迎任何形式的反馈或建议:)@Anton对于我需要使用该表单的帖子,我已经将其用于相同的元素。这将与我的代码相矛盾。@Peter我当然会这么做,谢谢。:)@Pekka仅供参考此操作仅由经过身份验证的用户执行。我想避免事故和实验,这就是为什么我想让它更安全,是的,我将使用.htaccess,但现在我需要知道在这个脚本中是否有任何方法可以使用$\u GET生成哈希和比较并执行操作。@Ibrahim是什么阻止未经身份验证的用户在URLpage.php?delete=1
?POST更安全,当我们谈论对您的管理界面的XSS攻击时。@Anton POST如何停止XSS?@Anton您是对的,但这叫做CSRF(请参阅我的答案)。XSS是另一个漏洞。很抱歉,我忘了提及我已给用户au
if(isset($_GET['approve'])) {
$id = intval($_GET['approve']);
$query = "UPDATE comments SET approve = '0' WHERE id = '$id'";
$result = mysql_query($query);
}
if(isset($_GET['unapprove'])) {
$id = intval($_GET['unapprove']);
$query = "UPDATE comments SET approve = '1' WHERE id = '$id'";
$result = mysql_query($query);
}
if(isset($_GET['delete'])) {
$id = intval($_GET['delete']);
$query = "DELETE FROM comments WHERE id = '$id'";
$result = mysql_query($query);
}
if(isset($_GET['spam'])) {
$id = intval($_GET['spam']);
$query = "UPDATE comments SET spam = '1' WHERE id = '$id'";
$result = mysql_query($query);
}