RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题

全部问题

Martin Hope
Monk
Asked: 2020-10-24 00:21:00 +0000 UTC

Abort\Retry\Ignore 在代码中的任何一点都能够将选择转储给用户

  • 14

在处理网络和 IO 时,通常存在即使对于用户(尽管是有经验的用户)也很容易解决的限制,但很难提前了解它们。繁忙的文件,不稳定的连接 - 我经常错过重复按钮,尤其是当整个过程需要并回滚时。

到目前为止,我已经为这个问题实施了一个或多或少通用的解决方案:

  public enum ExceptionHandle
  {
    Abort,
    Retry,
    Ignore
  }

  public class ExceptionEventArgs
  {
    public Exception Exception { get; }

    public ExceptionHandle? Handled { get; set; }

    public ExceptionEventArgs(Exception ex)
    {
      this.Exception = ex;
    }
  }

  public static class ExceptionHandler
  {
    public static event EventHandler<ExceptionEventArgs> Handler;

    public static void TryExecute(Action action)
    {
      TryExecute(() => { action(); return true; }, false);
    }

    public static T TryExecute<T>(Func<T> action, T whenIgnored)
    {
      ExceptionHandle? handled = ExceptionHandle.Retry;
      while (handled == ExceptionHandle.Retry)
      {
        try
        {
          return action();
        }
        catch (Exception ex)
        {
          handled = OnHandler(new ExceptionEventArgs(ex));
          if (handled.HasValue)
          {
            switch (handled.Value)
            {
              case ExceptionHandle.Abort:
                throw;
                break;
              case ExceptionHandle.Retry:
                break;
              case ExceptionHandle.Ignore:
                break;
              default:
                throw new ArgumentOutOfRangeException();
            }
          }
          else
          {
            throw;
          }
        }
      }
      return whenIgnored;
    }

    private static ExceptionHandle? OnHandler(ExceptionEventArgs e)
    {
      if (Handler == null || !Handler.GetInvocationList().Any())
      {
        ExceptionDispatchInfo.Capture(e.Exception).Throw();
      }
      else
      {
        Handler.Invoke(null, e);
      }
      return e.Handled;
    }
  }

因此,任何订户ExceptionHandler.Handler都可以自动解决问题,或者将解决方案转交给用户。现在可以包装任何危险代码:

      var tested = ExceptionHandler.TryExecute(() =>
      {
        using (var destination = new MemoryStream())
        {
          using (Stream stream = entry.Open())
            stream.CopyTo(destination);
          return destination.Length == entry.Length;
        }
      }, false);

总的来说,目前的实施在我看来已经可以忍受并且有效。但是,我怀疑这样的解决方案已经存在于某个地方,我只是找不到它们。有人可以建议从哪里获得或至少查看现成的解决方案吗?好吧,如果我的代码中有门框,我也不会拒绝帮助。

UPD:是的,我知道即使这样也有问题的情况 - 操作可以是一次性的(关闭连接,破坏 sql 会话,无论你想做什么)。它已经留在使用代码的人的良心上。虽然,我也会为这个问题寻找有趣的选项,但你会限制相同的无花果。

UPD2:我还没弄清楚是否有可能将一个这样的块包装到另一个块中,否则现在,结果是,当内部块被中止时,外部块再次进行处理。

c#
  • 3 个回答
  • 10 Views
Martin Hope
pank
Asked: 2020-10-18 18:35:09 +0000 UTC

如何检查类 T 是否有 foo 方法?

  • 14

是否可以C++写类似这样的东西:

template<class T>
void f(T a)  {
  if ( Существет метод a.foo ) {
    a.foo();
  } else {
    myfoo(a);
  }
}

那些。该函数的行为应根据类 T 是否具有方法而有所不同foo。

c++
  • 2 个回答
  • 10 Views
Martin Hope
Rosnowsky
Asked: 2020-09-22 09:01:13 +0000 UTC

PHP 安全问题。过滤传入数据

  • 14

最近我开始对创建的应用程序的安全性感兴趣,我对一些与 PHP 中的数据过滤和安全身份验证/授权相关的事情感兴趣。在谷歌中我发现了很多不同的信息,但还不足以得出结论。也许有人会告诉你或指引你走上正确的道路,可以这么说。

