#javascript #php #html #forms #security
#javascript #php #HTML #формы #Безопасность
Вопрос:
Итак, у меня есть index.php
и r.php
. R.php
это часть регистрации. И index.php
является фактической формой. Мой вопрос в том, как я могу r.php
отправлять ошибки обратно index.php
, если они существуют. Поэтому вместо отображения ошибок r.php
я хочу, чтобы они были включены index.php
и предотвращали продвижение формы.
Вот index.php
<!DOCTYPE html>
<html>
<body>
<form method="post" action="r.php">
<input type="text" name="name" placeholder="Name">
<input type="submit">
</form>
</body>
Все очень просто. Теперь вот r.php
<?php
$name = $_POST['name'];
if ($name < 3){
//display error
}
else {
//proceed
}
?>
Должен ли я делать это с помощью JS? Или это лучший способ.
Комментарии:
1. Обычный способ — иметь r.php и index.php быть в том же файле. Это может упростить задачу
2. Я не очень хорошо знаком с Pear…. @pce
Ответ №1:
Один из способов — использовать сеансы:
<?php session_start(); ?>
<!DOCTYPE html>
<html>
<body>
<?php echo isset($_SESSION['message']) ? $_SESSION['message'] : ''; ?>
<form method="post" action="r.php">
<input type="text" name="name" placeholder="Name">
<input type="submit">
</form>
</body>
<?php
session_start();
unset($_SESSION['message']);
$name = $_POST['name'];
if ($name < 3){ // you probably want strlen($name) < 3
$_SESSION['message'] = 'error';
header('Location: index.php');
exit;
}
else {
//proceed
}
?>
Помимо сеансов, вы можете перенаправить обратно строку запроса и использовать это:
header('Location: index.php?message=' . urlencode('some kind of error');
Затем:
<?php echo isset($_GET['message']) ? $_GET['message'] : ''; ?>
Комментарии:
1. Кажется, все хорошо. Но когда я возвращаюсь после того, как ошибка все еще существует. Я пытался использовать
unset($_SESSION['message']);
afterexit;
, но он не работает. Есть идеи, куда я должен это вставить?2. Не следует повторять переменные $ _GET без фильтрации, по крайней мере, используйте htmlspecialchars или htmlentities, потому что это уязвимо для XSS .
3. Я знаю о SQL-инъекциях и XSS. Я обязательно исправлю это после того, как пойму это. @pce
4. Просто пример. Я отредактировал с помощью
unset($_SESSION['message']);
5. По-прежнему не сбрасывается. Я хочу, чтобы они отображались только один раз. Например, после того, как пользователь обновит страницу после получения сообщений, я не хочу, чтобы они были там. В противном случае хороший ответ.
Ответ №2:
Для этого было бы проще использовать один скрипт, просто поместите все это в один файл и проверьте, была ли отправлена форма. Если форма была отправлена, вы просто сразу включаете нужные переменные.
Это довольно грубо, но дает вам представление о том, куда вы можете пойти с этим:
<?php
if (isset($_POST['name'])) {
// Begin processing form stuff
$name = $_POST['name'];
// Initialise error variable
$error = null;
if ($name < 3) {
// Display error, for example:
$error = 'Name is less than 3';
} else {
// Proceed
}
}
?>
<!DOCTYPE html>
<html>
<body>
<?php if ( ! empty($error)) { ?>
<p><?php echo $error; ?></p>
<?php } ?>
<form method="post" action="r.php">
<input type="text" name="name" placeholder="Name">
<input type="submit">
</form>
</body>
</html>
Комментарии:
1. Я знаю об этом. Но я пытаюсь сделать это с помощью 2 файлов.
2. Хорошо, тогда вы можете использовать перенаправление с
r.php
и задать некоторыеGET
переменные. Единственный по-настоящему надежный способ сделать это — действительно иметь передний контроллер.
Ответ №3:
<!DOCTYPE html>
<html>
<?php
$msg = '';
if(isset($_GET['e'])
{
$msg = "Error! Input not valid.";
}
?>
<body>
<?php
if($msg!='')
{
echo "<font color='red'>".$msg."</font>";
}
?>
<form method="post" action="r.php">
<input type="text" name="name" placeholder="Name">
<input type="submit">
</form>
</body>
Просто передайте переменную e с помощью запроса GET на страницу индекса, если обнаружена ошибка.
<?php
$name = $_POST['name'];
if ($name < 3){
header("Location: index.php?e=error");
}
else {
//proceed
}
?>
Запрос GET отправит переменную e с использованием URL, и если будет обнаружено, что e имеет значение, это означает, что произошла ошибка в r.php
Ответ №4:
Используйте javascript для простой проверки формы. Если вам требуются какие-либо средства безопасности или базы данных, вы можете использовать сеанс / cookie или использовать функцию заголовка, чтобы вернуться назад.