小编The*_*oon的帖子

REST Web服务身份验证令牌实现

我正在使用C#实现REST Web服务,该服务将作为云服务托管在Azure上.由于它是REST服务,因此它是无状态的,因此没有cookie或会话状态.

只能通过HTTPS(StartSSL.com提供的证书)访问Web服务.

用户成功登录服务后,将获得安全令牌.此令牌将在将来的通信中提供身份验证.

令牌将包含客户端的时间戳,用户ID和IP地址.

所有通信都只通过HTTPS进行,因此我不担心在重放攻击中被拦截和使用的令牌; 无论如何,令牌将有一个到期日.

由于这是面向公众的服务,我担心有人可以注册服务,登录然后修改他们收到的令牌以访问其他用户的帐户.

我想知道如何最好地保护令牌的内容并验证它没有被篡改.

我计划执行以下操作来保护令牌:

客户端成功登录服务,服务执行:

  1. 生成随机值并使用SHA256哈希值1000次.
  2. 从私钥+散列随机值生成一次性会话密钥.
  3. 使用SHA256对会话密钥进行1000次散列,然后使用它来加密令牌
  4. 使用私钥使用RSA对加密令牌进行签名.
  5. 将加密的令牌+签名+散列随机值发送到未加密的JSON包中的客户端.

当客户端调用服务时,它会将未加密的JSON包中的加​​密令牌和签名发送到服务.服务会

  1. 从私钥+散列随机值重新创建会话密钥
  2. 使用私钥验证签名
  3. 使用散列会话密钥解密令牌
  4. 检查令牌是否已过期
  5. 继续请求的操作......

我对加密一无所知,所以我有一些问题:

  1. 这是足够的还是过度杀伤?
  2. 我读到这是为了检测篡改我应该包含带有令牌的HMAC.由于我使用私钥签名,我还需要HMAC吗?
  3. 我应该使用Rijndael而不是RSA吗?
  4. 如果Rijndael是首选,那么生成的IV是否需要解密?即我可以扔掉它还是我需要发送加密令牌?例如,加密令牌+ HMAC + IV +散列随机值.

由于所有通信都通过HTTPS进行,因此未加密的JSON包在到达客户端之前并不真正未加密.

此外,我可能希望稍后在PHP中重新实现该服务,所以这一切都需要在PHP中可行.

谢谢你的帮助

security authentication rest token

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

Delphi XE2 Dataset字段类型TStringField不支持Unicode吗?

我一直在查看TDataset类及其字符串字段,在Delphi XE2中注意到AsWideString返回一种类型的UnicodeString.但是它从函数TField.AsString:String中获取值,而后者又调用TFIeld.AsAnsiString:AnsiString.因此任何unicode字符都会丢失?传递给TDataset.GetFieldData的缓冲区也被声明为AnsiChar数组.

我理解正确吗?

delphi unicode tdataset delphi-xe delphi-xe2

13
推荐指数
2
解决办法
3859
查看次数

使用IIS在Delphi 2009中创建REST Web服务

是否可以在IIS上运行的Delphi 2009中创建REST Web服务?我查看了Web代理和Web快照Web服务器应用程序,但到目前为止还无法弄明白.如果有可能我怎么去开始工作?

delphi iis rest web-services

9
推荐指数
1
解决办法
6038
查看次数

webshot不会在html中呈现本地图像

我正在使用node-webshot和phantomjs-cli将html字符串渲染为png图像.html包含图像标记.当src属性指向本地文件且未引发错误时,不会呈现图像.但是,当src指向http位置时,它会渲染图像.我已经尝试了所有我能想到的不同文件路径组合,例如

<img src=images/mushrooms.png"/>
<img src=images//mushrooms.png"/> 
<img src=c:\images\mushrooms.png"/>
<img src=c:\\images\\mushrooms.png"/>
<img src=file://c:\\images\\mushrooms.png"/>
<img src=file://images//mushrooms.png"/>
etc..
Run Code Online (Sandbox Code Playgroud)

但到目前为止还没有运气.有趣的是,它在我的同事的机器上工作正常,这台机器是Mac但不在我的机器上是Windows,我尝试使用两台不同的Windows机器但没有成功.

以下是一些关注该问题的简化代码:

'use strict'

const webshot = require('webshot');

console.log('generating');

webshot('<html><head></head><body><img src="c:\\images\\mushrooms.png"/></body></html>', 'output.png', {siteType: 'html'}, function(err) {
    console.log(err);
});

/*
webshot('<html><head></head><body><img src="https://s10.postimg.org/pr6zy8249/mushrooms.png"/></body></html>', 'output.png', {siteType: 'html'}, function(err) {  
    console.log(err);      
});
*/
Run Code Online (Sandbox Code Playgroud)

注释掉的代码块是一个使用Web链接作为图像源的示例,但我需要它来处理本地路径.

有没有人知道如何解决这个问题?

谢谢

html javascript node.js phantomjs

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

Delphi XE2将Application.MainForm.Handle分配给DLL中的Application.Handle

我有一个小问题,从DLL内部创建的表单.

