处理表单时在服务器端传递重要值

时间:2015-01-25 作者:Christine Cooper

我正在开发一个插件,在<form> 标签:

<input type="hidden" name="postid" value="<?php echo $postid; ?>">
问题是,用户可以轻松地检查元素、更改值,从而影响表单处理。

表单处理通过ajax函数进行,显然是在循环之外的。

您通常如何解决这种情况?

1 个回复
最合适的回答,由SO网友:gmazzap 整理而成

老实说,我认为这个问题离题了,因为它的主题是一个非常普遍的概念,可以应用于任何能够处理web开发的语言。这比一般的PHP问题还要广泛。

顺便说一句,我想建议的太多了,不能发表评论。

当您需要检查来自受信任用户的数据时(假设您已经有了检查用户是否受信任的方法),需要建立一个系统来进行数据完整性检查。

一个简单的例子。假设您有如下表单:

<?php $data = get_my_form_data(); ?>
<form method="post">
    <input type="hidden" name="postid" value="<?= $data[\'postid\'] ?>">
    <input type="text" name="vote" value="<?= $data[\'vote\'] ?>">
    <input type="text" name="username" value="<?= $data[\'username\'] ?>">
<form>
检索数据的函数只是一个占位符,用于明确数据来自服务器,然后用于填充表单值。

现在让我们看看如何实现数据完整性。通常通过双向(可逆)加密完成。

<?php
function obfuscate_postid($id) {
  return wp_create_nonce(\'pre-md5\').md5($id.AUTH_SALT).wp_create_nonce(\'post-md5\');
}

$data = get_my_form_data();    
$check = obfuscate_postid($data[\'postid\']);
?>
<form method="post">
    <input type="hidden" name="postid" value="<?= $data[\'postid\'] ?>">
    <input type="text" name="vote" value="<?= $data[\'vote\'] ?>">
    <input type="text" name="username" value="<?= $data[\'username\'] ?>">
    <input type="hidden" name="__ch" value="<?= $check ?>">
<form>
这样,在服务器端处理中,您可以检查

$valid = obfuscate_postid($_POST[\'postid\']) === $_POST[\'__ch\'];
如果用户更改表单中的post id而不更改检查字符串,$valid 以上为false,您可以停止处理数据。

我使用了一种非常简单的双向模糊处理,由于nonce没有及时固定,这是一种非常有效的保护数据的方法。

我还使用了nonce使答案与WordPress更相关;)

如果nonces只能使用一次,那么它将是一个非常强大的系统,但它是一个投票后系统,而不是一个网上银行应用程序。如果你愿意,你也可以change nonces TTL.

最后,请注意我是如何使用salt使md5更加安全的,因为即使md5不可逆,也可以很容易地找到唯一整数的md5结果(例如,trythis 使用字符串b706835de79a2b4e80506f582af3676a).

结束

相关推荐

直接从post.php编辑帖子元吗?

有没有人知道一种简单的方法可以一次编辑一篇文章的所有metapost.php &action=edit 页因为一些元被放在那里update_post_meta() 如果有一种方法可以从帖子的编辑页面编辑任何元值,那真的很有帮助吗?一直在寻找任何东西,代码/插件,但看不到有太多提及,但认为这一定是一个很常见的问题?我附上了一张通过浏览器检查器编辑的元检查器中我想象的解决方案的图片,以防不清楚我在问什么