【问题标题】:variable transfer from FORM to PHP从 FORM 到 PHP 的变量传输
【发布时间】:2013-05-12 16:54:41
【问题描述】:

我的表格是这样的:

<form action="del.php" method="post" enctype="multipart/form-data">
Number of field to show:<input type="text" name="limit" /><br /><br /> 
Top category: 
<select name="topcat"> 
<option>tech</option>
<option>automobile</option>
</select><br /><br />
Base category: 
<select name="cat"> 
<option>mobile</option>
<option>computer</option>
</select> 

<input type="submit" />
</form>

我正在尝试编写代码以从页面中选择的数据库中删除特定 id: del.php:

<head>
<?php
require_once('globals.php');// for database connection
?>
</head>
<body>
<?php

        $cat = $_POST['cat'];
    $topcat = $_POST['topcat'];
    $limit = $_POST['limit'];

if(isset($_GET['delete']))
{

    $query = 'DELETE FROM '.$cat.' WHERE id = '.(int)$_GET['delete'];
    echo $query;
    $result = mysql_query($query);
}



$query = 'select id,headline from '. $cat.' order by date DESC limit 0,'.$limit;
$result = mysql_query($query);
while($row = mysql_fetch_assoc($result))
{

$headline=$row['headline'];

    echo '<div class="record" id="record-'.$row['id'].'">
                <a href="?delete='.$row['id'].'" class="delete">Delete</a>
                <strong>'.$headline.'</strong>
            </div>';
}
?>

</body>

问题:当 isset($_GET['delete'] 被执行时,它说 undefined variable cat 。 但$cat 被定义为从以前的形式解析。 有什么解决办法吗?

【问题讨论】:

  • 没有要提交的文件时不需要enctype="multipart/form-data"
  • $cat 不能为空,请发布您的 php 错误。
  • @Pietu1998:好的删除并检查...问题仍然存在。
  • @Brad - 如果我们每次谈论 sql 注入漏洞时都能得到一分钱......我们现在将成为百万富翁......
  • @user2320375,不不不不!首先学习以正确的方式编写查询。你不明白这是一个多么糟糕的问题。有自动机器人在互联网上漫游,寻找像你这样的坏代码。不仅如此,一旦您需要在字符串值中使用撇号之类的东西,您的代码将无法正常运行。修理它。先学对路。如果你是初学者也没关系。你学错了。

标签: php html mysql forms


【解决方案1】:

这是一个简短的课程

第一课

关于 HTTP GET 请求的课程:
永远永远永远永远永远... 使用 GET 请求执行任何更新/删除,这是一个邀请滥用者搞砸您的应用程序的邀请,例如:SQL 注入 POST 请求比 GET 更安全,但这并不意味着它是无懈可击的......总是清理!

htt://yourunsecureedwebsite/del.php?delete=10

滥用者将此请求发送到网页:

htt://yourunsecureedwebsite/del.php?delete=10' 或 1=1'

你完蛋了。整个表被删除。因此,永远不要永远不要使用 GET 请求对您的数据库进行任何修改。

第 2 课:
总是总是总是逃避/清理 GET 和 POST 请求 在过去,我们曾经依靠mysql_real_escape_string() 来防止恶意请求。但是任何 mysql_* 都有其自身的漏洞,因此 PHP 管理员弃用了此功能。

所以MysqliPDO 来救我们了,它们有处理这个恶意代码的prepare() 函数。再也不用担心注射了。 (我会亲自添加更多的消毒)

现在你的代码:

正如我在 cmets 部分中提到的那样,它看起来不像是不打算删除任何内容的表单,它看起来只是一个搜索查询表单,您可以在其中选择字段数和类别,并且当使用 POST 请求提交 from 时,您会显示数据根据查询。您实际上并没有发送任何有关删除该类别的请求。

以下是实现所需内容的步骤: 首先,当您执行发布请求时,请始终检查页面是否加载了发布请求。在您的情况下,您的第一行应该是:

if($_isset["submit"]){
    $cat = sanitize($_POST['cat']);
    $topcat = sanitize($_POST['topcat']);
    $limit = sanitize($_POST['limit']);
}

sanitize 您必须创建一个自定义函数来清理 POST 数据。 (something to get you started)。

现在数据库部分:通过一个小教程了解如何实现 MySQLi 或 PDO (nice tutorial and some knowledge about PDO)

如果您还想与表单一起删除您的类别,那么您将找到一种方法来检索该类别的 id 并将其删除: 你可以通过两种方式做到这一点: 1>你可以发送一个隐藏的id字段(不安全) 2> 根据您选择的类别从数据库中检索 id。

注意:您一次只能发出GET 请求或POST 请求。有一些方法可以将值附加到可以模仿 GET 请求的 URL,但这是您学习过程中的另一个重要教程。

我建议在制作任何在线内容之前先阅读有关创建安全应用程序的教程,因为有些人和赛隆人喜欢捣乱。

饭菜

【讨论】:

    【解决方案2】:

    对所有发布的内容使用 if (isset()) 结构,如果遇到问题,请使用 else 显示相关通知以进行故障排除。

    大概 $delete 是从表单复选框发送的,因此应该保存一个整数值并通过 POST 而不是通过 GET。我会把它留给你。

    【讨论】:

    • -1。不要在答案中发布不安全的代码!人们一直在复制/粘贴这些东西,却不知道自己在做什么。
    • if (isset($_GET['delete']) AND isset($_POST['cat'])) { 会被当作真的执行吗???在发布答案之前三思
    • 不用担心,我只是在示例中演示了 sprintf 的使用,因此我没有一次提供太多信息。我会解决的。
    猜你喜欢
    • 2012-11-01
    • 1970-01-01
    • 2012-07-03
    • 1970-01-01
    • 2017-04-15
    • 2018-10-22
    • 2012-10-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多