Php 通过GET更改DB的状态?
addCategory.phpPhp 通过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
<?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本身除外),因此