小编nic*_*ick的帖子

如何在PHP中安全地实现"记住我"按钮(持久登录)

首先是一些背景,我还在学习PHP,我正在尝试建立一个CMS(免责声明:仅供我自己使用).

我还在测试一些东西,并且我已经成功创建了一个管理员登录系统.

所以,现在这就是它的工作原理:

  • 在验证和清理输入后,用户登录,检查用户是否存在,并使用PHP password_verify将密码与存储在DB中的散列密码进行比较.

  • 如果登录成功,我将管理员重定向到a dashboard.php并创建一个名为的会话变量adminId,并将用户ID存储在该变量中.

这是我的第一个问题:

攻击者能否改变$_SESSION['adminId']?的价值?例如,从1更改为12,因此以不同的管理员身份登录?

无论如何,我读过这篇介绍攻击者可以使用的多个漏洞的文章.

所以,如果我没有错,我应该使用cookie进行持久登录吗?

好吧,首先要做的是永远不要将用户ID存储在cookie中并使用它来检查登录,因为攻击者可以很容易地改变它吗?

很好,所以我可以创建一个随机令牌(使用random_bytes然后转换为十六进制)并将其logins与数据库中的表中的用户ID配对.

例如,我有这个:

token: 2413e99262bfa13d5bf349b7f4c665ae2e79e357,
userId: 2
Run Code Online (Sandbox Code Playgroud)

因此,用户登录时,会创建令牌,并使用userId存储在数据库中.假设用户关闭了浏览器.然后他再次打开它,所有它都是带有令牌的cookie:2413e99262bfa13d5bf349b7f4c665ae2e79e357.所以,它会自动使用userId:2登录用户吗?

如果他想以userId:10为用户登录,他需要知道与该用户配对的随机令牌.

很好,但后来出现了这个问题:定时泄漏.所以他们提出了一个使用两个东西的解决方案,一个选择器和一个验证器 这是我不理解的时候,这就是文章所说的:

以下是我们提出的在Web应用程序中处理"记住我"cookie而不向攻击者泄露任何有用信息(甚至是时间信息)的策略,同时仍然快速有效(以防止拒绝服务攻击).

我们提出的策略在一个关键方面偏离了上述简单的基于令牌的自动登录系统:token我们存储的不仅仅是在cookie中存储随机数selector:validator.

selector是一个便于数据库查找的唯一ID,同时防止不可避免的时序信息影响安全性.(这比仅使用数据库id字段更好,这会泄漏应用程序上活动用户的数量.)

在此输入图像描述

在数据库方面,validator没有存储批发; 相反,SHA-256哈希validator存储在数据库中,而明文存储(用selector)在用户的cookie中.有了这种故障安全措施,如果某个auth_tokens表被泄露,就会阻止立即广泛的用户模仿.

自动登录算法类似于:

  1. 独立selectorvalidator.
  2. 抓住auth_tokens给定选择器的行.如果没有找到,则中止.
  3. validator使用SHA-256对用户cookie提供的哈希值进行哈希处理.
  4. 使用我们生成的SHA-256哈希值与数据库中存储的哈希值进行比较hash_equals().
  5. 如果步骤4通过,则将当前会话与相应的用户ID相关联.

所以这就是我不明白的地方: …

php security cookies session

11
推荐指数
1
解决办法
1714
查看次数

用另一个分支完全替换分支

我有 3 个分支:developmentqastagingdevelopment我在和中都有几乎相同的代码,因此从到qa进行公关不会产生太多更改(和/或冲突)。developmentqa

但现在我把所有的东西都从 搬到qastaging。而且qa代码实际上与 完全不同并且是新的staging,那么最好的选择是什么?我搜索并找到了另一个答案

git checkout qa
git merge -s ours staging
git checkout staging
git merge qa
Run Code Online (Sandbox Code Playgroud)

这对我的情况来说是个好主意吗?提前致谢!

编辑:我不想丢失暂存分支的所有提交。

git

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

React 测试库 - i18n 翻译不起作用

我正在尝试测试一个组件,这是简化的组件:

const Block = () => {
   const { t } = useTranslation();
  
   return <p data-testid="text">{t('some.text')}</p>;
}
Run Code Online (Sandbox Code Playgroud)

然后我有这个测试:

test('That the text is correct', () => {
  const wrapper = render(
    <I18nextProvider i18n={i18n}>
      <Block />
    </I18nextProvider>
  );

  expect(wrapper.getByTestId('text')).toHaveTextContent('Hello!');
});
Run Code Online (Sandbox Code Playgroud)

i18n 是我的配置文件,如下所示:

i18n
  .use(Backend)
  .use(initReactI18next)
  .init({
    fallbackLng: 'en',
    lng: 'en'
    debug: false,
    react: {
      useSuspense: false,
    },
    interpolation: {
      escapeValue: false,
    },
  });
Run Code Online (Sandbox Code Playgroud)

但我仍然得到:

Expect element to have text content:
   Hello!
Received:
   some.text
Run Code Online (Sandbox Code Playgroud)

我怀疑是后端插件导致它无法工作。

javascript reactjs

