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 次に、それらのデータを挿入した後、別のページにリダイレクトします。

データベースの状態を変更する場合は、GET ではなく POST を使用する必要があることを読みました。GET データが URL に表示され、ユーザーが URL のデータベースの状態を変更できるため、これは悪いことだと思います。もう 1 つは、POST を使用している場合に更新をクリックすると、ブラウザーは、もう一度同じ方法を使用しますが、GET を使用すると、ブラウザーは警告を表示しないため、同じデータを 2 回投稿することになります。

私のコードでは、データが挿入されるとすぐに別のページにリダイレクトされるため、ユーザーが URL を操作して DB を変更することはできません。また、更新の問題はここでは問題になりません。

入力を処理する場所を分離したいのですが、それが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 を使用することでこれを防ぐことができます。ノンスは、「一度使用される数」であるセキュリティのものです少なくとも、ユーザーが誤ってページを更新した場合に役立つはずです。「リクエストID」と考えることができ、「リクエストID」が処理されると、再度処理することはできません。

繰り返しますが、何らかの方法でデータを検証する限り、データをどこに置くかは問題ではありません。ただし、制限の 1 つは、一部のブラウザー (IE の一部のバージョンなど) では、2048 文字程度を超える URL を許可しない傾向があることです。POST データは一般に (PHP 自体を除いて) ほとんど制限されていないため、大量のデータ (フォーラムへの投稿など) を送信する予定がある場合は、おそらく POST を使用することをお勧めします。ごく少量のデータ (ツイートなど) を送信する場合は、GET を使用できます。また、パスワードは GET 経由で送信されるべきではありません。ユーザーのブラウザはそれを履歴に保持する可能性があり、パスワードがどこにでも履歴に浮かび上がってほしくないからです...

編集: 補足として、データを処理するために必ずしも 2 つの別々の URL を用意する必要はありません。processCategory.php から HTML 部分を削除require processCategory.phpし、addCategory.php の先頭で使用して、リダイレクト ヘッダーを実行する行の代わりに、次のようなものに置き換えます。

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

大したことではありませんが、リダイレクトとリクエストが多すぎると、サイトが少し遅くなり、サーバーが必要以上のリクエストを受け取る可能性があります. Location ヘッダーを変更するたびに 302 が送信され、ユーザーのブラウザーはサーバーから別の URL を要求します。

于 2012-12-28T05:16:06.553 に答える