1

addCategory.php

<?php
$parentId = isset($_GET['parentId']) ? $_GET['parentId'] : 0;

$categoryName = $categoryDescription = "";
$fail = "";


if (isset($_POST['submit'])) {  

    if (isset($_POST['categoryName']))
        $categoryName = fix_string($_POST['categoryName']);

    if (isset($_POST['categoryDescription']))
        $categoryDescription = fix_string($_POST['categoryDescription']);

    $hidParentId = $_POST['hidParentId'];
}

$fail  = validate_category_name($categoryName);
$fail .= validate_category_description($categoryDescription);


echo "<html><head><title>An Example Form</title>";

if ($fail == "") {
  echo "success";

    header("Location: processCategory.php?action=add&categoryName=$categoryName&categoryDescription=$categoryDescription&hidparentId=$hidParentId");

    exit;
}

// Now output the HTML and JavaScript code
?>

<!-- The HTML section -->

<style>.signup { border: 1px solid #999999;
    font: normal 14px helvetica; color:#444444; }</style>
<script type="text/javascript">
function validate(form)
{

    fail  = validateCategoryName(form.categoryName.value)
    fail += validateCategoryDescription(form.categoryDescription.value)

    if (fail == "") return true
    else { alert(fail); return false }
}
</script></head><body>
<table class="signup" border="0" cellpadding="2"
    cellspacing="5" bgcolor="#eeeeee">
<th colspan="2" align="center">Add Category</th>

<?php

if (isset($_POST['submit'])) {
?>

<tr><td colspan="2">Sorry, the following errors were found<br />
in your form: <p><font color=red size=1><i><?php echo $fail ?></i></font></p>
</td></tr>

<?php 
}
?>

<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>?parentId=<?php echo $parentId; ?>"
    onSubmit="return validate(this)">
     <tr><td>Category Name</td><td><input type="text" maxlength="32"
    name="categoryName" value="<?php echo $categoryName; ?>" /></td>
    </tr><tr><td>Category Description</td><td><input type="text" maxlength="32"
    name="categoryDescription" value="<?php echo $categoryDescription; ?>" /></td>

    <input type="hidden" name="hidparentId" value="<?php echo $parentId; ?>" />

</tr><tr><td colspan="2" align="center">
    <input type="submit" name="submit" value="ok" /></td>
</tr></form></table>

<!-- The JavaScript section -->

<script type="text/javascript">
function validateCategoryName(field) {
    if (field == "") return "No name entered.\n"
    return ""
}

function validateCategoryDescription(field) {
    if (field == "") return "No description entered.\n"
    return ""
}

</script></body></html>

<?php
// Finally, here are the PHP functions

function validate_category_name($field) {
    if ($field == "") return "No name entered<br />";
    return "";
}

function validate_category_description($field) {
    if ($field == "") return "No description entered<br />";
    return "";
}

function fix_string($string) {
    if (get_magic_quotes_gpc()) $string = stripslashes($string);
    return htmlentities ($string);
}

?>



processCategory.php

<?php
$action = isset($_GET['action']) ? $_GET['action'] : '';
switch ($action) {

    case 'add' :
        addCategory();
        break;

    case 'modify' :
        modifyCategory();
        break;

    case 'delete' :
        deleteCategory();
        break;

    default :
        // if action is not defined or unknown
        // move to main category page
        header('Location: index.php');
}


/*
    Add a category
*/
function addCategory() {



    $name        = $_GET['categoryName'];
    $description = $_GET['categoryDescription'];
    $parentId  = $_GET['hidparentId'];

    $sql   =  "INSERT INTO tbl_category (cat_parent_id, cat_name, cat_description) 
            VALUES ($parentId, '$name', '$description')";
    $result = dbQuery($sql) or die('Cannot add category' . mysql_error());

    header('Location: index.php?catId=' . $parentId);     

}

function modifyCategory() {

}

function deleteCategory() {

}

?>

请注意,我通过 POST 获取用户输入,然后将该 POST 数据发送到相同的 .php 文件......然后在验证后将这些数据发送到另一个 .php 文件 THRU GET ......将这些 GET 数据插入DB 然后在插入这些数据后,我们重定向到另一个页面。

我读到如果你改变数据库的状态,你应该使用 POST 而不是 GET。我认为这很糟糕,因为可以在 URL 中看到 GET 数据,因此用户可以在 URL 中更改数据库的状态,另一个是当您单击刷新时,如果您使用 POST,那么浏览器会警告您尝试重复再次使用相同的方法,但是如果您使用 GET 浏览器将不会警告您,因此最终会两次发布相同的数据。

在我的代码中,用户无法操纵 url 来更改数据库,因为一旦插入数据,我们就会重定向到不同的页面,而且刷新问题在这里也不是问题。

我想要一个分开的地方来处理我的输入,那就是 processCategory.php。

我是菜鸟,如果我做得对,请告诉我。

4

1 回答 1

1

数据如何到达那里并不重要,它可以在途中修改。你可以把它放在 GET 或 POST 中,用户可以伪造它,提出自己的请求,或者中间的人可以修改它(除非你运行 https)。

您的脚本容易受到 addCategory 函数中的 SQL 注入的影响。您应该至少修改它,如下所示:

function addCategory() {
    $name        = mysql_real_escape_string($_GET['categoryName']);
    $description = mysql_real_escape_string($_GET['categoryDescription']);
    $parentId  = mysql_real_escape_string($_GET['hidparentId']);

    $sql   =  "INSERT INTO tbl_category (cat_parent_id, cat_name, cat_description) 
            VALUES ($parentId, '$name', '$description')";
...

有人可以将 SQL 查询的一部分放入任何 $_GET(或 $_POST ......哪个都无所谓)中,并可能让它在您的服务器上执行。mysql_real_escape_string是为您提供的一项功能,以确保恶意用户可能进入您的脚本的任何查询部分都不会通过。此处插图:http: //xkcd.com/327/

此外,您可能希望使用 PDO 和参数化查询进行查找,因为它们更加安全。

至于用户修改东西并重新提交,您可以通过使用Nonce来防止这种情况。nonce是一种安全的东西,它是一个使用过一次的数字它至少应该在用户不小心刷新页面的情况下有所帮助。您可以将其视为“请求 id”,一旦“请求 id”被处理,就无法再次处理。

同样,只要您以某种方式验证数据,您将数据放在哪里并不重要。然而,一个限制是某些浏览器(如某些版本的 IE)往往不允许 URL 长度超过 2048 个字符左右。POST 数据通常不受限制(PHP 本身除外),因此如果您计划发送大量数据(如论坛上的帖子),您可能希望使用 POST。如果您发送的数据很少(如推文),您可以使用 GET。此外,不应通过 GET 发送密码,因为用户的浏览器可能会将其保存在其历史记录中,并且您不希望密码在任何地方的历史记录中浮动......

编辑:作为旁注,您不必有两个单独的 URL 来处理您的数据。您可以从 processCategory.php 中删除任何 HTML 部分,在 addCategory.phprequire processCategory.php的顶部使用,而不是执行重定向标头的那一行,将其替换为以下内容:

addCategory();
header("Location: someSuccessPage.php");

这没什么大不了的,但是使用过多的重定向和请求可能会使您的网站速度变慢一点,并且还会导致您的服务器接受比它需要的更多的请求。每次更改 Location 标头时,它都会发送一个 302,这使得用户的浏览器从服务器请求另一个 URL。

于 2012-12-28T05:16:06.553 回答