变量从FORM传输到PHP


variable transfer from FORM to PHP

我有一个表单,就像:

<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']执行时,显示未定义变量cat。但$cat的定义是由之前的形式解析而来的。有解决方案吗?

这是一个简短的教训

第一课:

关于HTTP GET请求的教训:
Never Never Never Never Never…使用GET请求执行任何更新/删除操作都会导致滥用者破坏您的应用程序,例如:SQL注入POST请求比GET更安全,但这并不意味着它们是无懈可击的。总是清洁!

http://yourunsecureedwebsite/del.php吗?删除= 10

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

http://yourunsecureedwebsite/del.php吗?Delete =10' or 1=1'

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

2课:
总是总是转义/清理GET和POST请求在古代,我们常常依靠mysql_real_escape_string()来抵御邪恶的恶意请求。但是任何mysql_*都有它自己的漏洞,所以php管理员不赞成这个功能。

所以mysql和PDO来拯救我们,它有prepare()函数来处理这个恶意代码。不用再担心注射了。(我个人会在此基础上增加更多的卫生处理)

现在你的代码:

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

下面是实现你想要的步骤:首先,当您执行post请求时,总是检查页面是否加载了post请求。在你的例子中,第一行应该是:

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

sanitize是您必须创建的自定义函数,用于清理POST数据。(让你开始)

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

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

注意:一次只能做一个GET请求或POST请求。有一些方法可以给URL附加值来模拟GET请求,但这是你学习过程中的另一个大教程。

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

Dinesh

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

假设$delete是从表单复选框发送的,所以应该保存一个整数值,并通过post而不是GET发送。