主要问题:

  • 我是否需要完全过滤所有输入数据,包括。全局数组$_SERVER, $_REQUEST, $_GET, $_POST, $_COOKIE, 即使它们没有输入到数据库中。我应该考虑哪些一般要点?
  • 是用filter_var(),filter_input()等等好还是用正则表达式好。或者什么时候使用一个而不是另一个更好。
  • 站点上的哪种授权方法可以被认为是安全的?
  • 使用PDO,我能不害怕一次绑定变量吗(我从来没有这样做过,只是想知道这样的行为有多安全)bindValue(':param', $_POST['value']);
  • 如果我有一个 HTML(wysiwyg) 编辑器,那么我需要在保存到数据库之前使用htmlspecialchars($var, ENT_QUOTES, 'UTF-8');和函数htmlspecialchars_decode($var, ENT_QUOTES);。

我现在有什么:

网站上的授权如下:用户输入登录名/密码。向服务器发出请求并尝试通过指定登录获取数据(ID、密码、唯一用户哈希)。如果有,则函数检查密码password_hash($password, PASSWORD_DEFAULT);,如果成功,则创建 cookie,并为用户创建一个新的哈希值:

$user_hash = md5( md5( time() + time() * rand(2, 10) ));
SessionModel::setCookie('_auth', md5($user_id), AUTH_TIMEOUT); SessionModel::setCookie('_token', $user_hash, AUTH_TIMEOUT);

到目前为止,我还没有弄清楚在哪里以及如何明智地使用这个哈希来确认用户的身份。很可能,这里没有安全的气味,这就是我寻求建议的原因。

数据过滤:

大约两周前,我完全切换到 OOP 并开始使用 PDO,在此之前我用它mysqli来连接,所以为了清除传入数据,我编写了自己的函数,例如:

function clear($var) {

    $link = mysqli_connect(HOST, USER, PASSWORD, DB) or die( mysqli_error($link));
    $var = strip_tags($var);
    $var = htmlspecialchars($var);
    $var = mysqli_real_escape_string($link, strip_tags($var));
    mysqli_close($link);

    return $var;
}

现在我根本不对传入数据使用过滤,除了 html 代码,为此我使用

$encoded = htmlspecialchars($var, ENT_QUOTES, 'UTF-8');

$decoded = htmlspecialchars_decode(htmlspecialchars_decode($var, ENT_QUOTES), ENT_QUOTES);

后者再次重复,因为出于某种原因它没有正常显示第一次解密的​​实体,我不知道为什么,但纯粹是偶然它以这种方式工作。我收到的其余数据是这样的:

$title = $_POST['title'];- 有时我用它trim()来删除空格 :))

总的来说,我知道我不太可能在这里收到每个问题的详细答案,但我会非常感激,即使是今天相关的文章,也有这些问题的答案或答案。学习PHP大概1.5-2年了,最简单的问题(或者不简单的)我都不知道答案。正如实践所示,在谷歌中很难找到这样的东西。

我很乐意提供一般性建议 :) 谢谢。

php
  • 4 个回答
  • 10 Views
Martin Hope
duhon
Asked: 2020-09-13 01:49:12 +0000 UTC

如何查看冲突文件

  • 14

问题:

  • 通过这样做,我git merge在 168 个文件上发生了冲突,我用常规程序修复了其中一半以上。但是您需要找出无法解决的问题。通常的命令git diff显示所有更改的文件,并不清楚还有什么需要更正。

你需要什么:

  • 找到一个很酷的命令,git它只会显示那些仍然需要更正的文件。

我尝试了什么:

  • git diff --name-status我认为未更正的文件应该有一个特殊的状态,但两个选项U都显示M
  • git status -sb只显示尚未在索引中的文件

例子:

  • git diff not-resolved.file显示这样的东西

    git diff
    diff --cc hello.rb
    index 0399cd5,59727f0..0000000
    --- a/hello.rb
    +++ b/hello.rb
    @@@ -1,7 -1,7 +1,11 @@@
      #! /usr/bin/env ruby
    
      def hello
    ++<<<<<<< HEAD
     +  puts 'hola world'
    ++=======
    +   puts 'hello mundo'
    ++>>>>>>> mundo
      end
    
      hello()
    
  • git diff resolved.file用特殊的棍子展示冲突是如何解决的

    $ git diff
    diff --cc hello.rb
    index 0399cd5,59727f0..0000000
    --- a/hello.rb
    +++ b/hello.rb
    @@@ -1,7 -1,7 +1,7 @@@
      #! /usr/bin/env ruby
    
      def hello
    -   puts 'hola world'
     -  puts 'hello mundo'
    ++  puts 'hola mundo'
      end
    
      hello()
    