基本上会发生什么,当一个表格(Form1)显示(我认为它必须保持在顶部),你打开另一个形式(Form2),它是主要应用程序的一部分(即不住在DLL内) .如果将光标放在Form2上的控件上以便显示提示,则Form2将立即在Form1后面.

仅当MainFormOnTaskBar为true时才会发生这种情况.目前我们将主应用程序的Application.Handle传递给DLL并将其分配给DLL的Application.Handle.

我设法解决了这个问题,而是将Application.MainForm.Handle传递给DLL,并将其分配给DLL中的Application.Handle.

这样安全吗?有谁知道解决这个问题的正确方法?

windows delphi dll delphi-xe2

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

C#中的接口委派

在Delphi中,我们可以将接口的实现委托给另一个类,我想知道这在C#中是否可行?

例如,我有接口IMyInterface,我说TMyClass实现了IMyInterface.但事实上并非如此.在内部,我可以使用implements关键字将接口实现委托给另一个类,而无需在TMyClass中声明每个方法.

c# delphi interface

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

Delphi Web Script(DWScript)将脚本方法链接到外部控件事件

我想知道DWScript是否支持使用脚本方法作为Delphi表单上的控件的事件处理程序.例如,我想将TButton OnClick事件链接到脚本中存在的方法.

我可以通过调用GetProcMethod来返回一个TMethod对象,使用RemObjects Delphi脚本引擎.然后,我使用SetMethodProp将脚本方法分配给按钮的OnClick事件.

procedure LinkMethod(SourceMethodName: String; Instance: TObject; ScriptMethodName: String);
var
  ScriptMethod: TMethod;
begin
  ScriptMethod := ScriptEngine.GetProcMethod(ScripMethodName);

  SetMethodProp(Instance, SourceMethodName, ScriptMethod);
end;
Run Code Online (Sandbox Code Playgroud)

我想在DWScript而不是Rem对象脚本引擎中这样做,因为它做了我需要的其他一些东西.

delphi events dwscript

5
推荐指数
1
解决办法
1033
查看次数

使用 SqlBuilder 在 FROM 子句中注入 SQL

我们有一个 SQL 语句,它SqlBuilder在 from 子句中使用set the table name。数据库是 SQL Server 2008 及更高版本。

var sqlBuilder = new SqlBuilder();

sqlBuilder.Select("*").From(tableName);
sqlBuilder.Where("...");

Connection.BuilderQuery<dynamic>(sqlBulder).Select(Map);
Run Code Online (Sandbox Code Playgroud)

我想知道这是否是 SQL 注入风险?我怎样才能减轻这种风险?还是SqlBuilder管这些东西?

我可以通过将表名括在方括号中来降低风险吗?例如

sqlBuilder.From("[" + tableName + "]");
Run Code Online (Sandbox Code Playgroud)

此外,如果有人可以在FROM子句中提供一些 SQL 注入攻击的示例,我将不胜感激,以便我可以了解它的工作原理并创建测试。

c# sql sql-server sql-injection

5
推荐指数
1
解决办法
993
查看次数

Web Api C# - Task.Factory.startnew vs async

我正在我的端点中进行日志记录,将日志发送到单独的服务.我不希望将日志发送到服务以影响客户端正在使用的服务的开销,我不关心日志是否有时无法实现.因此,我一直在阅读关于如何简单的火和忘记的博客.我认为CPU密集型任务不应该使用异步但我不知道IO相关任务是如何有所不同的,IO我的意思是调用另一个服务的端点,在这种情况下是为了记录.

此外,我似乎得到了相互矛盾的观点.一些博客说你永远不应该运行任何异步,因为这只需要从线程池中获取一个或多个线程,因此它与同步它没有什么不同.

微软在.Net 4.5中引入了async和await关键字,他们说你应该将它们用于整个端点但是这仍然不会使用线程池中的一个或多个线程吗?最后我读过的一些stackoverflow帖子说使用Task.Factory.StartNew是好的,因为.Net会管理它.

有人可以澄清上面的最佳做法,将日志发送到另一个服务,因为我很困惑.

我正在考虑使用nlog,因为它的批处理和异步功能,但我不确定这是否是最好的方法.我不能使用像Hangfire这样的东西,因为我没有sql后端.

提前致谢.

c# logging asynchronous asp.net-web-api

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

Delphi应用程序主表单暂时轻弹到前面

我们有一个Delphi 2007应用程序,并且最近启用了MainFormOnTaskBar以更好地支持Windows Aero.但是,因为单击时主窗体不会出现在所有子窗体的顶部,所以我们添加了以下代码.

procedure TBaseForm.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);

  Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW;
  Params.WndParent := 0; 
end;
Run Code Online (Sandbox Code Playgroud)

这样做的一个副作用是当在不处理该特定热键的子表单上按下Alt+ key热键时,主表单向前轻弹然后再向后.如果处理热键,则不会发生此行为,可能是因为吞下了热键.

有没有其他人经历过这种行为,可以建议一个解决方法.

谢谢

delphi user-interface hotkeys aero

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