Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/254.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 我如何使$\更安全。?_Php_Get_Security - Fatal编程技术网

Php 我如何使$\更安全。?

Php 我如何使$\更安全。?,php,get,security,Php,Get,Security,我正在使用get方法执行一些操作,例如,approve、markasspam、delete,用于评论系统。我知道这样做是非常不安全的,但我无法控制。因为使用$_GET方法的原因是使用PHP_SELF在页面本身内执行操作,仅供参考,我也使用post方法using checkbox执行操作 现在,为了使它有点安全,我想随机化数字或生成哈希或其他东西,然后比较它,获取id并执行操作 我当前的代码有点像这样 <?php if($approve == 1 ) { ?> &

我正在使用get方法执行一些操作,例如,approve、markasspam、delete,用于评论系统。我知道这样做是非常不安全的,但我无法控制。因为使用$_GET方法的原因是使用PHP_SELF在页面本身内执行操作,仅供参考,我也使用post方法using checkbox执行操作

现在,为了使它有点安全,我想随机化数字或生成哈希或其他东西,然后比较它,获取id并执行操作

我当前的代码有点像这样

<?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端用户身份验证,并仅在登录用户发出请求时执行操作。需要对脚本进行基本更改,但最灵活

重新编辑:

事实证明,您的脚本已经受到保护。在这种情况下,我假设您对URL中出现的增量ID号、在浏览器中缓存等感到不舒服。通常的解决方案是在创建每个注释时为其生成一个随机键(除了增量ID)。该键存储在一个单独的列中(别忘了添加一个索引),您可以与之匹配

更进一步的一步是为每个操作创建临时哈希,这是针对大量外部攻击的最终保护

重新编辑有关使用一次性哈希的内容:

我还从未在管理界面中实现过一次性哈希,因此我没有这方面的经验,但我认为一个非常简单的实现会将操作哈希存储在一个单独的表中,其中包含列
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是什么阻止未经身份验证的用户在URL
page.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);
}