我们有一个包含敏感信息的应用程序,我正在努力保护它.敏感信息包括:
我一直在研究混淆代码,但它似乎没什么帮助,因为我仍然可以反编译它.但是,我最关心的是,当您对代码进行反编译时,用于加密序列号等的密钥清晰可见,即使它是混淆的.
任何人都可以建议我如何保护这些字符串?
我意识到其中一种方法可能是从应用程序本身删除任何解密,虽然这可能部分可能,有一些功能必须使用加密/解密 - 主要是为了保存配置文件和传递'授权'令牌到DLL执行计算.
我意识到这是一个常见的问题,之前已在SO 上进行了讨论,但我想我会再次提出这个问题,希望找到一些可行的替代方案.
采用以下SQL,它将分页与动态排序相结合:
WITH CTE AS (
SELECT
OrderID,
ROW_NUMBER() OVER (ORDER BY
CASE WHEN @SortCol='OrderID' THEN OrderID END ASC,
CASE WHEN @SortCol='CustomerName' THEN Surname END ASC
) AS ROW_ID
FROM Orders WHERE X
)
SELECT Orders.* FROM CTE
INNER JOIN Orders ON CTE.OrderID = Orders.OrderID
WHERE ROW_ID BETWEEN @RowStart AND @RowStart + @RowCount -1;
Run Code Online (Sandbox Code Playgroud)
众所周知,ROW_NUMBER()方法在大型表上不能很好地工作,因为在ORDER BY子句中使用多个CASE语句时,无法正确使用表上的索引(请参阅链接).
我们多年来一直使用的解决方案是构造一个字符串,然后使用sp_executesql执行该字符串.使用这样的动态SQL时性能很好,但从易读性的角度来看,生成的代码很糟糕.
我听说过ROWCOUNT方法,但据我所知,当你按元素引入动态顺序时,它仍然容易受到同样的问题的影响.
那么,冒着问不可能的风险,还有其他选择吗?
编辑
为了在这里取得一些有用的进展,我已经汇总了三个查询,突出了各种建议的方法:
当前的动态SQL解决方案(执行时间147ms)
gbn解决方案(执行时间1687ms)
Anders解决方案(执行时间1604ms)
Muhmud解决方案(执行时间46ms)
我们有一段时间以来一直遇到数据存储在SQL数据库中的问题.
有时记录的保存数据与行的其余部分不匹配,使得它似乎在某些时候,在传递给数据库之前,数据被"交换"为其他东西,也许是另一个用户的数据.
我们确实使用TransactionScopes和ReadCommitted的隔离级别,这使我认为数据完整性问题在应用程序而不是数据库级别.
我们广泛使用会话,并且我们开始认为损坏数据的时间与我们在白天部署系统更新的时间相似.
我们确实使用aspnet_state服务来通过应用程序重新启动来持久化会话.
我们的用户依赖于终端会话,因此多个用户都登录到同一服务器并通过浏览器启动系统.
我们过去曾注意到用户使用相同的域凭据登录,但我们现在相对确信用户现在使用唯一帐户登录.
99.9%的数据是正确的,但我们一直在努力了解可能导致这种间歇性数据完整性问题的原因.
我们现在将我们的部署限制在工作时间以外的死亡之痛,但这并非总是可行的.
任何人都可以阐明为什么/如何发生这种情况?
编辑:我们现在已将此隔离到DAL层,请参阅SQL查询在多用户环境中返回不正确的值
我们正在尝试使用SOAP请求使用Visual Studio C#与预订API进行交互.
我们已经与另一个API的Web服务连接而没有问题,但这个问题证明是有问题的.
我们已将其添加为服务引用,并且Visual Studio已为其生成所有类和web.config条目,以便一切看起来都很好.
但是,当我们尝试向客户端SOAP服务发出简单请求时,我们会收到以下错误:
rpc\literal SOAP不支持Namespace ='com.hrs.soap.hrs'.包装元素必须是不合格的.
代码是:
PingRequest pingrequest = new PingRequest();
SoapServiceClient service = new SoapServiceClient();
service.ping(pingrequest);
Run Code Online (Sandbox Code Playgroud)
这是Web.config文件中添加的内容:
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="HRSSoapServiceBinding" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
useDefaultWebProxy="true">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<security mode="None">
<transport clientCredentialType="None" proxyCredentialType="None"
realm="" />
<message clientCredentialType="UserName" algorithmSuite="Default" />
</security>
</binding>
</basicHttpBinding>
</bindings>
<client>
<endpoint address="..."
binding="basicHttpBinding" bindingConfiguration="HRSSoapServiceBinding"
contract="HRSService.HRSSoapService" name="HRSSoapServicePort" />
</client>
</system.serviceModel>
Run Code Online (Sandbox Code Playgroud)
根据文档,请求应如下所示:
<complexType name="PingRequest">
<complexContent>
<extension base="tns:Request"> …Run Code Online (Sandbox Code Playgroud) 我意识到这是一个讨论很多的话题,但我看到的所有建议似乎都涉及直接访问SQL Server,在我们的实例中并不理想.
我们的场景是一个远程SQL Server数据库(例如)100个表.我们正在开发一个轻量级桌面应用程序,它将使用SQL Server Compact数据库并定期与远程服务器同步(例如)20个表的子集.
我想控制复制的发生方式,因为速度是我们的主要问题,因为远程服务器距离数千英里远.
此外,我不需要同步每个表中的所有记录 - 只有与每个用户相关的记录.
我非常喜欢SQL Merge工具,但它要求客户端连接到远程SQL Server.目前这是不可能的,我们正在考虑通过我们的应用程序或其他方法访问的Web服务与远程服务器连接.
欢迎任何建议.
UPDATE
只是为了澄清,互联网连接是间歇性的,这是我们需要同步这两个数据库的主要原因.
我在Visual Studio中遇到了一个奇怪的问题.今天决定在aspx文件中为我的代码添加绿色摇摆下划线:

