Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/254.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
尝试使用php构建安全登录_Php_Pdo - Fatal编程技术网

尝试使用php构建安全登录

尝试使用php构建安全登录,php,pdo,Php,Pdo,我需要在php中为当前项目实现一些安全登录。 我用pdo编写的语句编写了一些东西,其中考虑了旧代码。我需要一些建议来实现更安全的攻击,或者检查它是否能够抵御SQLINJ攻击 <form action="validate.php" method=post> <table class="loginForm"> <thead></thead> <tbody> <tr>

我需要在php中为当前项目实现一些安全登录。 我用pdo编写的语句编写了一些东西,其中考虑了旧代码。我需要一些建议来实现更安全的攻击,或者检查它是否能够抵御SQLINJ攻击

 <form action="validate.php" method=post>
    <table class="loginForm">
       <thead></thead>
       <tbody>
          <tr>
            <td>UserName:</td>
            <td><input name=user_name></td>
          </tr>
          <tr>
           <td>Pass:</td>
           <td><input type=password name=password></td>
          </tr>
          <tr>
           <td><input class=loginBtn type=submit value='Log me in' name=login></td>
         </tr>
       </tbody>
    </table>
</form>
更新: 感谢下面接受的答案,我的问题现在是这样编码的

$STH = $DBH->prepare('SELECT * FROM Admins 
                      WHERE username = :user and password = :pass');
$STH->execute(array(':user' => $_POST['user_name'], 
                    ':pass' => $_POST['password']));
这很好。 现在我只想确定我的身份验证是否足够好,可以在这样的管理页面上使用它 会话_start()

试试看{
$host='xx';
$dbName='xxxx';
$dbUser='xxxxx_first';
$dbPass='xxx';
#使用PDO_-MySQL的MySQL
$DBH=newpdo(“mysql:host=$host;dbname=$dbname”,$dbUser,$dbPass);
$DBH->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_异常);
}捕获(PDO$e){
echo“恐怕我做不到。”;
文件内容('pdorers.txt',$e->getMessage(),文件附加);
}
if(空($\u会话['username'])){
要访问页面,您必须登录。
');
}

您可以这样键入查询以避免Sql注入

$STH = $DBH->prepare('SELECT * FROM Admins 
                      WHERE username = :user and password = :pass');
$STH->execute(array(':user' => $_POST['user_name'], 
                    ':pass' => $_POST['password']));
您的代码:

$DBH->prepare("SELECT * FROM `Admins` WHERE `username` = '$user_name' AND password='$password'");
准备好的语句(本身)不能防止SQL注入。您需要绑定参数。签出:


在上面的示例中,SQL注入是完全可能的。我看不到您在哪里定义
$user\u name
$password
,因此我无法确定它是否安全。

您是否使用https将表单发送到服务器?也许这有助于我认为您将密码存储在纯文本中-您应该散列它们,使用SHA1。@将任何代码示例或指向shareSet$secret的链接作为站点范围的随机字符串添加到半文本中。然后存储
sha1($username.$password.$secret)
当您执行用户
插入操作时,以及当您检索密码时,请确保
sha1($username.$enteredPassword.$secret)==$databasePassword
。这些查询是sql inj。安全吗?
$STH = $DBH->prepare('SELECT * FROM Admins 
                      WHERE username = :user and password = :pass');
$STH->execute(array(':user' => $_POST['user_name'], 
                    ':pass' => $_POST['password']));
$DBH->prepare("SELECT * FROM `Admins` WHERE `username` = '$user_name' AND password='$password'");