На мой взгляд, лучший способ вообще запретить SQL-инъекцию в вашем PHP-приложении (или любом веб-приложении, если на то пошло) - это думать о архитектуре вашего приложения. Если единственный способ защитить от SQL-инъекции - не забудьте использовать специальный метод или функцию, которая делает The Right Thing каждый раз, когда вы разговариваете с базой данных, вы делаете это неправильно. Таким образом, это просто вопрос времени, пока вы не забудете правильно отформатировать свой запрос в какой-то момент вашего кода.
Принятие шаблона MVC и структуры, такой как CakePHP или CodeIgniter - это, вероятно, правильный путь: общие задачи, такие как создание безопасных запросов к базе данных, были решены и централизованно реализованы в таких рамках. Они помогают организовать ваше веб-приложение разумным образом и заставляют вас больше думать о загрузке и сохранении объектов, а не о безопасном построении отдельных SQL-запросов.
Если Вы не можете использовать библиотечную функцию Повышения, можно записать собственную функцию 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();
}
это зависит от уровня доверия, Вам нужно и куда входные данные прибывают из. Если данные прибывают от пользователя, необходимо быть более осторожными, по сравнению с импортированными данными таблицы, где Вы уже знаете, что все объекты являются или целыми числами или плаваниями, и только это - то, что необходимо дифференцировать.
, Например, одна из самых быстрых версий, просто проверил бы на присутствие "." и "eE" в нем. Но тогда, можно хотеть посмотреть, если остальное - все цифры. Пропустите пробел вначале - но не в середине, проверьте на единственный "." "eE" и т.д.
Таким образом, q& d быстрый взлом, вероятно, приведет к более сложному подобному regEx (или называют его или сканируют его самостоятельно), подход. Но тогда, как Вы знаете, что результат - хотя будучи похож на плавание - может действительно быть представлен в Вашей машине (т.е. попробовать 1.2345678901234567890e1234567890). Конечно, можно сделать regEx с "up-to-N" цифрами в мантиссе/экспоненте, но это - машина/ОС/компилятор или безотносительно конкретный, иногда.
Так, в конце, что и говорить, вероятно, необходимо призвать к преобразованию базовой системы и видеть то, что Вы получаете (исключение, бесконечность или NAN).
То, что Вы могли сделать, использовать 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;
Это - общий вопрос на ТАК. Взгляд этот вопрос для предложений (что вопрос обсуждает строку-> интервал, но подходы являются тем же).
Примечание: чтобы знать, может ли строка быть преобразована, в основном необходимо сделать преобразование для проверки на вещи как.
Вы могли использовать atof и затем иметь специальную обработку для 0.0
, но я не думаю что количества как особенно хорошее решение.
Можно ли использовать методы, описанные в , Как я могу преобразовать строку для удвоения в C++? , и вместо того, чтобы бросить conversion_error
, возврат false
(указание на строку не представляет float
), и true
иначе.
[РЕДАКТИРОВАНИЕ: Зафиксированный для запрещения начального пробела и запаздывающей ерунды.]
#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 делает.
Я предположил бы, что Вы захотите выполнить соответствие regex на входной строке. Я думал бы, что это может быть справедливо сложно для тестирования всех пограничных случаев.
Этот сайт имеет некоторую хорошую информацию о нем. Если Вы просто хотите пропустить до конца, это говорит:
^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$
, Который в основном имеет смысл, если Вы понимаете regex синтаксис.
Можно понравиться 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, чтобы не нуждаться в Повышении, но откровенно говоря, Повышение просто слишком хорошо для игнорирования.
У меня возникло бы искушение игнорировать ведущие пробелы, поскольку это то же самое, что и функция atof
:
Функция сначала отбрасывает как много пробельных символов по мере необходимости до тех пор, пока не будет найден первый непробельный символ. Затем, начиная с этого символа, берется как можно больше символов , которые являются действительными , следуя синтаксису, напоминающему синтаксис литералов с плавающей запятой , и {{1 }} интерпретирует их как числовое значение. Остальная часть строки после последнего действительного символа игнорируется и не влияет на поведение этого функция.
Чтобы соответствовать этому, мы должны:
bool isFloat(string s)
{
istringstream iss(s);
float dummy;
iss >> skipws >> dummy;
return (iss && iss.eof() ); // Result converted to bool
}