Php 通过GET更改DB的状态?

Php 通过GET更改DB的状态?,php,Php,addCategory.php <?php $parentId = isset($_GET['parentId']) ? $_GET['parentId'] : 0; $categoryName = $categoryDescription = ""; $fail = ""; if (isset($_POST['submit'])) { if (isset($_POST['categoryName'])) $categoryName = fix_stri

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);
}

?>
<?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() {

}

?>

.注册{边框:1px实心#999999;
字体:普通14px直升机;颜色:#444444;}
函数验证(表单)
{
fail=validateCategoryName(form.categoryName.value)
fail+=validateCategoryDescription(form.categoryDescription.value)
如果(fail==“”)返回true
else{alert(fail);return false}
}
添加类别
很抱歉,发现了以下错误
以您的形式:


数据如何到达那里并不重要,它可以在途中修改。你可以把它放在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查询的一部分放入任何一个$\u GET(或$\u POST…哪一个都不重要)中,并可能让它在您的服务器上执行
mysql\u real\u escape\u string
是为您提供的一个函数,用于确保恶意用户可能进入脚本的查询的任何部分都不会通过。图示:

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

对于修改内容并重新提交的用户,可以使用nonce来防止这种情况。nonce是一种安全的东西,它是一个“n使用一次的编号”。一个超级简单的方法是:当您向用户显示表单时,您应该将某种数字放入数据库,然后将该数字放入表单上的隐藏字段中。当用户提交时,脚本会在字段中看到nonce,检查它是否在数据库中,然后将其删除。如果脚本找不到nonce,它知道它已经被使用,因此它拒绝用户的请求,因为该请求已经被处理。为了进一步保护这一点,请将用户id与nonce一起放入数据库(假设您有某种会话处理,可以为用户提供id),以便用户拥有自己的nonce。更好的做法是为每个会话提供一个唯一的id,并将其与nonce一起使用。虽然这个系统并不完美,但至少在用户意外刷新页面的情况下,它应该会有所帮助。您可以将其视为一个“请求id”,一旦处理了“请求id”,就不能再处理它了

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

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

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

这没什么大不了的,但是使用太多的重定向和请求会使你的网站速度减慢,还会导致你的服务器接收的请求比它需要的多。每次更改位置标头时,它都会发送一个302,用户的浏览器会从服务器请求另一个URL。

无论数据如何到达,都可以在途中修改。你可以把它放在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查询的一部分放入任何一个$\u GET(或$\u POST…哪一个都不重要)中,并可能让它在您的服务器上执行
mysql\u real\u escape\u string
是为您提供的一个函数,用于确保恶意用户可能进入脚本的查询的任何部分都不会通过。图示:

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

对于修改内容并重新提交的用户,可以使用nonce来防止这种情况。nonce是一种安全的东西,它是一个“n使用一次的编号”。一个超级简单的方法是:当您向用户显示表单时,您应该将某种数字放入数据库,然后将该数字放入表单上的隐藏字段中。当用户提交时,脚本会在字段中看到nonce,检查它是否在数据库中,然后将其删除。如果脚本找不到nonce,它知道它已经被使用,因此它拒绝用户的请求,因为该请求已经被处理。为了进一步保护这一点,请将用户id与nonce一起放入数据库(假设您有某种会话处理,可以为用户提供id),以便用户拥有自己的nonce。更好的做法是为每个会话提供一个唯一的id,并将其与nonce一起使用。虽然这个系统并不完美,但至少在用户意外刷新页面的情况下,它应该会有所帮助。您可以将其视为一个“请求id”,一旦处理了“请求id”,就不能再处理它了

同样,只要您以某种方式验证数据,将数据放在何处并不重要。然而,一个限制是,某些浏览器(如某些IE版本)不允许URL长度超过2048个字符左右。POST数据通常不受限制(PHP本身除外),因此