我试图删除我今天写的一些代码,希望能找到绊倒IDE但我无法解决的问题.
一切都编译好,运行良好.当我将鼠标悬停在任何下划线上时,我收到以下消息"此名称包含大写字符,这是不允许的".
我在所有内容页面上都有这个.
有没有人见过这个或者可以建议如何解决可能出错的问题?
顺便说一句,代码通过了W3C验证
我理解这个问题背后的原理,但是让我头疼的是认为这在整个应用程序中都会发生,我需要找到解决方案.
double Value = 141.1;
double Discount = 25.0;
double disc = Value * Discount / 100; // disc = 35.275
Value -= disc; // Value = 105.824999999999999
Value = Functions.Round(Value, 2); // Value = 105.82
Run Code Online (Sandbox Code Playgroud)
我用双打代表很小的数字.不知何故,在计算141.1-35.275中,结果的二进制表示给出了一个仅为0.0000000000001的数字.不幸的是,由于我正在舍入这个数字,这给出了错误的答案.
我已经阅读过使用Decimals而不是Doubles,但我不能用Decimal替换Double的每个实例.有没有更简单的方法来解决这个问题?
我在我的应用程序中使用jQuery Impromptu提示,它们非常有用.
但是,要调用Impromptu提示,您需要指定按钮名称及其返回值,如下所示:
$.prompt('Example 2',{ buttons: { Ok: true, Cancel: false } });
Run Code Online (Sandbox Code Playgroud)
我真的想拥有动态按钮名称,如下所示:
function showprompt(question, button1, button2) {
$.prompt(question,{ buttons: { button1: true, button2: false } });
}
Run Code Online (Sandbox Code Playgroud)
但这似乎不起作用,按钮只是被称为'button1'和'button2'!
我已经尝试使用eval(button1)和''+button1,但他们带来了语法错误.
有什么建议?
我们在.NET 4.0中有许多Web应用程序(使用Visual Studio 2010编写),这些应用程序已预编译并部署到生产服务器上.
目前,当我们进行更新时,我们用更新的二进制文件替换所有现有文件.这会更新应用程序,但它也会重新启动应用程序,因此所有用户都必须重新登录.
部署的二进制文件基本上由我的解决方案中的每个项目的单个.dll组成.
有没有办法在不中断任何现有用户的情况下更新Web应用程序?
我意识到实现这一目标的一种方法是部署源文件并让它们由动态网络服务器进行编译,但这对我们来说并不是一个可行的选择.
我必须将日期字符串转换为DateTime对象,如下所示
tmpdate = "27-Apr 14:53";
TheDate = DateTime.ParseExact(tmpdate, "DD-MMM HH:mm", CultureInfo.InvariantCulture);
Run Code Online (Sandbox Code Playgroud)
我不断得到关于字符串不是有效日期时间的例外情况.我已经尝试在今年加入,但没有运气.有什么建议?
c# ×6
sql-server ×2
web-services ×2
.net ×1
datetime ×1
deployment ×1
division ×1
dll ×1
iis-7 ×1
impromptu ×1
javascript ×1
jquery ×1
math ×1
obfuscation ×1
session ×1
soap ×1
sql ×1
terminal ×1
windows ×1