我想知道处理网站插入/删除请求的专业方法是什么?
现在,我所拥有的是在每个表单上插入两个<input type = "hidden"/>
,其中一个隐藏值对应于它需要的函数,另一个是此函数的参数。因此,当表单提交时,我有一个post.php文件来处理所有插入/删除请求,这些请求只是通过PHP中的call_user_func()
调用hiddens的值。像这样:
<input name = "arg" value = "{$id}" type = "hidden"/>
<input name = "call" value = "delete_member" type = "hidden"/>
call_user_func($_POST['call'], $_POST['arg']);
我怀疑这个解决方案是多么明智,因为我发现隐藏的密码实际上并不隐藏在客户端的源代码中。
我的第一个解决方案是基本上有很多条件检查要调用哪个函数,但我真的很讨厌,所以我用这个解决方案改变了它。
我想知道有什么更好的方法可以做到这一点,或者专业人士如何做到这一点?处理插入/删除查询。
答案 0 :(得分:1)
我认为这是从客户端调用操作的一种非常糟糕的方式。
一方面,这些数据被放入HTML中,客户端始终可以查看和编辑。因此,这意味着您无法信任从客户端收到的数据,因此您无法信任他们正在调用的函数。
重新强调我之前的想法的另一点。你说你运行验证以确保它是一个函数和所有这些,但你有一个问题。闭包在这些函数上返回true(因为它们是函数和方法,并且它们存在)。因此,用户可以将一个匿名函数作为hiden字段的值,并在服务器上实际运行他们想要的任何内容。
正如其他人所说我会建议调查MVC。看看Yii / CodeIgniter / Zend / Lithium / Kohana /等如何做到以及如何做到这一点。
如何通过我最喜欢的框架,Yii:
完成删除操作的路由示例class UserController extends CController{
public function actionDelete($id = null){
if($id===null){ return false; }
}
}
然后表单/链接调用/user/delete?id=2
,它使index.php路由到userController
并使用用户控制器内的actionDelete
函数,运行它的代码。当然,这是一个非常简化的版本,它可以更加复杂地阻止漏洞。
您可能还希望了解CSRF验证。
答案 1 :(得分:1)
最常见的方法是只调用一个当时处理一个表单的函数,就像这个例子一样提交博客消息:
<强> blog.php的强>
if(isset($_POST['submit'])) {
save_message();
} else {
display_form();
}
function display_form()
{
?>
<form action="blog.php"> etc etc....
<?php
}
function save_message()
{
//security checks and inserts etc
$_SESSION['message'] = 'Form saved succesfully';
header('location: blog_overview.php');
}
这是我的一个实践,但你可能想要检查像Codeigniter和Kohana这样的框架,因为上面的代码是有用的(对我来说已经过时了)。阅读有关OOP(面向对象编程)和MVC(模型视图控制器)的一些教程。这似乎有很多工作,但如果你真的希望它做得对,那就值得花时间和精力。