Вопрос

Мне нужен следующий скрипт аутентификации. Я слаб в 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 () , который, скорее всего, будет делать то, что вы хотите.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top