Безопасный PHP-запрос? - PullRequest
       2

Безопасный PHP-запрос?

2 голосов
/ 17 июня 2011

У меня есть страница для активации пользователей, которые нажимают на ссылку активации в электронном письме, которое я им отправляю, электронное письмо содержит URL-адрес, который публикует там адрес электронной почты, используя метод GET, мой код следующий, но я спрашиваю, является ли это безопаснымметод или есть какой-то способ это можно улучшить?Спасибо

$username = $_GET['email']; 

mysql_query("UPDATE users SET active = 'yes'
WHERE email = '$username'") or die('oops!');

echo "<meta http-equiv=\"refresh\" content=\"0;URL=/index.php?msg=active\">";

Ответы [ 10 ]

5 голосов
/ 17 июня 2011

Это не лучший способ активации электронной почты. Любой желающий может зарегистрироваться по поддельному адресу электронной почты и создать свой собственный запрос GET для его активации. Вместо этого вы должны использовать уникальный хеш, который невозможно угадать. Кроме того, вам нужно экранировать оператор SQL с помощью mysql_real_escape_string.

4 голосов
/ 17 июня 2011

Рассмотрим следующее значение $ _GET ['email']:

"'; DELETE FROM users WHERE 1 or username = ''"

Если ваш пользователь отправит это значение, ваш скрипт выполнит следующую инструкцию SQL:

UPDATE users SET active = 'yes' WHERE email = ''; DELETE FROM users WHERE 1 or username = ''"

Вам нужно будет отфильтровать введенные данные, чтобы удалить символы, которые имеют значение в настройке SQL (\ 'в этом примере).

Вы можете защитить свои запросы, используя подготовленные операторы PDO, или фильтруя, используя mysql_real_escape_string ().

Кроме того, вы хотите создать уникальное неуловимое значение для отправки пользователю и ожидать, что это значение вернется из $ _GET.Если вы разрешите пользователю указывать текстовый адрес электронной почты, злоумышленник может активировать любой адрес электронной почты.Для создания уникальных значений можно использовать md5 () или другие хеш-функции.

3 голосов
/ 17 июня 2011

Это совсем не безопасно. Вам нужно позвонить mysql_real_escape_string() на ваш $username

$username = mysql_real_escape_string($_GET['email']); 

Лучше было бы использовать PDO и передать переменную через подготовленный оператор .

2 голосов
/ 17 июня 2011

Представьте на мгновение, что я хочу сделать что-то вредоносное для вашего сайта, теперь предположим, что я манипулирую вашим URL-адресом и меняю .php?email=arron@arronchapman.com на .php?email=1';SHOW TABLES или, может быть, даже .php?email=1';DROP TABLE USERS;, что было бы не очень хорошо, если бы это было?

Самый простой способ предотвратить это - заключить все ваши входные значения в функцию mysql_real_escape_string , это сделает ваш запрос похожим на: mysql_query("UPDATE users SET active = 'yes' WHERE email = '" . mysql_real_escape_string($username) .'") or die('oops!');

Я хотел бы познакомить вас с моим другом Бобби Столовым (от XKCD ): enter image description here

2 голосов
/ 17 июня 2011

Это не безопасно. Вы должны либо использовать хранимые процедуры, либо экранировать sql .

2 голосов
/ 17 июня 2011

Это определенно не безопасно. Вам нужно экранировать любые потенциально опасные символы (подумайте, если кто-то вписал 'в свой адрес электронной почты) через mysql_real_escape_string.

2 голосов
/ 17 июня 2011

Нет, это уязвимо для внедрения SQL.Я могу поместить ' в $_GET['email'] и выполнить любой запрос, который мне нравится.

1 голос
/ 17 июня 2011

Помимо проблем SQL-инъекций, о которых упоминали все остальные, у вас есть проблема, когда люди могут подделать собственную ссылку активации и обойти необходимость получения электронной почты.

Распространенным решением является включение некоторыхсортировать хеш-значение в URL, который вы проверяете перед активацией.

Например -

Создать таблицу для активаций.Когда пользователь регистрируется, введите адрес электронной почты (или другой уникальный идентификатор) и некоторое непостоянное, секретное значение.Это может быть случайное число, временная метка и соль, или подобное.

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

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

Для кого-то будет намного сложнее подделать ссылку активации.

0 голосов
/ 17 июня 2011

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

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

Я рекомендую зашифровать электронную почту и использовать зашифрованную версию электронной почты в URL.

Поэтому, когда вы отправляете им ссылку:

$enc_key = 'SOME KEY I USE';
$email = mysql_real_escape_string($email);
$result = $db->query("SELECT AES_ENCRYPT('$email', '$enc_key') as email");
$enc_email = mysql_fetch_assoc($result);
$enc_email = $enc_email['email'];
$url = "http://www.example.com/confirm.html?key=$enc_email";

, чтобы проверить, подтвердил ли пользователь:

$enc_key = 'SOME KEY I USE';
$enc_email = mysql_real_escape_string($_GET['key']);
$result = $db->query("UPDATE users SET active = 1 WHERE AES_ENCRYPT(email, '$enc_key') = '$enc_email'");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...