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

时间:2013-10-18 11:47:55

标签: php database .htaccess security

作为PHP的新手,我可能没有采用正确的路线表格,但这种方式对我来说很有用。以下是我的设置/

的示例

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

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

4 个答案:

答案 0 :(得分:4)

您可以选择几种方式:

  1. 在插入数据库之前验证表单发布数据
  2. 包含仅在提交之前的表单中出现的现时值或其他生成的值
  3. 您尝试解决的问题实际上听起来像是要禁止将空白记录插入数据库 - 不一定是您要阻止访问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要求您的表单在生成时称为nonce时会收到唯一值。 nonce是一个特定于该表单实例的唯一值。随后对add.php的调用仅在nonce有效时才接受请求。一种方法可能是将nonce存储在用户的会话中。

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

答案 1 :(得分:3)

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

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

为了保护这些页面我已经应用了以下代码。

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

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