在DB中发布信息的更好方法?

时间:2012-02-11 20:21:39

标签: php database insert

目前,我在HTML端的代码如下所示:

<form action="newstory.php" method="post">
<input type="hidden" name="author" value="<?php echo $loggedInUser->display_username; ?>"
/>
<input type="hidden" name="userid" value="<?php echo $loggedInUser->user_id ?>" />
Story Title: <input type="text" name="story_name" /><br>
Story: <textarea rows="10" cols="30" name="story" /></textarea><br>
<input type="submit" />
</form>

这是PHP方面:

include("dbconnect.php");

mysql_select_db("scratch", $con);

$author     = mysql_real_escape_string($_POST['author']);
$author_id  = mysql_real_escape_string($_POST['userid']);
$story_name = mysql_real_escape_string($_POST['story_name']);
$story      = mysql_real_escape_string($_POST['story']);

$sql= "
INSERT INTO stories (author, author_id, story_name, story)
VALUES ('$author', '$author_id','$story_name', '$story')
";


if (!mysql_query($sql,$con))
{
die('Error: ' . mysql_error());
}
echo "Story Submitted! Redirecting to Homepage...";
//User is shown this for about 3 seconds
header('Refresh: 3; URL=index.php');

mysql_close($con)

我想摆脱

<input type="hidden" name="author" value="<?php echo $loggedInUser->display_username; ?
>"/>

由于人们可以轻松地编辑和发布任何用户,但我不确定一个好方法。对于userid也是如此。

非常感谢帮助!

2 个答案:

答案 0 :(得分:1)

通过表单中的隐藏输入字段发送userid是一个巨大的安全威胁。任何人都可以用例如Chrome的检查员或FireBug。当有人登录时;您必须至少在会话中存储他们的user_id。您还可以在会话中存储更多信息,这样您就不必在每次请求时查询数据库,例如在页面上的某个位置显示登录用户的用户名。

我目前不知道您如何处理登录,我不知道如何填充$loggedInUser,但它应该是一个会话变量,例如$_SESSION['user']['id']。这样,您总是可以知道用户是谁,而无需通过表单发送数据;这是一个真正的禁忌。

确保每页顶部都有session_start(),理想情况下您需要使用模板,只需将session_start()添加到index.php的顶部。

并且

$sql= "
INSERT INTO stories (author, author_id, story_name, story)
VALUES ('$author', '$author_id','$story_name', '$story')
";

至少应该

$sql= "
INSERT INTO stories (author, author_id, story_name, story)
VALUES ('". $author ."', '". $author_id ."', '". $story_name ."', '". $story ."')
";

我个人建议:

$q = "
INSERT INTO stories
        SET author_id = ". $_SESSION['user']['id'] ." # This is an integer (I assume) so don't use apostrophe's
          , story_name = '". mysql_real_escape_string($_POST['story_name']) ."'
          , story = '". mysql_real_escape_string($_POST['story']) ."'
";

从表格中删除字段author。只需使用author_id进行表格引用,否则您将存储重复数据,当有人更改其作者姓名时,故事中的作者姓名已过时/不正确/已过时。

答案 1 :(得分:-1)

检查用户是否已设置,如果用户对象有效,则只显示该表单。在使用mysql保存之前,请使用用户对象中的值,而不是从POST数据中读取值。

<?php if ( isset($_POST['story_name']) ) {
// story posted.. check if user is set
if ( isset($loggedInUser->user_id) ) {
    // save into database using $loggedInUser->user_id and $loggedInUser->author_name
}
?>

<?php
// just show the form if the user object is set
if ( isset($loggedInUser->user_id) ){
?>
<form> <!-- and show the form over here --> </form>
<?php } ?>

哦,你的mysql_real_escape_string()很好!另一种最佳做法是使用sprintf()

将变量添加到查询中
$author     = mysql_real_escape_string($loggedInUser->author_name);
$author_id  = mysql_real_escape_string($loggedInUser->user_id);
$story_name = mysql_real_escape_string($_POST['story_name']);
$story      = mysql_real_escape_string($_POST['story']);

$sql= sprintf("
INSERT INTO stories (author, author_id, story_name, story)
VALUES ('%s', '%s', '%s', '%s')
", $author, $author_id, $story_name, $story); // %s accepts the value to be a string. %d accepts a decimal for example.