相关疑难解决方法(0)

基于表单的网站身份验证的权威指南

基于表单的网站身份验证

我们认为Stack Overflow不仅应该是非常具体的技术问题的资源,而且还应该是关于如何解决常见问题变化的一般指导原则."基于表单的网站身份验证"应该是这种实验的一个很好的主题.

它应包括以下主题:

  • 如何登录
  • 如何退出
  • 如何保持登录状态
  • 管理cookie(包括推荐设置)
  • SSL/HTTPS加密
  • 如何存储密码
  • 使用秘密问题
  • 忘记用户名/密码功能
  • 使用nonce来防止跨站点请求伪造(CSRF)
  • OpenID的
  • "记住我"复选框
  • 浏览器自动完成用户名和密码
  • 秘密URL(受摘要保护的公共URL)
  • 检查密码强度
  • 电子邮件验证
  • 还有更多关于 基于表单的身份验证 ...

它不应该包括以下内容:

  • 角色和授权
  • HTTP基本身份验证

请帮助我们:

  1. 建议子主题
  2. 提交有关此主题的好文章
  3. 编辑官方答案

language-agnostic security authentication article http

5311
推荐指数
12
解决办法
59万
查看次数

如何在PHP中阻止SQL注入?

如果插入用户输入而不修改SQL查询,则应用程序容易受到SQL注入的攻击,如下例所示:

$unsafe_variable = $_POST['user_input']; 

mysql_query("INSERT INTO `table` (`column`) VALUES ('$unsafe_variable')");
Run Code Online (Sandbox Code Playgroud)

这是因为用户可以输入类似的内容value'); DROP TABLE table;--,查询变为:

INSERT INTO `table` (`column`) VALUES('value'); DROP TABLE table;--')
Run Code Online (Sandbox Code Playgroud)

可以采取哪些措施来防止这种情况发生?

php mysql sql security sql-injection

2776
推荐指数
28
解决办法
166万
查看次数

为PHP密码保护哈希和盐

目前据说MD5部分不安全.考虑到这一点,我想知道用于密码保护的机制.

这个问题,"双重哈希"密码是否比仅仅哈希一次更安全? 建议多次散列可能是一个好主意,而如何实现单个文件的密码保护?建议使用盐.

我正在使用PHP.我想要一个安全快速的密码加密系统.散列密码一百万次可能更安全,但也更慢.如何在速度和安全性之间取得良好的平衡?另外,我更喜欢结果具有恒定数量的字符.

  1. 散列机制必须在PHP中可用
  2. 它必须是安全的
  3. 它可以使用盐(在这种情况下,所有的盐都同样好吗?有没有办法产生好的盐?)

另外,我应该在数据库中存储两个字段(例如,一个使用MD5,另一个使用SHA)?它会使它更安全或更不安全吗?

如果我不够清楚,我想知道使用哪种散列函数以及如何选择好的盐以便拥有安全和快速的密码保护机制.

相关问题并不完全涵盖我的问题:

PHP中的SHA和MD5有什么区别
简单密码加密
存储密钥的安全方法,asp.net的密码
如何在Tomcat 5.5中实现salted密码

php security passwords hash protection

1142
推荐指数
13
解决办法
21万
查看次数

复制或不复制PHP中的额外变量?

阅读Google Developers PHP性能提示我看到不建议制作变量的额外副本.

而不是这个:

$description = strip_tags($_POST['description']);
echo $description;
Run Code Online (Sandbox Code Playgroud)

它推荐这个:

echo strip_tags($_POST['description']);
Run Code Online (Sandbox Code Playgroud)

原因是可能不必要的内存消耗.

但是做了一些搜索,我看到一些反驳说PHP实现了"copy-on-write"内存管理.这基本上意味着我们可以为我们喜欢的变量分配一个值,而不必担心实际复制的数据.

所以,我想知道,如果在更复杂的情况,其中,例如$_POST$_GET变量将在代码中的很多地方都可以使用,无论是更好的做法是使用或不使用额外的变量,考虑到这些标准:

1)安全

2)维护/可读性

3)表现

编辑1

我将使用下面的示例来更好地说明问题.

这种代码更好(考虑上面的标准):

$user = anti_injection($_POST['user']);
$pass = anti_injection($_POST['pass']);

// Continue the code using $user and $pass
Run Code Online (Sandbox Code Playgroud)

或这个?

$_POST['user'] = anti_injection($_POST['user']);
$_POST['pass'] = anti_injection($_POST['pass']);

// Continue the code using $_POST['user'] and $_POST['pass']
Run Code Online (Sandbox Code Playgroud)

php optimization performance

8
推荐指数
1
解决办法
331
查看次数

postgresql缺乏对parameterizd查询的支持

我没有通过浏览谷歌找到.所以我决定在这里问.是否使用php pdo支持参数化查询?

如果不.我怎样才能达到同样的安全性?

注意安全,因此注射证明是绝对必须的.使用另一个数据库不是一个选项作为旁注.

在对Fonini的回应中;

参数化查询如下:

     $st = $db->prepare(
         "insert into vendors set
         first_name = :first_name,
         last_name = :last_name"
     );
     $st->execute(array(
         ':first_name' => $vendor->first_name,
         ':last_name' => $vendor->last_name
     ));
Run Code Online (Sandbox Code Playgroud)

不使用bindParam

这不会为我插入.

我的代码看起来像这样:

$project = new Project();
$project->id = 'sequence string';
$project->projectName = 'A project name';

$project->saveProject();
Run Code Online (Sandbox Code Playgroud)

在项目模型中:

public function saveProject() {
    $this->_db->query("INSERT INTO projects VALUES (:id,:projectName)", array(':id' => $this->_projectFields['id'], ':projectName' => $this->_projectFields['projectName']))->save();
Run Code Online (Sandbox Code Playgroud)

}

我的db类中的查询方法将查询放在私有$ _query字段中,将aray参数放在私有$ _parameters字段中.然后我调用save方法,该方法准备语句,将$ this - > _ query作为参数提供给PDO :: prepare(),然后调用PDO :: execute将$ this - > _ parameters作为参数.这无法插入

php postgresql pdo

2
推荐指数
1
解决办法
2607
查看次数