Как международный стандартный запрос к базе данных, SQL-операторы широко используются в различных средах программирования. Как зрелая и стабильная система, логин пользователя и проверка пароля крайне важны. В своей ежедневной программной работе я обнаружил, что многие программисты используют SQL-операторы для проверки паролей пользователей с помощью такого оператора:
sql="Выбрать * из пользовательской таблицы, где name='"+name+"' и password='"+password+"'"
Имя и пароль — это имена пользователей и пароли, введённые пользователем, а вышеуказанные выписки выполняются для проверки легитимности пользователя и пароля. Однако при анализе можно выяснить, что в вышеуказанных утверждениях есть фатальные лазейки. Когда мы вводим следующую строку в имя пользователя: 111'or'1=1, а затем вводим пароль небрежно, мы устанавливаем его на aaaaa. После замены переменной оператор SQL становится следующей строкой:
sql="Выбрать * из пользовательской таблицы, где name='111'or'1=1' и password='aaaa'
Всем известно, что когда оператор select оценивает условия запроса, он игнорирует следующие операции и (и) при встрече с операциями или (или), и значение 1=1 в вышеуказанном утверждении всегда верно, что означает, что независимо от значения, введённого в пароль, он может пройти вышеуказанную проверку пароля! Решение этой проблемы очень простое, существует множество методов, наиболее распространённый — оценка легитимности пользователя и пароля, введённого пользователем, до проведения проверки, а специальные символы, такие как одиночные кавычки и знаки равенства, не допускаются.
Вышеуказанные проблемы, хотя и кажутся простыми, существуют. Например, ранняя версия знаменитой онлайн-игры «Smiling Proud Jianghu» в Интернете имела такую проблему, и автор также тщательно проанализировал некоторые из предыдущих программ после прочтения отчёта о уязвимостях этой игры, и таких лазеек было немало. Это действительно должно быть нашим вниманием. Это также выявляет недостаток опыта программирования и осведомлённости о безопасности у молодых программистов, включая автора. В то же время это напоминает, что программистам следует полностью учитывать безопасность программы при проектировании и не быть небрежными, иначе незначительное упущение может привести к серьёзным последствиям.
|