7
推荐指数
1
解决办法
2104
查看次数

React 查询:使多个查询无效,但等到它们全部完成突变成功

所以我\xe2\x80\x99m使用React查询,我有一个突变,我有一个像这样的onSucess回调:

\n
onSuccess: () => {\n  return queryClient.invalidateQueries([FETCH_USER, userId]);\n}\n
Run Code Online (Sandbox Code Playgroud)\n

我想使另一个查询无效,我知道我可以这样做:

\n
onSuccess: () => {     \n    queryClient.invalidateQueries([FETCH_USER, userId]);\n    queryClient.invalidateQueries([FETCH_USER_BOOKS, userId]);\n}\n
Run Code Online (Sandbox Code Playgroud)\n

但是,如果我不使用返回值,那么它不会等待失效并将突变设置为完成。

\n

有没有办法将返回值用于这两种失效?

\n

javascript reactjs react-query

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

全屏叠加css/jquery

我正试图制作一个"巨大的"div,用不透明度0.4或其他任何东西填充所有视口.问题是如何做到这一点.我尝试使用我的所有页面内容创建一个div并给它这个属性:

.div{
  width:100%;
  height:100%;
  background:#000;
  opacity:0.5;
}
Run Code Online (Sandbox Code Playgroud)

因为那不起作用,我试图添加z-index并设置一个高值,但它也没有用.任何的想法?我想做这样的事情:

在此输入图像描述

html css jquery

6
推荐指数
1
解决办法
1万
查看次数

Laravel Blade @guest 多个守卫指令

我有用户警卫(名称为web)和管理员警卫(名称为admin)。因此,为了显示/隐藏内容,我使用 Laravel Blade 指令@auth('web')@auth('admin')但不知何故它@guest不起作用,所以我被迫像这样使用:

@auth('admin')
    <li>Dashboard</li>
    <li>Log out</li>
@endauth

@auth('web')
    <li>Create Post</li>
    <li>Log out</li>
@endauth

@guest('admin')
    @guest('web')
        <li>Contact</li>
        <li>About us</li>
    @endguest
@endguest
Run Code Online (Sandbox Code Playgroud)

我嵌套了访客指令,但感觉太多了,有更好的方法吗?

php laravel laravel-blade

6
推荐指数
1
解决办法
1万
查看次数

React Hook useEffect 缺少依赖项。包括它们或删除依赖数组

我正在制作一个 React 应用程序,我收到了这个警告。我正在尝试在组件安装时进行两次 API 调用:

useEffect(() => {
  getWebsites();
  loadUserRatings();
}, []);
Run Code Online (Sandbox Code Playgroud)

这就是为什么我有一个空数组,因为我只想在组件安装时调用它一次。但是我仍然收到警告,我该如何解决?

这两个函数使用 react redux 中的 connect 传递给组件,整个组件如下所示:

const Wrapper = (props) => {
  const { getWebsites, loadUserRatings } = props;

  useEffect(() => {
    getWebsites();
    loadUserRatings();
  }, []);

  return (
    <>
      <Header />
      <Websites />
      <Sync />
    </>
  );
};
Run Code Online (Sandbox Code Playgroud)

reactjs

6
推荐指数
1
解决办法
8566
查看次数

当元素隐藏时,元素单击不会触发

我在文本输入上有一个模糊事件,该事件在按钮上切换(使用 React 渲染)。当您单击按钮时,模糊事件会在文本输入上触发,从而从 DOM 中删除按钮,但不会触发按钮单击事件。我尝试包装在 100 毫秒超时内从 DOM 中删除按钮的代码,它可以工作,但感觉很hacky,有没有更好的方法?

这是代码的要点:

const blurHandler = e => {
  setShowInput(false); //this prevents buttonHandler from being fired

  // setTimeout(() => setShowInput(false), 100); // this works with 100ms, but not with 50ms for example
}

const buttonHandler = e => {
  console.log('Button clicked!');
}

const focusHandler = e => {
  setShowInput(true);
}

return (
  <div>
    <input type="text" onFocus={focusHandler} onBlur={blurHandler} >
    {showInput && <button onClick={buttonHandler}>Apply to all</button>}
  </div>
)
Run Code Online (Sandbox Code Playgroud)

javascript reactjs

4
推荐指数
1
解决办法
925
查看次数

Laravel按条件和拆分收集过滤器

我有一个集合,每个项目都有一个featured为true或false 的属性,因此我想获取两个变量$featured$unfeatured

我可以做这个:

$featured = $collection.filter(function($item){
   return $item->featured;
});

$unfeatured = $collection.filter(function($item){
   return !$item->featured;
});
Run Code Online (Sandbox Code Playgroud)

但是也许有更短的方法?

php laravel

3
推荐指数
2
解决办法
3171
查看次数

自从API的新变化(2018年4月4日)以来,有没有办法从Instagram帐户获取图像?

Instagram API删除了以下端点:

GET /users/search
Run Code Online (Sandbox Code Playgroud)

我用它来从我的网站上的个人资料中获取图像.

现在有办法吗?我找不到任何信息,因为这是非常新的.

instagram-api

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