如何让$ _GET更安全.

Ibr*_*mar 3 php security get

我正在使用get方法执行一些操作,例如,批准,markasspam,删除,用于评论系统.我知道走这条路是非常不安全但我无法帮助它.因为使用$ _GET方法的原因是使用PHP_SELF在页面本身内执行操作,而FYI我也使用post方法使用复选框来执行操作.

现在为了让它有点安全我想随机化数字或生成哈希或其他东西,然后比较它,获取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>
Run Code Online (Sandbox Code Playgroud)

我用这个代码执行操作..

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);
}
Run Code Online (Sandbox Code Playgroud)

而不是使用批准或不批准或删除或垃圾邮件,我想随机化或散列该单词,并希望它尽可能冗长,然后执行操作.

我该怎么做?你对此有什么看法?

编辑:请注意只有经过身份验证的用户即管理员才能执行此操作.即使它通过身份验证系统我想为管理员添加更多的安全性.避免实验或意外

代码并不准确只是让你理解我想要实现的样本.

Pek*_*ica 5

在这里使用GET或POST参数并不重要 - 脚本首先需要的是某种身份验证.(完成之后,您可以进入安全性详细信息,其中GET的安全性略低于POST - 请参阅注释以获取详细信息.)

我会说你有两个选择:

  • 使用.htaccess保护整个脚本 - 脚本本身不需要进行任何更改

  • 引入PHP侧用户身份验证并仅在登录用户发出请求时执行操作.需要对脚本进行根本性更改,但最灵活.

重新编辑:

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

更进一步的步骤是为每个动作创建临时哈希,这是对一些外部攻击的最终保护.

关于使用一次性哈希的编辑:

I've never implemented one-time hashes in an admin interface yet so I have no experience with this, but I imagine that a very simple implementation would store action hashes in a separate table with the columns hash, record and action. Whenever your tool lists a number of records and outputs "delete/approve/unapprove" links, it would generate three record in the hash table for each comment: One for delete, one for approve, one for unapprove. The "delete/approve /unapprove" links would then, instead of the record ID and command, get the correct hash as the only parameter.

Add a time-out function for unused hashes (plus delete any hashes that were actually used) and you're done.