Это безопасный способ структурировать mysql_query в PHP - PullRequest
5 голосов
/ 12 мая 2010

Я пытался и пытался внедрить SQL, делая пользовательские запросы к серверу вне Firefox.

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

Обратите внимание, что на этом этапе $ _POST не затрагивался.

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

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

Ответы [ 6 ]

3 голосов
/ 12 мая 2010

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

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

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

3 голосов
/ 12 мая 2010

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

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

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

2 голосов
/ 12 мая 2010

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

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

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

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

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

"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 .... но НЕ добавляет косые черты)

С

2 голосов
/ 12 мая 2010

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

1 голос
/ 12 мая 2010

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

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

0 голосов
/ 14 мая 2010

Я иногда удивляюсь, найдут ли они меня в доме престарелых, кричащим "СВЯЗЬ ПЕРЕМЕННЫХ" на медсестер, когда они проходят мимо.

Это 2010 человек, а не 1995.

ПЕРЕМЕННЫЕ СВЯЗИ!

ПЕРЕМЕННЫЕ СВЯЗИ!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...