4

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

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

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

4

4 回答 4

5

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

 if ($_SERVER['REQUEST_METHOD'] != 'POST') {
   exit;
 }
于 2013-10-18T11:52:56.383 回答
4

有几个选项可供您使用:

  1. 在插入数据库之前验证表单发布数据
  2. 包含仅在提交之前出现在表单中的 nonce 或其他生成的值

您要解决的问题听起来确实像您想禁止将空白记录插入数据库 - 不一定是您想阻止对 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 是特定于该表单实例的唯一值。如果 nonce 有效,后续对 add.php 的调用将只接受请求。一种方法可能是将随机数存储在用户的会话中。

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

于 2013-10-18T12:07:11.207 回答
0

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

if(isset($_POST)){
continue.......
}
于 2013-10-18T12:24:13.360 回答
0

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

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

$live_site_regex = '/http:\/\/(w{3}|w*).?yourdomain.ext/';
if($_POST && preg_match($live_site_regex,$_SERVER['HTTP_REFERER']) == 1){
//everything is ok
}
于 2013-10-18T12:28:12.137 回答