首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不安全的登录脚本-如何保护

不安全的登录脚本-如何保护
EN

Stack Overflow用户
提问于 2013-03-21 03:54:47
回答 6查看 114关注 0票数 1

我正在调查一个可能被sql注入的项目(一个用户报告了它)。

以下是登录脚本的一部分:

代码语言:javascript
复制
  $loginemail = $_POST['loginemail'];                 
            $loginemail_sql = mysql_real_escape_string($loginemail);                

            $password = $_POST['loginpass'];                 
            $password_sql = mysql_real_escape_string($password);                

             //get user data
            $q = 'SELECT uid, full_name, score, status FROM users WHERE email="'.$loginemail.'" AND password="'.$password_sql.'" LIMIT 1';

我想现在,如果这是代码的一部分,可以注入?是否存在错误处理$loginemail和$password并可能包含一些危险的"SQL部件“的问题?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2013-03-21 03:58:03

让我们看看:

.它们不再由and are officially deprecated维护。看到了吗?相反,学习,并使用PDOMySQLi - this article将帮助您决定使用哪种方法。如果你选择PDO,here is a good tutorial

对于初学者来说。

其次,您转义了$loginemail,但使用了未转义的版本(而不是$loginmail_sql)。

第三,您的代码暗示您将密码按原样存储在数据库中。你不应该这么做。如果攻击者拿到了数据库,你的密码就会被泄露。您应该对密码进行哈希处理,并将哈希存储在那里。

票数 6
EN

Stack Overflow用户

发布于 2013-03-21 03:56:56

是的,您在未更改的查询中使用了$loginemail。请改用$loginemail_sql

要进一步阅读,请查看

票数 2
EN

Stack Overflow用户

发布于 2013-03-21 04:20:50

正如@Madara Uchiha所说,停止使用mysql_*函数是很好的。但他没有给出任何例子。所以我会。我的英语很抱歉,我是巴西人:)

PDO:

代码语言:javascript
复制
<?php
$loginemail = $_POST['loginemail'];
$password = $_POST['loginpass'];

// open a PDO connection within mysql driver
// PDO uses DSN string for connections they look like: "driver:options"
$dsn = 'mysql:dbname=testdb;host=127.0.0.1';
// DB username
$dbUser = 'dbuser';
// DB password
$dbPassword = 'dbpass';
// PDO is instantiable, so you need to create an object for each connection
$dbh = new PDO($dsn, $dbUser, $dbPassword);
// You must prepare your query, PDO uses a placeholder system for sanitize data and avoid injection, params can be passed using "?" or ":varname"
$stmt = $dbh->prepare('SELECT uid, full_name, score, status FROM users WHERE email= :email AND password= :password LIMIT 1');
// Binding a param called :email
$stmt->bindValue(':email', $loginemail);
// Binding a param called :password
$stmt->bindValue(':password', $password);
// Execute the PDOStatement
$stmt->execute();
// Then fetch result
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
// ALSO, you can fetch only one row using
$firstRow = $stmt->fetch(PDO::FETCH_ASSOC);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15533398

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档