我想知道处理网站插入/删除请求的专业方法是什么?
现在,我在每个表单上插入了两个<input type = "hidden"/>
,其中一个隐藏的值对应于它需要的函数,另一个是这个函数的参数。因此,当表单提交时,我有一个post.php文件,它处理所有插入/删除请求,只需通过php中的call_user_func()
调用隐藏点的值。像这样:
<input name = "arg" value = "{$id}" type = "hidden"/>
<input name = "call" value = "delete_member" type = "hidden"/>
call_user_func($_POST['call'], $_POST['arg']);
我怀疑这个解决方案有多明智,因为我发现隐藏点实际上并没有隐藏在客户端的源代码中。
我的第一个解决方案是基本上有很多条件语句来检查要调用哪个函数,但我真的很讨厌这样,所以我用这个解决方案更改了它。
我想知道有什么更好的方法可以做到这一点,或者专业人士是如何做到的?处理插入/删除查询。
我认为这是从客户端调用操作的一种非常糟糕的方式。
首先,这些数据被放入HTML中,客户端始终可以查看和编辑HTML。因此,这意味着您无法信任从客户端接收的数据,因此您也无法信任他们正在调用的函数。
还有一点要补充我以前的想法。你说你运行验证以确保它是一个函数等等,但你有问题。闭包在这些函数上返回true(因为它们是函数和方法,并且存在)。因此,用户可以将anon函数作为隐藏字段的值,并在服务器上实际运行他们想要的任何内容。
正如其他人所说,我建议研究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验证。
最常见的方法是只调用一个函数,该函数一次处理一个表单,例如提交博客消息:
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(模型视图控制器)的教程。这可能看起来工作量很大,但如果你真的想让它做对,那么花时间和精力是值得的。