Лучший способ разместить информацию в БД? - PullRequest
0 голосов
/ 12 февраля 2012

В настоящее время мой код на стороне 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; ?
>"/>

Так как люди могут легко редактировать это и публиковать сообщения как любой пользователь, но я не уверен в хорошем способе То же самое касается идентификатора пользователя.

Помощь приветствуется!

Ответы [ 2 ]

1 голос
/ 12 февраля 2012

Отправка 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 для ссылки на таблицу, в противном случае вы будете хранить дубликаты данных, и когда кто-то изменит свое имя автора, имя автора в историях будет устаревшим / неправильным / устаревшим.

0 голосов
/ 12 февраля 2012

Проверьте, установлен ли пользователь, и просто покажите эту форму, если объект пользователя действителен.Прямо перед сохранением в 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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...