Общее правило состоит в том, чтобы запретить все и пропустить только допустимые символы, а не удалять то, что вы считаете недействительным.
Наиболее важным аспектом является то, что вы делаете с этими строками впоследствии. Если у вас есть строка позже, говоря:
tsql = "SELECT * FROM Users WHERE Username='" . $username . "' AND "
тогда это основная область риска, хотя mysql_real_escape_string
этого следует избегать.
При использовании библиотек или функций, которые позволяют передавать параметры в базу данных, никогда не может быть никакого внедрения SQL, поскольку параметры базы данных не могут быть интерпретированы в TSQL, оставляя только внедрение PHP / Javascript в качестве возможности.
В основном, посмотрите на функции bind_param
как единственную истинную защиту.
Всякий раз, когда данные отображаются на экране, рассмотрите что-то вроде htmlspecialchars()
, чтобы преобразовать их в HTML. Нет смысла хранить что-то сбежавшее, если позже оно вам понадобится, а необработанные данные в базе данных не представляют опасности, если вы всегда считаете это необработанным.
Таким образом, код, который вы перечисляете, может или не может уменьшить внедрение, но есть слишком много комбинаций, чтобы исключить каждую возможность, включая аспекты, такие как пользователь, использующий одинарные кавычки (вы заменяете только двойные кавычки).
Все вводимые пользователем данные потенциально опасны. Не стесняйтесь хранить его в сыром виде, но при каждом ИСПОЛЬЗОВАНИИ убедитесь, что ваши операции защищены, используя один из указанных выше вариантов.
Мой PHP немного устарел, но точно такие же правила применяются к SQL Server, Oracle, .NET, Java и любой другой базе данных / языку.