反思:

  • 从示例中可以清楚地看出,git 确实看到了这些文件之间的区别,也就是说,它显然以某种方式标记了它们。
  • 也许任务通常是无法解决的,也许 git 只是查看缺少“++<<<<<<< HEAD”的输出,并考虑到他们和我们版本的状态,以不同的方式装饰输出
  • 如果 git 以某种方式标记固定文件,那么它将如何标记一个文件有 2 个冲突,一个是固定的,另一个不是
  • 从例子中可以清楚地看出

    • +意味着该行来自以前的版本并且仍然存在于文件中
    • -表示来自先前版本但不再存在于文件中的内容
    • ++表示该字符串仅存在于新文件中。
  • 悲伤但到目前为止最可靠的选择是grep -H -r "<<<<<<< HEAD" .

  • git不只是把冲突的开始和结束标记为“<<<<<<< HEAD”,也许没有这些标记就说明冲突可能已经解决了,不用grep也能发现
git
  • 3 个回答
  • 10 Views
Martin Hope
Sirop4ik
Asked: 2020-08-08 23:39:25 +0000 UTC

如何验证谷歌令牌并获取 refresh_token 以进行进一步的工作?

  • 14

在花了几天时间翻阅 Google 页面后,我明白这个问题很可能是针对最有经验的 Android 用户的,因为我找不到一行有效的代码。

您需要在应用程序中实现 Google 按钮。这篇官方文章中逐步描述了该过程,但一切都以用户可以从 Google 收到令牌这一事实结束......仅此而已......

没有更多关于如何处理它以及如何在服务器上检查它的消息......

从同样实现的web版本来看,认证成功后,返回给用户一个JSON文件,内容大致如下

{
"access_token" : "ya29.AHES6ZTtm7SuokEB-RGtbBty9IIlNiP9-eNMMQKtXdMP3sfjL1Fc",
"token_type" : "Bearer",
"expires_in" : 3600,
"refresh_token" : "1/HKSmLFXzqP0leUihZp2xUt3-5wkU7Gmu2Os_eBnzw74"
}

它拥有您需要的一切:类型、刷新、过期时间和令牌本身。

如果您需要在 Android 上获取此类数据,有两种选择:要么我不太了解它应该如何正确工作(因为库根本没有获取这些数据的方法),要么根本不可能(我相信更少)...

如果有人已经必须在他们的应用程序中使用 Google 登录,请告诉我们这应该如何工作?

更新 #1

如果有人盗取了token,我们如何保证用户数据的安全?

据我了解,令牌有expiry,并且在它结束时,令牌不再有效(也就是说,即使它被盗,它的有效期也不会超过指定的时间)并且下次请求服务器时,它需要更新。

而这里,为了不强制用户再次通过身份验证过程,就来救场了refresh_token。我们将它发送到 Google API,Google 看起来 - 看到这确实是它refresh token并向我们发送一个新的令牌作为响应,我们再次使用它转到服务器。

服务器看到它user确实是它声称的那个人 - 我们正在进一步工作......

我认为这是它应该如何工作?至少在网络上,它是这样工作的。

但问题是:我需要在客户端或服务器端获取令牌吗?谁应该更新它:服务器还是客户端?

更新 #2

于是,问题的本质归结为如何保证用户数据的安全?因为,据我所知,这是access_token, 和tokenId, 和refresh_token所需要的 - 所有这些都是为了安全和身份验证而发明的,将一个或另一个权限授予经过验证的用户。

据我了解,这个令牌附加到服务器的每个请求,并且服务器识别它是否是用户。

它应该如何工作?客户端是否应该将 Google 令牌附加到对服务器的所有请求?客户端是否应该在其生命周期结束时更新它?还是服务器做的?或者您是否需要生成自己的令牌并使用它?

java
  • 1 个回答
  • 10 Views
上一页
下一页

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5