質問

次の認証スクリプトが完了している必要があります。私はphp / pdoが苦手なので、1に等しい行数を要求し、クエリの結果からセッションIDを設定する方法がわかりません。結果から$ _SESSION ['userid']だけでなく['company']と['security_id']も設定する必要があります。

ここに私が持っているものがあります:

$userid   = 

次の認証スクリプトが完了している必要があります。私はphp / pdoが苦手なので、1に等しい行数を要求し、クエリの結果からセッションIDを設定する方法がわかりません。結果から$ _SESSION ['userid']だけでなく['company']と['security_id']も設定する必要があります。

ここに私が持っているものがあります:

<*>

オプション情報: ブラウザ:Firefox

POST['userid']; $password =

次の認証スクリプトが完了している必要があります。私はphp / pdoが苦手なので、1に等しい行数を要求し、クエリの結果からセッションIDを設定する方法がわかりません。結果から$ _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'

...その後、だれでもログインできます。攻撃的に聞こえるかもしれませんが、そのコードが行うことは、おそらく警報システムを備えていないあなたの会社に玄関をロックするのを忘れるようなものです。

入力が実際にユーザーから来ているかどうかは関係ないことに注意してください(おそらく、事前に入力され、隠されているからです)。セキュリティの観点から見ると、ユーザーによる悪意のある入力を含むとみなされる は、任意の外部のどこからでも来ます。

私が知る限り、 quote 関数。 (mysqlでは、これは mysql_real_escape_string()で行われます。)私はPDOの専門家ではありません。ここで間違えた場合は誰か修正してください。

また、データベースにパスワードを直接保存するのではなく、ハッシュ関数を使用してマスクされたパスワードを作成し、ユーザーが指定したパスワードからハッシュを作成し、ハッシュを一致させる必要があります。これを行うには、PHPの hash 関数を使用できます。

他の問題については、SQL SELECTに対するアプローチが最善のアプローチであるかどうかはわかりません。対応するユーザーのパスワードを選択し、プログラムでそれを一致させてみます。あなたが使用している方法にも欠陥があるとは思わないが、それは論理的ではないと思われるため、がいくつかのバグを見逃す可能性が高い-パスワードとログインはエクスプロイトのウィンドウを作成します。

これを行うには、 PDO から得られる結果に注意する必要があります。 href = "http://php.net/manual/en/pdo.query.php" rel = "nofollow noreferrer"> query PDOStatement 、量を直接数えるための信頼できる機能がないようです結果行の。使用する必要があるのは fetchAll です。行の配列、そしてそれを数えます。しかし、私が言ったように、これはすべて失敗の可能性があると感じているため、コード内のパスワードをチェックする方が安全だと感じています。このようなセキュリティが重要な場所では、実際のパスワードマッチングの比較から私の好みとの距離が大きすぎます。

したがって、ユーザーIDの結果のパスワードを取得するには、PDOStatementの <を使用できます。 code> fetch() は、結果から列の内容を返します。たとえば、 PDO :: FETCH_ASSOC を使用して、列名に基づいて連想配列で取得します。

修正方法は次のとおりです。

$userid_dirty   = 

そのコードは絶対に使用しないでください!

非常に深刻なSQLインジェクションが開かれています。 Cookie、CGI、またはどこでもから取得するすべてのユーザー入力は、SQLステートメントで使用する前にサニタイズする必要があります。次のようなユーザー名でログインしようとすると、そのシステムに簡単に侵入できます:

user'; UPDATE contractors SET password = '1337'

...その後、だれでもログインできます。攻撃的に聞こえるかもしれませんが、そのコードが行うことは、おそらく警報システムを備えていないあなたの会社に玄関をロックするのを忘れるようなものです。

入力が実際にユーザーから来ているかどうかは関係ないことに注意してください(おそらく、事前に入力され、隠されているからです)。セキュリティの観点から見ると、ユーザーによる悪意のある入力を含むとみなされる は、任意の外部のどこからでも来ます。

私が知る限り、 quote 関数。 (mysqlでは、これは mysql_real_escape_string()で行われます。)私はPDOの専門家ではありません。ここで間違えた場合は誰か修正してください。

また、データベースにパスワードを直接保存するのではなく、ハッシュ関数を使用してマスクされたパスワードを作成し、ユーザーが指定したパスワードからハッシュを作成し、ハッシュを一致させる必要があります。これを行うには、PHPの hash 関数を使用できます。

他の問題については、SQL SELECTに対するアプローチが最善のアプローチであるかどうかはわかりません。対応するユーザーのパスワードを選択し、プログラムでそれを一致させてみます。あなたが使用している方法にも欠陥があるとは思わないが、それは論理的ではないと思われるため、がいくつかのバグを見逃す可能性が高い-パスワードとログインはエクスプロイトのウィンドウを作成します。

これを行うには、 PDO から得られる結果に注意する必要があります。 href = "http://php.net/manual/en/pdo.query.php" rel = "nofollow noreferrer"> query PDOStatement 、量を直接数えるための信頼できる機能がないようです結果行の。使用する必要があるのは fetchAll です。行の配列、そしてそれを数えます。しかし、私が言ったように、これはすべて失敗の可能性があると感じているため、コード内のパスワードをチェックする方が安全だと感じています。このようなセキュリティが重要な場所では、実際のパスワードマッチングの比較から私の好みとの距離が大きすぎます。

