-1

我的表格如下:

<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被定义为从以前的形式解析。任何解决方案?

4

2 回答 2

2

这是一个简短的课程

第一课

关于 HTTP GET 请求的课程:
永远永远永远永远永远...比 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()处理此恶意代码的功能。再也不用担心注射了。(我个人会为此添加更多的消毒)

现在您的代码:

正如我在评论部分中提到的,它看起来不像是不想删除任何东西的表单,它看起来只是一个搜索查询表单,您可以在其中选择字段数和类别,以及何时使用 POST 请求提交 from您根据查询显示数据。您实际上没有发送任何有关删除该类别的请求。

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

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

sanitize您必须创建一个自定义函数来清理 POST 数据。(让你开始的东西)。

现在数据库部分:通过一个关于如何实现 MySQLi 或 PDO 的小教程(很好的教程和一些关于 PDO 的知识

如果您还想与表单一起删除您的类别,那么您将找到一种方法来检索该类别的 ID,然后将其删除:您可以通过 2 种方式执行此操作:1> 您可以发送隐藏的 id 字段(不是安全) 2> 根据您选择的类别从数据库中检索 id。

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

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

迪内什

于 2013-05-12T08:18:08.130 回答
-3

Use the if (isset()) structure for all posted content, and if you're having trouble, use an else to display a relevant notification for troubleshooting.

Presumably the $delete is being sent from a form checkbox so should hold an integer value and be POSTed rather than via GET. I'll leave that to you.

于 2013-05-12T07:27:10.250 回答