Nano Hash - криптовалюты, майнинг, программирование

Проверка ввода формы PHP и запроса БД

(переименовал это из «Проверка непустого запроса в запросе GET?», Поскольку к тому времени, когда я закончил писать, это не стало важной частью моего вопроса.)

Я помогаю другу специалисту по генеалогии с простым скриптом поиска в БД. Ничего страшного, если пользователи оставят все поля ввода, кроме одного, пустыми. Я хотел бы различать 3 случая:

    1. someone browsing to the URL with no query parameters
    1. form submission with all fields empty
    1. form submission with at least one field non-empty

Я, вероятно, могу относиться к 1 и 2 одинаково; это не должно быть причудливым.

Код ранее имел if (isset($_POST['submit'])) и, по-видимому, работал. Я хочу использовать запрос GET, чтобы люди могли добавлять результаты поиска в закладки. Сначала я предположил, что могу просто проверить $_GET['submit'], но он никогда не устанавливается. Я предполагаю, что для запроса GET мне понадобится скрытое текстовое поле с именем submit в форме для создания ?submit= в URL-адресе запроса? Дальнейшее загромождение URL-адреса - это не то, чего я хочу, поэтому, пожалуй, я откажусь от этой идеи.

Google нашел МНОГО совпадений для isset($_GET['submit']) на форумах и так далее. Обычно другой плохой код в вопросе привлекал внимание людей, поэтому я никогда не встречал обсуждения фактического использования этой конструкции с GET запросами. Итак, в качестве отступления от основного вопроса, мне любопытно, как isset($_GET['submit']) стал полураспространенным. Это обычно просто из-за того, что наивные люди вроде меня меняют POST на GET?

Поскольку я новичок в PHP, я был бы очень признателен, если бы кто-нибудь мог указать на какие-либо другие проблемы в этом фрагменте скрипта поиска. Я почти уверен, что он широко открыт для SQL-инъекций, поэтому мне нужно использовать выходные данные escape-функции, чтобы их дезинфицировать. Обычно также проверяют длину входных строк? Форма, которая отправляет запросы к этому сценарию, имеет ограничения по длине.

(Я знаю, что SO не приветствует вопросы проверки кода, поэтому, я думаю, не стесняйтесь игнорировать эту часть моего вопроса.)

msearchresultlist.php:
получает запросы типа ...php/?Surname=Cordes&MaidenName=&GivenName=&Obit= из формы (в конце этого блока кода). Он распечатывает таблицу совпадений.
Одна запись в каждой строке является гиперссылкой на страницу сведений об этом некрологе.

<?PHP
... check that user is logged in to members area ...