したがって、ユーザーIDの結果のパスワードを取得するには、PDOStatementの <を使用できます。 code> fetch() は、結果から列の内容を返します。たとえば、 PDO :: FETCH_ASSOC を使用して、列名に基づいて連想配列で取得します。

修正方法は次のとおりです。

<*>

もちろん、コードを少しクリーンアップすることもできますが、それは何をする必要があるかを説明するはずです。パスワードはハッシュ化されており、 SQLで使用されることはないため、実際にクリーニングする必要はありません。ただし、元のコードではクエリで が使用されていたため、念のためそこに残しました。

パスワードの保存に関するすべてのコードは、パスワードの代わりにハッシュを保存するように変更する必要があることに注意してください。また、パスワードに salt を追加して使用することをお勧めしますハッシュする前。

また、cPOST['userid']; $password_dirty =

そのコードは絶対に使用しないでください!

非常に深刻なSQLインジェクションが開かれています。 Cookie、CGI、またはどこでもから取得するすべてのユーザー入力は、SQLステートメントで使用する前にサニタイズする必要があります。次のようなユーザー名でログインしようとすると、そのシステムに簡単に侵入できます:

user'; UPDATE contractors SET password = '1337'

...その後、だれでもログインできます。攻撃的に聞こえるかもしれませんが、そのコードが行うことは、おそらく警報システムを備えていないあなたの会社に玄関をロックするのを忘れるようなものです。

入力が実際にユーザーから来ているかどうかは関係ないことに注意してください(おそらく、事前に入力され、隠されているからです)。セキュリティの観点から見ると、ユーザーによる悪意のある入力を含むとみなされる は、任意の外部のどこからでも来ます。

私が知る限り、 quote 関数。 (mysqlでは、これは mysql_real_escape_string()で行われます。)私はPDOの専門家ではありません。ここで間違えた場合は誰か修正してください。

また、データベースにパスワードを直接保存するのではなく、ハッシュ関数を使用してマスクされたパスワードを作成し、ユーザーが指定したパスワードからハッシュを作成し、ハッシュを一致させる必要があります。これを行うには、PHPの hash 関数を使用できます。

他の問題については、SQL SELECTに対するアプローチが最善のアプローチであるかどうかはわかりません。対応するユーザーのパスワードを選択し、プログラムでそれを一致させてみます。あなたが使用している方法にも欠陥があるとは思わないが、それは論理的ではないと思われるため、がいくつかのバグを見逃す可能性が高い-パスワードとログインはエクスプロイトのウィンドウを作成します。

これを行うには、 PDO から得られる結果に注意する必要があります。 href = "http://php.net/manual/en/pdo.query.php" rel = "nofollow noreferrer"> query PDOStatement 、量を直接数えるための信頼できる機能がないようです結果行の。使用する必要があるのは fetchAll です。行の配列、そしてそれを数えます。しかし、私が言ったように、これはすべて失敗の可能性があると感じているため、コード内のパスワードをチェックする方が安全だと感じています。このようなセキュリティが重要な場所では、実際のパスワードマッチングの比較から私の好みとの距離が大きすぎます。

したがって、ユーザーIDの結果のパスワードを取得するには、PDOStatementの <を使用できます。 code> fetch() は、結果から列の内容を返します。たとえば、 PDO :: FETCH_ASSOC を使用して、列名に基づいて連想配列で取得します。

修正方法は次のとおりです。

<*>

もちろん、コードを少しクリーンアップすることもできますが、それは何をする必要があるかを説明するはずです。パスワードはハッシュ化されており、 SQLで使用されることはないため、実際にクリーニングする必要はありません。ただし、元のコードではクエリで が使用されていたため、念のためそこに残しました。

パスワードの保存に関するすべてのコードは、パスワードの代わりにハッシュを保存するように変更する必要があることに注意してください。また、パスワードに salt を追加して使用することをお勧めしますハッシュする前。

また、cPOST['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で使用されることはないため、実際にクリーニングする必要はありません。ただし、元のコードではクエリで が使用されていたため、念のためそこに残しました。

パスワードの保存に関するすべてのコードは、パスワードの代わりにハッシュを保存するように変更する必要があることに注意してください。また、パスワードに salt を追加して使用することをお勧めしますハッシュする前。

また、c

他のヒント

phpマニュアルは、PHPを学習するための優れたリソースです。少しSQLを知っているようで、PDOのことを聞いたことがあります。これは良いスタートです。 Googleで&quot; PDO&quot;を検索するか、PHPマニュアルでその用語を調べると、 PDOが見つかります。マニュアルのセクション-&gt; query 関数を見つけたように見えるので、今度はそれが何を返すかを確認する必要があります。その関数のマニュアルページにアクセスすると、 PDOStatement オブジェクト。 PDOStatement という単語は、そのオブジェクトで使用可能なメソッドをリストしたマニュアルの関連ページにリンクしています。 rowCount()メソッドがあり、おそらくあなたがしたいことをするでしょう。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top