仅允许从表单访问 PHP 脚本,而不允许直接访问


Only allow access to PHP scripts from a form, not directly

作为PHP的新手,我可能不会采取正确的表单路线,但这种方式在某种程度上对我有用。以下是我的设置示例/

我在 www.foo.com/add.php 有一个表单,需要管理员登录会话。表单将数据插入数据库。提交后,操作将设置为 action="scripts/add.php",然后使用 PHP 标头函数将其重定向到 www.foo.com/done.php

我想知道的是,您能否直接拒绝访问脚本文件,例如,如果您在 Web 浏览器中访问脚本文件,它可能会在数据库中输入空行或可能导致其他一些安全问题?

如果使用 POST

方法提交表单(属性method="post"<form> 中),您仍然可以仅在 POST 请求上执行脚本,方法是在顶部添加以下内容:

 if ($_SERVER['REQUEST_METHOD'] != 'POST') {
   exit;
 }

有几个选项可供您使用:

  1. 在插入数据库之前验证表单发布数据
  2. 在提交之前包括仅在表单中存在的随机数或其他生成的值

您尝试解决的问题听起来确实像是您要禁止将空白记录插入数据库 - 不一定是您要阻止访问 add.php。 这就是选项 #1 发挥作用的地方。

在您当前的 add.php 中,听起来需要一些输入验证。 基本上,您将检查脚本接收的值以确保它们存在。 例如,如果 add.php 接受名字作为电话簿应用的一部分,你将拥有类似于以下内容的代码:

$firstName = '';
if(isset($_GET['firstName']))
    $firstName = $isset($_GET['firstName']);
// ...
if(trim($firstName) == '')
    //do something to handle an error, either set an error flag or die() with an appropriate message

这是输入验证的一个基本示例,PHP 有一个你可能想要熟悉的验证库:http://www.php.net/manual/en/intro.filter.php

完成此输入验证后,有人可以导航到 add.php并且应该会收到错误。 它还将检测是否有人也提交了空白表单。

#2 要求表单在生成时接收一个称为随机数的唯一值。 随机数是特定于表单实例的唯一值。 后续调用 add.php 仅在随机数有效时接受请求。 一种方法可能是将随机数存储在用户的会话中。

问题范围之外的另一个注意事项是,由于您要将数据插入数据库,因此应确保对插入的数据进行正确转义。 如果您使用的是 MySQL,请参阅此处:http://www.php.net/manual/en/mysqli.real-escape-string.php。 如果使用其他数据库引擎,则需要查找特定库以查看如何转义字符串。

> Yuu 可以尝试这样做来检查请求是否通过邮寄发送

if(isset($_POST)){
continue.......
}
为了

保护这些页面,我应用了下面的代码。

除请求方法外,它还检查请求是否仅来自特定域。

$live_site_regex = '/http:'/'/(w{3}|w*).?yourdomain.ext/';
if($_POST && preg_match($live_site_regex,$_SERVER['HTTP_REFERER']) == 1){
//everything is ok
}