if (some_condition_discussed_above) {
    ... open the DB, with hard-coded username/password :( ...

    $GivenName = $_GET['GivenName'];
    if ($GivenName == "")
        {$GivenName = '%';}

    $Surname = $_GET['Surname'];
    if ($Surname == "")
        {$Surname = '%';}

    $MaidenName = $_GET['MaidenName'];
    if ($MaidenName == "")
        {$MaidenName = '%';}

    $Obit = $_GET['Obit'];

    $result = mysql_query ("SELECT * FROM obits
    WHERE GivenName LIKE '%$GivenName%'
    AND MaidenName LIKE '$MaidenName%'
    AND Surname LIKE '$Surname%'
    AND Obit LIKE '%$Obit%'
    ORDER BY Surname ASC, GivenName ASC");
} else {
    $noquery = true;
}
?>


<!DOCTYPE html>
<html lang="en">
... some stuff on the page


<?php

if ($noquery) {
    print "<p>No query found.</p>";
} else {

    print "<table width='600' cellpadding='10px'>";

    if($row = mysql_fetch_array($result)) {
    do {

    print "<tr>";
        print "<td>".$row['Surname']."</td>";
        print "<td>".$row['MaidenName']."</td>";
            print "<td>" . '<a href="msearchresultform.php?ID='.$row['ID'].'">'.$row['GivenName'].'</a>'. "</td>";

        print "<td>".$row['DOD']."</td>";
        print"</tr>";
    } while($row = mysql_fetch_array($result));


---- the form, on another page:
<form action=msearchresultlist.php method=GET>

When searching for a name with an apostrophe, such as O'Neil, use a double apostrophe, ie. O''Neil, not a quote but a double apostrophe. </br>
</br>

Search for:
<p>Last Name: <input type=text name=Surname size=15 maxlength=15>
<p>Maiden Name: <input type=text name=MaidenName size=15 maxlength=15>
<p>Given Name: <input type=text name=GivenName size=15 maxlength=15>
<p>Use % in front of each word in the Obit field, ie %Bridgewater% %Joudrey%
<p>Obit: <input type=text name=Obit size=50 maxlength=50>
<p>
<input type=submit>

Я знаю, что поиск может сбросить всю базу данных, выполнив поиск по одному подстановочному знаку или что-то в этом роде. Я думаю, что это желаемый результат моего друга, но я не хочу, чтобы это произошло случайно. то есть только в том случае, если пользователь явно ищет по подстановочному знаку, а не просто отправляет пустую форму. Этот сценарий расширенного поиска доступен только для аутентифицированных пользователей. Существует общедоступная версия только для фамилий (на nsobits.ca)

В любом случае, на случай, если неясно, о чем я спрашиваю: могу ли я сделать что-то умное, чтобы проверить, было ли что-то заполнено в форме? Как некоторый синтаксис, который проверяет, имеет ли $_GET значение ненулевой длины по крайней мере для одного из своих ключей? Или мне просто сделать if ($GivenName || $Surname || ...)?

06.07.2015

  • да, он широко открыт для атак SQL-инъекций. вам следует использовать полнотекстовый индекс для такого поиска и обязательно ознакомиться с методами защиты от инъекций: bobby-tables.com). например прекратите использовать функции mysql_*() и переключитесь на PDO + подготовленные операторы с заполнителями 07.07.2015
  • Здесь много полезного, что делает вопрос в целом слишком широким для переполнения стека. Вы правы в том, что можете использовать Code Review, но проверьте их справочный центр, прежде чем публиковать там. Прежде чем делать что-либо еще, возможно, стоит прочитать руководство по PHP. по работе с формами. 07.07.2015
  • Да, извините, у меня СДВГ, и я никогда не могу остановиться на одном простом вопросе. Мне всегда приходится усложнять! 07.07.2015
  • Я не понимаю, почему вас так волнует, будет заполнено $_GET['submit'] или нет. Я согласен с вашим более ранним заявлением о том, что варианты использования 1 и 2 одинаковы, если вам все равно, попал ли кто-то на страницу поиска через форму или другим способом. Это устранило бы необходимость в каком-либо значении $_GET['submit']. 07.07.2015
  • @MikeBrant: да, к тому времени, когда я подумал о необходимости проверки входных данных для случаев, когда пользователь отправлял форму, я пришел к такому же выводу. Мне все еще любопытно, почему вы видите эту конструкцию $_GET['submit'] в php-вопросах по всему Интернету. Действительно ли люди пишут формы со скрытыми элементами только для того, чтобы иметь submit= в запросе? Что случилось с этим? 07.07.2015
  • Обновление этой загадки: ChristianF разгадал ее в своем ответе. 07.07.2015

Ответы:


1

Вы можете использовать:

if(isset($_GET['variableName']) AND !empty($_GET['variableName']))

Это проверит, что он установлен и не является пустой строкой.

В качестве альтернативы эта функция будет проходить через $_GET (который является массивом) и возвращать true, если находит какие-либо незаполненные значения:

function fieldsEmpty(){
    foreach($_GET as $key => $value){
        if(empty($value)){
            return true;
        }
    }
}
if(fieldsEmpty()){
    // handle error
}
06.07.2015
  • На самом деле мой вопрос был о том, когда $_GET['submit'] КОГДА-ЛИБО будет установлен. Он не устанавливается даже при отправке запроса. О, я забыл включить html для формы в свой вопрос. Но я предполагаю, что он будет установлен только в том случае, если вы сконструируете форму так, чтобы URL-адрес запроса был длиннее и включал ?submit=Submit или что-то в этом роде. fieldsEmpty() это то, что я думал, что я мог бы в конечном итоге сделать, да. Спасибо. 07.07.2015
  • Какой атрибут метода в форме вы используете? Полезная статья: w3schools.com/tags/att_form_method.asp 07.07.2015
  • Извлек вопрос, чтобы включить форму HTML, размещенную в конце блока кода. Мне нравится, как говорят, что инструкции используют две одиночные цитаты для такого имени, как О'Нил. Возможно, в противном случае вы вводите SQL-инъекцию в свое поле. ›.‹ 07.07.2015
  • $_GET['submit'] будет установлен только в том случае, если бы у вас было поле, и в этом нет смысла. Вы можете использовать !empty($_GET), чтобы проверить, были ли переданы какие-либо параметры запроса. 07.07.2015

  • 2
  • стиль кодирования: по крайней мере, код внутри управления потоком имеет отступ, в отличие от того, что было до того, как я его коснулся. ›.‹ Спасибо за подробное рассмотрение кода. Также спасибо за решение загадки submit=! Я был очень озадачен, почему это не сработало для меня и пары других плакатов, которые я видел, но это казалось обычным выражением. 07.07.2015
  • А, и мне нравится ваше изменение, когда вы помещаете код в верхней части файла в функцию, а не устанавливаете глобальную переменную. Я не хотел просто перемещать код, где использовался результат, но я также думал, что мой глобальный был уродливым. Да, все это выглядит отлично. Это, вероятно, просто разовая попытка для меня, поскольку создание форм — это не то, чем я обычно занимаюсь, поэтому чрезвычайно полезно иметь некоторый код, который работает в правильном направлении. 07.07.2015
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..