Это безопасный способ структурировать mysql_query в PHP

Я попробовал и попытался достигнуть Внедрения SQL путем создания пользовательских запросов к серверу за пределами Firefox.

В php все переменные передаются в запрос в строке как это.

Отметьте этим этапом, $ _POST не был затронут.

mysql_query('INSERT INTO users (password, username) VALUES(' . sha1($_POST['password']) . ',' . $_POST['username'] . '));

Это - безопасный способ внести изменение?

5
задан Supernovah 12 May 2010 в 11:06
поделиться

6 ответов

Вы обязательно должны избежать имени пользователя с mysql_real_escape_string.

Конечно, лучшим решением было бы использовать подготовленные заявления. Таким образом, разделение синтаксиса запроса и данных производится на уровне mysql API.

И, как указывали другие, ценности должны быть абсолютно окружены кавычками. Особенно текстовые.

3
ответ дан 13 December 2019 в 19:23
поделиться

то, что вы там делаете, опасно, так как кто-то может отправить POST-запрос со злым именем пользователя. вы можете либо проверить каждый параметр и избежать его, дополнительно вы можете использовать mysqli ( http://php.net/manual/en/book.mysqli.php ), и свяжите параметры с помощью prepare + bind.

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

также ознакомьтесь с этим вопросом: Как предотвратить внедрение SQL в приложениях LAMP?

3
ответ дан 13 December 2019 в 19:23
поделиться

Посмотрите на http://php.net/mysqli.real-escape-string, добавление этого значения ко всем входящим значениям должно помочь сделать его более безопасным.

2
ответ дан 13 December 2019 в 19:23
поделиться

Проверив ваш код, я удивлен, что он вообще работает, когда вы не заключаете в кавычки вставляемые литералы - вы генерируете код типа:

INSERT INTO user (password, username) VALUES (abc1234fg00000, admin);

Поэтому он будет выдавать ошибку каждый раз. Если предположить, что это просто опечатка, то

INSERT INTO user (password, username) VALUES (abc1234fg00000, admin);

Расширение mysql ограничивает ваши возможности по проведению инъекционных атак, позволяя выполнять только один запрос за вызов. Кроме того, возможности инъекционной атаки на оператор INSERT ограничены. Кроме того, тот факт, что вы изменяете представление в нейтральный формат перед вставкой в оператор insert, означает, что это не является потенциальной возможностью для такой атаки. Однако ваш код должен упасть, если кто-то ПОСТИТ имя пользователя, содержащее одну кавычку (если этого не произойдет, значит, у вас включена функция magic_quotes, которая устарела).

Но если вы примените тот же метод для проверки учетной записи, то вы будете широко открыты для инъекционных атак - рассмотрим

"SELECT 1 
FROM users
WHERE username='" . $_POST['username'] . "'
AND password='" . sha1($_POST['username'] . "';";

Если $_POST['username'] содержит "admin' OR 1 ", то ваша система скомпрометирована.

Вы должны всегда использовать mysql_real_escape_string(), если только вы не сделали данные безопасными с помощью другой функции (например, sha1, bas64_encode....bUT NOT addslashes)

C.

2
ответ дан 13 December 2019 в 19:23
поделиться

это небезопасно, если только не включена директива конфигурации magic_quotes_gpc.
var_dump(ini_get('magic_quotes_gpc')); или phpinfo(); могут показать вам фактическое значение

Обратите внимание, что эта директива грязная, устаревшая и всеми ненавидимая. И из-за нее некоторые пароли не будут работать.

1
ответ дан 13 December 2019 в 19:23
поделиться

Иногда я думаю, не найдут ли меня в доме престарелых, кричащего "BIND VARIABLES" медсестрам, когда они проходят мимо.

Люди, сейчас 2010 год, а не 1995.

СВЯЖИТЕ ПЕРЕМЕННЫЕ!

СВЯЖИТЕ ПЕРЕМЕННЫЕ!

0
ответ дан 13 December 2019 в 19:23
поделиться
Другие вопросы по тегам:

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