За последние 24 часа нас посетили 22769 программистов и 1268 роботов. Сейчас ищут 718 программистов ...

Регистрация PHP+MSSQL

Тема в разделе "MSSQL", создана пользователем 69-RUS, 7 июл 2015.

  1. 69-RUS

    69-RUS Новичок

    С нами с:
    7 июл 2015
    Сообщения:
    14
    Симпатии:
    0
    Доброго времени суток. Я сделал скрипт регистрации и всё вроде работает, запись в базе создаётся, но пароль получается не такой который должен быть.

    Вот сам запрос:
    Код (PHP):
    1. sqlsrv_query($conn, "INSERT INTO dbo.tbl_Account (IdName, Passwd, Security, SubSecurity )
    2. VALUES ('$Username', (SELECT BINARY_CHECKSUM('$Password')), 0, 0 )");
    в результате пароль 123456 получается таким 52496230
    А вот если я создаю аккаунт через хранимую процедуру

    Код (PHP):
    1. USE [Account]GO
    2. SET ANSI_NULLS ON
    3. GO
    4. SET QUOTED_IDENTIFIER ON
    5. GO
    6.  
    7. ALTER PROCEDURE [dbo].[usp_CreateAccount]
    8. @i_AccountName nvarchar( 20 ),
    9. @i_AccountPass nvarchar( 12 )
    10.  
    11. --with encryption
    12. as
    13. begin
    14. set nocount on
    15. set lock_timeout 10000
    16.  
    17. declare @o_Count int
    18. declare @r_Return int
    19.  
    20. exec @r_Return = usp_AccountInsert @i_AccountName, @i_AccountPass
    21. if ( @r_Return < 0 )
    22. return -2
    23.  
    24. -- SUCC
    25. return 0
    26.  
    27. Она передаёт логин и пароль в процедуру usp_AccountInsert
    28.  
    29. USE [Account]
    30. GO
    31. SET ANSI_NULLS ON
    32. GO
    33. SET QUOTED_IDENTIFIER ON
    34. GO
    35.  
    36. ALTER PROCEDURE [dbo].[usp_AccountInsert]
    37. @IdName nvarchar( 20 ),
    38. @Passwd nvarchar( 12 )
    39.  
    40. --with encryption
    41. as
    42. begin
    43. set nocount on
    44. set lock_timeout 10000
    45.  
    46. if exists( select IdName from tbl_Account where IdName = @IdName )
    47. return -2
    48.  
    49. insert into tbl_Account ( IdName, Passwd, Security, SubSecurity )
    50. values ( @IdName, checksum(@Passwd), 0, 0 )
    51.  
    52. if ( @@ROWCOUNT <> 1 )
    53. return -3
    54. return 0
    Получается пароль 2120620386

    Что я делаю не так?
     
  2. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.230
    Симпатии:
    1.715
    Адрес:
    Молдова, г.Кишинёв
    А для чего пропускать пароль через функцию BINARY_CHECKSUM и во втором случаи checksum?
     
  3. 69-RUS

    69-RUS Новичок

    С нами с:
    7 июл 2015
    Сообщения:
    14
    Симпатии:
    0
    Когда ставлю checksum результат тоже не тот который должен быть хотя в хранимой процедуре стоит checksum. Почему результат не тот получается понять не могу.
     
  4. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.230
    Симпатии:
    1.715
    Адрес:
    Молдова, г.Кишинёв
    Так зачем ты эти две функции используешь? Может ты так пытался хэш пароля в базу записать?
    Чтобы защитить пароли в базе почитай это
    https://php.net/manual/ru/function.password-verify.php

    Добавлено спустя 1 минуту 17 секунд:
    И что такое sql injection почитай.
     
  5. 69-RUS

    69-RUS Новичок

    С нами с:
    7 июл 2015
    Сообщения:
    14
    Симпатии:
    0
    Сервер авторизации использует именно контрольную сумму пароля, не я его писал и не могу изменить это. Я пытаюсь записать данные в базу напрямую через запрос. Хранимые процедуры я привёл для примера.

    Добавлено спустя 36 минут 37 секунд:
    Вот весь скрипт. Можно тут прикрутить хранимую процедуру что бы логин и пароль передавались в неё?
    Код (PHP):
    1. <?php
    2. $serverName = "Сервер";
    3. $connectionInfo = array( "Database"=>"Account", "UID"=>"Логин", "PWD"=>"Пароль");
    4. $conn = sqlsrv_connect( $serverName, $connectionInfo);
    5.  
    6. if($conn) {
    7.  
    8. }else{
    9.      echo "1.<br />";
    10.      die( print_r( sqlsrv_errors(), true));
    11. }
    12.  
    13. if($_POST['submit'])
    14. {
    15.     $Username = stripslashes($_POST['username']);
    16.     $Password = stripslashes($_POST['password']);
    17.     $PasswordConfirm = stripslashes($_POST['confirmpassword']);
    18.  
    19.     mysql_real_escape_string($Username);
    20.     mysql_real_escape_string($Password);
    21.     mysql_real_escape_string($PasswordConfirm);
    22.     
    23.     if($PasswordConfirm !=$Password){ echo("2.");}
    24.     if((!$Password) || (!$PasswordConfirm)){ echo("3.");}
    25.     
    26.     else{
    27.    sqlsrv_query($conn, "INSERT INTO dbo.tbl_Account (IdName, Passwd, Security, SubSecurity )
    28. VALUES ('$Username', (SELECT password_hash('$Password')), 0, 0 )");
    29.  
    30. echo("4.");
    31.     }
    32. }
    33. else
    34. {
    35.     echo("5.");
    36. }
    37.  
    38. ?>
     
  6. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.230
    Симпатии:
    1.715
    Адрес:
    Молдова, г.Кишинёв
    Да можно, сперва слепи sql запрос который будет работать в mssql и проверь его, потом этот запрос просто пихай в функцию sqlsrv_query и дело в шляпе.
    Когда ты вручную выполняешь запрос в mssql, то через php ты должен использовать тот же sql запрос, вся разница только через что его выполнять, через консоль, через графическую оболочку mssql или через php.

    Добавлено спустя 2 минуты 54 секунды:
    https://php.net/manual/ru/function.mssql-bind.php
     
  7. 69-RUS

    69-RUS Новичок

    С нами с:
    7 июл 2015
    Сообщения:
    14
    Симпатии:
    0
    вот что у меня получилось сделать.
    declare @r_Return int
    exec @r_Return = usp_AccountInsert 123, 123456

    123-логин 123456-пароль

    В базе пароль в нужно виде. Так как я не очень силен в пхп прошу помочь с созданием запроса
     
  8. 69-RUS

    69-RUS Новичок

    С нами с:
    7 июл 2015
    Сообщения:
    14
    Симпатии:
    0
    exec usp_AccountInsert 12344, 123456 такой запрос создаёт в базе запись в правильными параметрами.
    Но когда в пхп ставлю sqlsrv_query($conn, exec usp_AccountInsert '$Username', '$Password') ни чего не происходит
     
  9. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.230
    Симпатии:
    1.715
    Адрес:
    Молдова, г.Кишинёв
  10. 69-RUS

    69-RUS Новичок

    С нами с:
    7 июл 2015
    Сообщения:
    14
    Симпатии:
    0
    Видимо руки у меня не из того места, в базе запись не появляется вообще
    Код (PHP):
    1. <?php
    2. $serverName = "Сервер";
    3. $connectionInfo = array( "Database"=>"Account", "UID"=>"Логин", "PWD"=>"Пароль");
    4. $conn = sqlsrv_connect( $serverName, $connectionInfo);
    5.  
    6. if($conn) {
    7.  
    8. }else{
    9.      echo "1.<br />";
    10.      die( print_r( sqlsrv_errors(), true));
    11. }
    12.  
    13. if($_POST['submit'])
    14. {
    15.     $Username = stripslashes($_POST['username']);
    16.     $Password = stripslashes($_POST['password']);
    17.     $PasswordConfirm = stripslashes($_POST['confirmpassword']);
    18.  
    19.     mysql_real_escape_string($Username);
    20.     mysql_real_escape_string($Password);
    21.     mysql_real_escape_string($PasswordConfirm);
    22.     
    23.     if($PasswordConfirm !=$Password){ echo("2.");}
    24.     if((!$Password) || (!$PasswordConfirm)){ echo("3.");}
    25.     
    26.  
    27.  
    28.    // Create a new stored prodecure
    29. $stmt = mssql_init('usp_AccountInsert');
    30.  
    31. // Bind the field names
    32. mssql_bind($stmt, '@i_AccountName',  '$Username',  SQLVARCHAR,  false,  false,  20);
    33. mssql_bind($stmt, '@i_AccountPass',  '$Password',  SQLVARCHAR,  false,  false,  12);
    34.  
    35. // Execute
    36.  
    37. // Free statement
    38. ?>
    PHP, JavaScript, SQL и другой код пишите внутри тегов
    Код ( (Unknown Language)):
    1. [b]php][/b]Тут код[b][/[/b][b]code][/b][/color]
     
  11. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.230
    Симпатии:
    1.715
    Адрес:
    Молдова, г.Кишинёв
  12. 69-RUS

    69-RUS Новичок

    С нами с:
    7 июл 2015
    Сообщения:
    14
    Симпатии:
    0
    Спасибо за информацию. Плюнул на PHP и сделал на ASP.NET там быстрее и без проблем.