目前,我在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也是如此。
非常感谢帮助!
答案 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.