C++ функция IsFloat

На мой взгляд, лучший способ вообще запретить SQL-инъекцию в вашем PHP-приложении (или любом веб-приложении, если на то пошло) - это думать о архитектуре вашего приложения. Если единственный способ защитить от SQL-инъекции - не забудьте использовать специальный метод или функцию, которая делает The Right Thing каждый раз, когда вы разговариваете с базой данных, вы делаете это неправильно. Таким образом, это просто вопрос времени, пока вы не забудете правильно отформатировать свой запрос в какой-то момент вашего кода.

Принятие шаблона MVC и структуры, такой как CakePHP или CodeIgniter - это, вероятно, правильный путь: общие задачи, такие как создание безопасных запросов к базе данных, были решены и централизованно реализованы в таких рамках. Они помогают организовать ваше веб-приложение разумным образом и заставляют вас больше думать о загрузке и сохранении объектов, а не о безопасном построении отдельных SQL-запросов.

24
задан MasterHolbytla 8 March 2017 в 22:29
поделиться

10 ответов

Если Вы не можете использовать библиотечную функцию Повышения, можно записать собственную функцию isFloat как это.

#include <string>
#include <sstream>

bool isFloat( string myString ) {
    std::istringstream iss(myString);
    float f;
    iss >> noskipws >> f; // noskipws considers leading whitespace invalid
    // Check the entire string was consumed and if either failbit or badbit is set
    return iss.eof() && !iss.fail(); 
}
32
ответ дан Bill the Lizard 28 November 2019 в 22:49
поделиться

это зависит от уровня доверия, Вам нужно и куда входные данные прибывают из. Если данные прибывают от пользователя, необходимо быть более осторожными, по сравнению с импортированными данными таблицы, где Вы уже знаете, что все объекты являются или целыми числами или плаваниями, и только это - то, что необходимо дифференцировать.

, Например, одна из самых быстрых версий, просто проверил бы на присутствие "." и "eE" в нем. Но тогда, можно хотеть посмотреть, если остальное - все цифры. Пропустите пробел вначале - но не в середине, проверьте на единственный "." "eE" и т.д.

Таким образом, q& d быстрый взлом, вероятно, приведет к более сложному подобному regEx (или называют его или сканируют его самостоятельно), подход. Но тогда, как Вы знаете, что результат - хотя будучи похож на плавание - может действительно быть представлен в Вашей машине (т.е. попробовать 1.2345678901234567890e1234567890). Конечно, можно сделать regEx с "up-to-N" цифрами в мантиссе/экспоненте, но это - машина/ОС/компилятор или безотносительно конкретный, иногда.

Так, в конце, что и говорить, вероятно, необходимо призвать к преобразованию базовой системы и видеть то, что Вы получаете (исключение, бесконечность или NAN).

0
ответ дан blabla999 28 November 2019 в 22:49
поделиться

То, что Вы могли сделать, использовать istringstream и возвратить true на основе результата операции с потоками. Что-то вроде этого (предупреждение - я даже не скомпилировал код, это - только инструкция):

float potential_float_value;
std::istringstream could_be_a_float(MyString)
could_be_a_float >> potential_float_value;

return could_be_a_float.fail() ? false : true;
0
ответ дан Timo Geusch 28 November 2019 в 22:49
поделиться

Это - общий вопрос на ТАК. Взгляд этот вопрос для предложений (что вопрос обсуждает строку-> интервал, но подходы являются тем же).

Примечание: чтобы знать, может ли строка быть преобразована, в основном необходимо сделать преобразование для проверки на вещи как.

0
ответ дан Community 28 November 2019 в 22:49
поделиться

Вы могли использовать atof и затем иметь специальную обработку для 0.0, но я не думаю что количества как особенно хорошее решение.

0
ответ дан Douglas Leeder 28 November 2019 в 22:49
поделиться

Можно ли использовать методы, описанные в , Как я могу преобразовать строку для удвоения в C++? , и вместо того, чтобы бросить conversion_error, возврат false (указание на строку не представляет float), и true иначе.

1
ответ дан Community 28 November 2019 в 22:49
поделиться

[РЕДАКТИРОВАНИЕ: Зафиксированный для запрещения начального пробела и запаздывающей ерунды.]

#include <sstream>

bool isFloat(string s) {
    istringstream iss(s);
    float dummy;
    iss >> noskipws >> dummy;
    return iss && iss.eof();     // Result converted to bool
}

Вы могли легко превратить это в функцию, шаблонную на типе T вместо float. Это по существу, какое Повышение lexical_cast делает.

2
ответ дан j_random_hacker 28 November 2019 в 22:49
поделиться

Я предположил бы, что Вы захотите выполнить соответствие regex на входной строке. Я думал бы, что это может быть справедливо сложно для тестирования всех пограничных случаев.

Этот сайт имеет некоторую хорошую информацию о нем. Если Вы просто хотите пропустить до конца, это говорит: ^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$

, Который в основном имеет смысл, если Вы понимаете regex синтаксис.

2
ответ дан Greg Rogers 28 November 2019 в 22:49
поделиться

Можно понравиться lexical_cast Повышения (см. http://www.boost.org/doc/libs/1_37_0/libs/conversion/lexical_cast.htm ).

bool isFloat(const std::string &someString)
{
  using boost::lexical_cast;
  using boost::bad_lexical_cast; 

  try
  {
    boost::lexical_cast<float>(someString);
  }
  catch (bad_lexical_cast &)
  {
    return false;
  }

  return true;
}

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

12
ответ дан SmallChess 28 November 2019 в 22:49
поделиться

У меня возникло бы искушение игнорировать ведущие пробелы, поскольку это то же самое, что и функция atof :

Функция сначала отбрасывает как много пробельных символов по мере необходимости до тех пор, пока не будет найден первый непробельный символ. Затем, начиная с этого символа, берется как можно больше символов , которые являются действительными , следуя синтаксису, напоминающему синтаксис литералов с плавающей запятой , и {{1 }} интерпретирует их как числовое значение. Остальная часть строки после последнего действительного символа игнорируется и не влияет на поведение этого функция.

Чтобы соответствовать этому, мы должны:

bool isFloat(string s) 
{ 
    istringstream iss(s); 
    float dummy; 
    iss >> skipws >> dummy; 
    return (iss && iss.eof() );     // Result converted to bool 
} 
0
ответ дан 28 November 2019 в 22:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: