Вопрос
Мне нужен следующий скрипт аутентификации. Я слаб в php / pdo, поэтому я не знаю, как запросить количество строк, равное единице, а затем установить идентификаторы сеанса из результатов запроса. Мне нужно не только установить $ _SESSION ['userid'], но также ['company'] и ['security_id'], а также результаты. Р>
вот что у меня есть:
$userid = Мне нужен следующий скрипт аутентификации. Я слаб в php / pdo, поэтому я не знаю, как запросить количество строк, равное единице, а затем установить идентификаторы сеанса из результатов запроса. Мне нужно не только установить $ _SESSION ['userid'], но также ['company'] и ['security_id'], а также результаты. Р>
вот что у меня есть:
<*>
Дополнительная информация:
Браузер: Firefox
POST['userid'];
$password = Мне нужен следующий скрипт аутентификации. Я слаб в php / pdo, поэтому я не знаю, как запросить количество строк, равное единице, а затем установить идентификаторы сеанса из результатов запроса. Мне нужно не только установить $ _SESSION ['userid'], но также ['company'] и ['security_id'], а также результаты. Р>
вот что у меня есть:
<*>
Дополнительная информация:
Браузер: Firefox
POST['pass'];
if ( $userid != "" || $password != "" )
{
$sql = "SELECT * FROM contractors WHERE userid = '" . $userid . "' AND password = '" . $password . "'";
$result = $dbh->query( $sql );
} else
{
echo "login failed. Your fingers are too big";
}
Дополнительная информация: Браузер: Firefox
Решение
НЕ ИСПОЛЬЗУЙТЕ ЭТОТ КОДЕКС!
У вас там очень серьезная инъекция SQL. Каждый вводимый пользователем пользовательский файл cookie, CGI или где угодно , должен быть обработан , прежде чем он будет использован в операторе SQL. Я мог бы легко взломать эту систему, попытавшись войти с именем пользователя, например:
user'; UPDATE contractors SET password = '1337'
... после чего я могу войти как любой. Извините, если я звучу агрессивно, но то, что делает этот код, это как забыть запереть входную дверь в вашу компанию, которая, вероятно, даже не имеет системы сигнализации.
Обратите внимание, что не имеет значения, действительно ли ввод поступает от пользователя (возможно, он предварительно заполнен, скрыт от). С точки зрения безопасности, все , поступающее из-за пределов , должно считаться содержащим злонамеренный ввод пользователем.
Насколько я знаю, вам нужно использовать цитату
функция PDO для правильной очистки строки. (В mysql это можно сделать с помощью mysql_real_escape_string ()
.) Я не эксперт по PDO, заметьте, кто-нибудь, пожалуйста, исправьте, если я ошибаюсь. р>
Также, вероятно, вам не следует хранить какие-либо пароли непосредственно в базе данных, а использовать хеш-функцию для создания маскированного пароля, а также создавать хеш из предоставленного пользователем пароля и сопоставлять хеш-коды. Вы можете использовать функцию PHP hash
для этого.
Что касается других вопросов, я не знаю, является ли подход, который вы используете в SQL SELECT, лучшим подходом. Я бы просто выбрал соответствующий пароль пользователя и попытался сопоставить его с программой. Я не думаю, что в методе, который вы используете, есть какая-либо ошибка, но это не кажется таким логичным, и, таким образом, есть большая вероятность того, что me пропустит какую-то ошибку - которая в случае пароли и логины создадут окно для эксплойтов.
Чтобы сделать это по-своему, вы должны заметить, что результат, который вы получаете от PDO query
является PDOStatement
, который, похоже, не имеет надежной функции для прямого подсчета суммы строк результатов. Вам нужно использовать fetchAll
, который возвращает массив строк и считать это. Однако, как я уже сказал, мне все кажется, что он открыт для сбоев, поэтому я чувствовал бы себя безопаснее, проверяя пароль в коде. На мой вкус слишком большое расстояние от фактического сопоставления паролей, в таком критическом для безопасности месте.
Таким образом, чтобы получить полученный пароль для идентификатора пользователя, вы можете использовать PDOStatement. code> fetch () , которая возвращает содержимое столбца из результата. Например, используйте PDO :: FETCH_ASSOC
, чтобы получить их в ассоциативном массиве на основе имен столбцов.
Вот как это исправить:
$userid_dirty =
, которая возвращает содержимое столбца из результата. Например, используйтеНЕ ИСПОЛЬЗУЙТЕ ЭТОТ КОДЕКС!
У вас там очень серьезная инъекция SQL. Каждый вводимый пользователем пользовательский файл cookie, CGI или где угодно , должен быть обработан , прежде чем он будет использован в операторе SQL. Я мог бы легко взломать эту систему, попытавшись войти с именем пользователя, например:
user'; UPDATE contractors SET password = '1337'
... после чего я могу войти как любой. Извините, если я звучу агрессивно, но то, что делает этот код, это как забыть запереть входную дверь в вашу компанию, которая, вероятно, даже не имеет системы сигнализации.
Обратите внимание, что не имеет значения, действительно ли ввод поступает от пользователя (возможно, он предварительно заполнен, скрыт от). С точки зрения безопасности, все , поступающее из-за пределов , должно считаться содержащим злонамеренный ввод пользователем.
Насколько я знаю, вам нужно использовать
цитату
функция PDO для правильной очистки строки. (В mysql это можно сделать с помощьюmysql_real_escape_string ()
.) Я не эксперт по PDO, заметьте, кто-нибудь, пожалуйста, исправьте, если я ошибаюсь. р>Также, вероятно, вам не следует хранить какие-либо пароли непосредственно в базе данных, а использовать хеш-функцию для создания маскированного пароля, а также создавать хеш из предоставленного пользователем пароля и сопоставлять хеш-коды. Вы можете использовать функцию PHP
hash
для этого.Что касается других вопросов, я не знаю, является ли подход, который вы используете в SQL SELECT, лучшим подходом. Я бы просто выбрал соответствующий пароль пользователя и попытался сопоставить его с программой. Я не думаю, что в методе, который вы используете, есть какая-либо ошибка, но это не кажется таким логичным, и, таким образом, есть большая вероятность того, что me пропустит какую-то ошибку - которая в случае пароли и логины создадут окно для эксплойтов.
Чтобы сделать это по-своему, вы должны заметить, что результат, который вы получаете от PDO
query
являетсяPDOStatement
, который, похоже, не имеет надежной функции для прямого подсчета суммы строк результатов. Вам нужно использоватьfetchAll
, который возвращает массив строк и считать это. Однако, как я уже сказал, мне все кажется, что он открыт для сбоев, поэтому я чувствовал бы себя безопаснее, проверяя пароль в коде. На мой вкус слишком большое расстояние от фактического сопоставления паролей, в таком критическом для безопасности месте.Таким образом, чтобы получить полученный пароль для идентификатора пользователя, вы можете использовать PDOStatement. code> fetch ()
PDO :: FETCH_ASSOC
, чтобы получить их в ассоциативном массиве на основе имен столбцов.Вот как это исправить:
<*>Конечно, код можно немного очистить, но это должно объяснить, что нужно сделать. Обратите внимание, что поскольку пароль хешируется и никогда не используется в SQL , он фактически не нуждается в очистке. Но я оставил его там на всякий случай, поскольку в исходном коде он был использован в запросе.
Обратите внимание, что весь код, касающийся хранения паролей, необходимо изменить, чтобы хранить хэш вместо пароля. Кроме того, было бы очень полезно использовать соль , добавленную к паролю. до хеширования.
Также я предоставилPOST['userid']; $password_dirty =
НЕ ИСПОЛЬЗУЙТЕ ЭТОТ КОДЕКС!
У вас там очень серьезная инъекция SQL. Каждый вводимый пользователем пользовательский файл cookie, CGI или где угодно , должен быть обработан , прежде чем он будет использован в операторе SQL. Я мог бы легко взломать эту систему, попытавшись войти с именем пользователя, например:
user'; UPDATE contractors SET password = '1337'
... после чего я могу войти как любой. Извините, если я звучу агрессивно, но то, что делает этот код, это как забыть запереть входную дверь в вашу компанию, которая, вероятно, даже не имеет системы сигнализации.
Обратите внимание, что не имеет значения, действительно ли ввод поступает от пользователя (возможно, он предварительно заполнен, скрыт от). С точки зрения безопасности, все , поступающее из-за пределов , должно считаться содержащим злонамеренный ввод пользователем.
Насколько я знаю, вам нужно использовать
цитату
функция PDO для правильной очистки строки. (В mysql это можно сделать с помощьюmysql_real_escape_string ()
.) Я не эксперт по PDO, заметьте, кто-нибудь, пожалуйста, исправьте, если я ошибаюсь. р>Также, вероятно, вам не следует хранить какие-либо пароли непосредственно в базе данных, а использовать хеш-функцию для создания маскированного пароля, а также создавать хеш из предоставленного пользователем пароля и сопоставлять хеш-коды. Вы можете использовать функцию PHP
hash
для этого.Что касается других вопросов, я не знаю, является ли подход, который вы используете в SQL SELECT, лучшим подходом. Я бы просто выбрал соответствующий пароль пользователя и попытался сопоставить его с программой. Я не думаю, что в методе, который вы используете, есть какая-либо ошибка, но это не кажется таким логичным, и, таким образом, есть большая вероятность того, что me пропустит какую-то ошибку - которая в случае пароли и логины создадут окно для эксплойтов.
Чтобы сделать это по-своему, вы должны заметить, что результат, который вы получаете от PDO
query
являетсяPDOStatement
, который, похоже, не имеет надежной функции для прямого подсчета суммы строк результатов. Вам нужно использоватьfetchAll
, который возвращает массив строк и считать это. Однако, как я уже сказал, мне все кажется, что он открыт для сбоев, поэтому я чувствовал бы себя безопаснее, проверяя пароль в коде. На мой вкус слишком большое расстояние от фактического сопоставления паролей, в таком критическом для безопасности месте.Таким образом, чтобы получить полученный пароль для идентификатора пользователя, вы можете использовать PDOStatement. code> fetch () , которая возвращает содержимое столбца из результата. Например, используйте
PDO :: FETCH_ASSOC
, чтобы получить их в ассоциативном массиве на основе имен столбцов.Вот как это исправить:
<*>Конечно, код можно немного очистить, но это должно объяснить, что нужно сделать. Обратите внимание, что поскольку пароль хешируется и никогда не используется в SQL , он фактически не нуждается в очистке. Но я оставил его там на всякий случай, поскольку в исходном коде он был использован в запросе.
Обратите внимание, что весь код, касающийся хранения паролей, необходимо изменить, чтобы хранить хэш вместо пароля. Кроме того, было бы очень полезно использовать соль , добавленную к паролю. до хеширования.
Также я предоставилPOST['pass']; $success = false; // This is to make it more clear what the result is at the end if ($userid != "" || $password != "") { $userid = $dbh->quote($userid_dirty); $passwordhash = hash('sha256',$password_dirty); $sql = "SELECT userid, passwordhash, company, security_id FROM contractors WHERE userid = ".$userid; $result = $dbh->query( $sql ); if ($result) { // Check if result not empty, that userid exists $result_array = $result->fetch(PDO::FETCH_ASSOC); if ($result_array['PASSWORDHASH'] == $passwordhash) { // login success $success = true; // do all the login stuff here... // such as saving $result_array['USERID'], $result_array['COMPANY'], $result_array['SECURITY_ID'] etc. } // else fail, wrong password } // else fail, no such user } else { // fail, userid or password missing echo ' please enter user id and password.'; } if (!$success) { echo ' login failed.'; }
Конечно, код можно немного очистить, но это должно объяснить, что нужно сделать. Обратите внимание, что поскольку пароль хешируется и никогда не используется в SQL , он фактически не нуждается в очистке. Но я оставил его там на всякий случай, поскольку в исходном коде он был использован в запросе.
Обратите внимание, что весь код, касающийся хранения паролей, необходимо изменить, чтобы хранить хэш вместо пароля. Кроме того, было бы очень полезно использовать соль , добавленную к паролю. до хеширования.
Также я предоставил
Другие советы
руководство по PHP - отличный ресурс для изучения PHP. Похоже, вы немного знаете SQL и слышали о PDO, который является хорошим началом. Если вы поищите в Google «PDO» или поищите термин в руководстве по PHP, вы найдете PDO раздел руководства. Похоже, вы нашли функцию -> gt; query
, так что теперь вам нужно посмотреть, что это возвращает. Переходя на страницу руководства этой функции , мы видим, что она возвращает Объект PDOStatement
. Слово PDOStatement
полезно связано с соответствующей страницей в руководстве, где перечислены методы, доступные для этого объекта. Существует метод rowCount ()
, который, скорее всего, будет делать то, что вы хотите.