Смущен в отношении защиты форм (HTML, PHP) - PullRequest
0 голосов
/ 31 июля 2011

это будет так легко для кого-то. Я просто потратил 6 часов на чтение и сейчас чувствую себя по-настоящему глупо, но эй ... Я учусь, поэтому я подумал - я спрошу вас, ребята! Я видел несколько отличных примеров для других вещей, поэтому я решил ... почему бы не спросить. Все, что я действительно хочу, это довольно просто, я уверен ... У меня есть форма, кто-то заполняет данные, я проверяю ее через JS на валидность, я проверяю в PHP на валидность, я защищаю SQL. Это все работает отлично. Что не работает нормально, так это ... если PHP не работает и страница перезагружается ... У меня есть в HTML следующее, с чем, я уверен, некоторые из вас знакомы ..

<textarea name="comments" maxlength="1024" rows="6" cols="45" wrap="VIRTUAL" id="field_comments" onblur="CheckField(name, 1, 0)"><?php echo $_POST['comments']; ?></textarea>

PHP выводит все, что было предварительно введено в форму, через echo ... Легко на самом деле. Это прекрасно работает, потому что мои JS и PHP ИСПОЛЬЗУЮТСЯ, чтобы убрать все, что не было a-zA-Z0-9 и т. Д. Мой друг говорит, что я должен разрешить вводить почти все и избегать этого. Без проблем. Я избегаю этого, но когда я помещаю одинарную или двойную кавычку (тестирование размещения странных вещей в поле), и она перерисовывает ее - она ​​сохраняет экранированные вещи. Например .. Я ввожу

«Дейв» и я возвращаюсь

\ 'Dave \'

и если я нажму еще раз, я получу ...

\\ 'Дейв \\' и так далее ...

Могу ли я вернуть его просто к «Dave» в поле формы, не написав для этого свою собственную функцию? Или это у меня так получается?

У меня есть образец тестовой страницы, показывающий, с чем я возился, если вы хотите увидеть пример, который я сделал.

http://newmainpcs.perrycs.com/testForm.php

Любая помощь будет отличной! Я пытался расшифровать их, перекодировать их ... Мой основной сайт - UTF-8 - пример не показывает мой основной сайт, но я написал этот крошечный testForm.php, чтобы попытаться выяснить это! лол. Я могу сделать это в HTML или PHP. PHP, вероятно, будет проще, потому что именно в этом и заключается суть РЕАЛЬНОЙ проверки, поскольку JS можно отключить. Я могу дать вам фрагменты кода, если хотите. Но я уверен, что вы получите то, что я пытаюсь сказать.

Спасибо за помощь!

Дэвид Перри PerryCS Perry Computer Services (Раньше был замечательным программистом на ассемблере ... это то, что происходит, когда вы не программируете более 17 лет). лол. Застрял на простых вещах.

Ответы [ 4 ]

2 голосов
/ 31 июля 2011

У вас либо magic_quotes активировано, либо вы слишком много убегаете с addslashes. Вместо этого используйте функцию цитирования слоя базы данных, т.е. mysqli_escape_string.

PHP 5.4 наконец избавился от магических кавычек - то, что вы тоже должны делать:)


Я думаю, что ваша проблема в том, что вы делаете слишком много вещей, чтобы сделать ваше приложение безопасным.

В основном вам нужно только:

  1. Ввод: вставка строки в базу данных, заключенная в кавычки с функцией экранирования слоя базы данных
  2. Выход: htmlspecialchars($row_from_database)

При этом вы защищены от SQL-инъекций (# 1) и XSS (# 2).

Магические кавычки пытаются сделать экранирование в # 1 для людей, которые не заботятся о экранировании ввода, но это только нерешительно (магические кавычки! = Цитирование слоя БД) - его можно использовать, даже если оно сложнее, чем без магических кавычек.

удаляя их

Как http://www.php.net/manual/en/security.magicquotes.what.php состояний,

Это идентично тому, что делает addlashes ().

Сначала проверьте, активны ли с get_magic_quotes_gpc(). Истина означает, что ваш ввод уже экранирован. Затем запустите stripslashes() для входных переменных, с которыми вы работаете.

0 голосов
/ 31 июля 2011

Базовый код:

session_start();
if (!validated) {
    $_SESSION['error'] = $_POST['message'];
} else {
    $s = mysql_real_escape_string($_POST['message']);
    mysql_query($s);
}

А потом в вашем HTML:

<textarea>
    <?php 
        if (!empty($_SESSION['error'])) {
        echo htmlspecialchars($_SESSION['error']);
        unset($_SESSION['error']);
    ?> 
</textarea>
0 голосов
/ 31 июля 2011

Для защиты ввода в SQL используйте функцию экранирования SQL, например mysql_real_escape_string.

Если вы хотите защитить ввод от XSS (при повторном отображении его в HTML), используйте htmlentities ().

Кроме того, проверьте, включена ли на вашем сервере функция gpc_magic_quotes с помощью phpinfo (). Если это так, отключите его в файле php.ini.

0 голосов
/ 31 июля 2011

Когда вы выводите текст в середину потока HTML, вы должны быть осторожны, чтобы закодировать этот текст в соответствии с тем, где именно он выводится в этом потоке HTML.

Для текста, выводимого в HTMLатрибут, вам нужна одна функция кодирования (например, замена " на \" и т. д.).Для вывода текста в виде текстового содержимого элемента HTML вам нужна другая функция кодирования (например, замена < на &lt; и т. Д.).

...