我的任务是为命令行软件开发内部网接口,现在我正在研究安全选项.我们的命令行应用程序已完成,但我还没有开始编写Web界面.我不确切知道潜在客户的安全要求是什么,尽管我认为ssh命令行界面通常是可以接受的.考虑到这一点,我正在寻求帮助开发一个选择菜单及其相关的优点/缺点.有一天,我们可能会考虑将我们的网络界面发布到互联网上,所以如果它很容易和/或免费,我愿意考虑比目前更必要的安全性.
我一直在做很多阅读,我的初步结论是,没有证书的SSL安全性是最好的方法,不是因为安全性较低是不可接受的,而是因为SSL是标准,因为它似乎并不困难.建立.我是一名安全非专家,不需要解释为什么安全非专家可以接受的安全性较低.如有必要,我可以在将来升级我的应用程序以使用证书.
这是一个与SSL相关的安全选择列表,按照我对安全级别的看法和我的评论进行排序.我需要什么级别的保护?
没有SSL.如果我们的客户不担心他们的员工看到/改变彼此的数据,这可能是可以接受的.他们的员工可能希望相互分享结果,我可以使用基于IP的访问控制和/或密码来保证安全.
没有证书的SSL.这会加密通信,至少可以防止未经授权的员工读取数据.使用密码,这ssh与命令行上的安全级别相同,对吧?我不需要担心内联网中的中间人攻击,对吗?如果有大量浏览器警告消息,则此方法的con.
使用自签名证书执行SSL.这给了我什么,没有证书给我?如果DNS可以被不适当地更改,那么客户那么我的应用程序是他们最不关心的问题.换句话说,如果DNS可以改变,那么我认为ssh也是脆弱的.
使用本地证书颁发机构执行SSL.OpenSSL允许我创建自己的证书颁发机构.这给了我一个自签名证书不是什么?我假设在局域网上,验证服务器不太重要.
使用外部证书颁发机构执行SSL.有没有理由去内联网这条路线?我在网上发现了一些"内联网证书" - 但目前尚不清楚他们提供的是我自己无法做到的.
作为参考,此页面可能对比较证书很有用:
http://httpd.apache.org/docs/trunk/ssl/ssl_faq.html#aboutcerts
[更新]
这里有一篇文章讨论了从一个公共CA获取内部证书的风险和规则
我确定这是有意的,所以有人可以解释这种行为的基本原理:
Python 2.7.2 (default, Oct 13 2011, 15:27:47)
[GCC 4.1.2 20080704 (Red Hat 4.1.2-44)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from os.path import isdir,expanduser
>>> isdir("~amosa/pdb")
False
>>> isdir(expanduser("~amosa/pdb"))
True
>>>
>>> from os import chdir
>>> chdir("~amosa/pdb")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
OSError: [Errno 2] No such file or directory: '~amosa/pdb'
>>> chdir(expanduser("~amosa/pdb"))
>>>
Run Code Online (Sandbox Code Playgroud)
这真的很烦人,因为毕竟,用户名中的路径可以明确地解决...我想编写可以处理用户可能给我的任何输入的代码,但这种行为要求我调用expanduser on我的代码必须处理的每条路径.这也意味着无论我打印出哪条路径供用户查看,它都会比他们给我的信息略显清晰.
这似乎与"鸭子打字"的概念不一致,其中我概括为我希望python不要向我抱怨,除非实际上有问题......
在Authorization intro页面上,Apache告诉我们:
Apache支持另一种身份验证方法:AuthType Digest.此方法由mod_auth_digest实现,并且更加安全.
在mod_auth_digest页面上,Apache告诉我们:
此模块实现HTTP摘要式身份验证(RFC2617),并提供mod_auth_basic的替代方法,其中密码不以明文形式传输.但是,与基本身份验证相比,这不会带来显着的安全优势.另一方面,与基本身份验证相比,使用摘要式身份验证的服务器上的密码存储安全性更低.
有人可以为我澄清这些看似矛盾的陈述吗?我知道处理密码的两种方式都容易受到重放攻击(除非你也使用SSL),但这似乎是一个单独的问题.
apache security authentication basic-authentication digest-authentication
我无法弄清楚如何在FTP 之间选择ftplib和urllib2下载文件.据我所知,他们的工作效果相当好,大多数建议似乎都假定其中一个或另一个没有列出优缺点.此外,还有其他库可供尝试.
我应该如何挑选?这不仅仅是找到有用的东西,我已经用两种不同的方式做到了.我想知道正确的选择是什么.我的基本思想是使用,ftplib因为它毕竟是一个ftp服务器...
在我的具体情况下,我在公共服务器上处理非常大的文件(几个gb).我想获得某种进度条.由于文件太大,所以拥有简历功能会很不错......但这些都是可选的 - 只是对那些使用我的代码的人很好.我不想使用已标记为已弃用的库.
我有类似于此的代码:
def memoryIntensiveFunction(x):
largeTempVariable = Intermediate(x)
processFunction(largeTempVariable,x)
Run Code Online (Sandbox Code Playgroud)
问题在于,temp在我的测试用例中,该变量类似于 500 mb,但该空间在memoryIntensiveFunction完成后不会返回给操作系统。我知道这是因为使用该guppy工具进行的内存分析说largeTempVariable已释放(即,在 Python 中),但psutil表明它不是。我想我看到了这里描述的效果。问题是这个过程运行时间很长(即几个小时),memoryIntensiveFunction在开始时运行并且永远不会再次运行,所以我不得不携带 500mb 几个小时很不方便。
我在这里和这里找到的一个解决方案建议使用单独的过程。多处理会产生自己的成本,但就我而言,这是值得的。但是,这需要重构memoryIntensiveFunction调用者以接收x返回值,而不是看到它就地修改。真正的杀手是我的对象x不可选择(它大量使用了 boost python 扩展)。使可x腌制的工作量很大。
有没有我没有考虑的选项?
为什么这不起作用:
#include <regex>
int main() {
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编译为:
clang++ -std=c++11 -stdlib=libstdc++ temp.cpp
temp.cpp:1:10: fatal error: 'regex' file not found
#include <regex>
^
1 error generated.
clang++ --version
Apple LLVM version 7.0.0 (clang-700.1.76)
Target: x86_64-apple-darwin14.5.0
Thread model: posix
Run Code Online (Sandbox Code Playgroud)
如果我能够stdlib成为libc++然后再编译.正则表达式c++11,但clang本身似乎没有问题-std=c++11 -stdlib=libstdc++.至少在我的机器上,它看起来像我可以使用的东西/usr/include/regex.h,但这不是标准的,除了我想使用的正则表达式以外的东西(例如std :: to_string).
这已经想出的原因是因为我想链接到第三方库(对此我没有源),这是符合作为std::string,而不是std::__1::basic_string,但我代码使用std::regex和std::to_string.我不确定是否要引入对boost的依赖.
有什么方法可以记录Java的本机内存使用情况,即直接记录本机内存还是该进程使用的总内存(例如,询问操作系统)?
我想在幕后的用户计算机上运行此程序,因此NativeMemoryTracking命令行工具并不是真正吸引人的选项。我已经记录了空闲/最大/总堆大小。
背景:我的软件的用户报告了一个异常(如下),我不知道为什么。我的程序确实使用了SWIG的本机代码,但是它是一个简单的API,我认为它没有内存泄漏,并且不在堆栈跟踪中(或在错误发生之前立即运行)。我的日志表明发生错误时有足够的堆空间可用。所以我真的很茫然如何跟踪它。
java.lang.OutOfMemoryError: null
at java.io.RandomAccessFile.writeBytes0(Native Method) ~[na:1.7.0_45]
at java.io.RandomAccessFile.writeBytes(Unknown Source) ~[na:1.7.0_45]
at java.io.RandomAccessFile.write(Unknown Source) ~[na:1.7.0_45]
Run Code Online (Sandbox Code Playgroud)
在Webstart上的Windows(7或10)(?)上发生了错误,并配置了以下参数:
<java href="http://java.sun.com/products/autodl/j2se" initial-heap-size="768m" java-vm-args="" max-heap-size="900m" version="1.7+"/>
Run Code Online (Sandbox Code Playgroud) 我正努力为用户提供尽可能简单的生活,同时为他们提供完全的灵活性.我需要编写函数供他们使用,但诀窍是用户需要在运行之前选择函数.这就是我想做的事情:
def standardGenerator(obj,param=8.0):
# algorithm which generates stuff based on obj and param
return stuff
opts.usersChoice = standardGenerator
Run Code Online (Sandbox Code Playgroud)
在这个例子中,opts是一个选项容器,提供给用户设置他们想要的任何选项.当他们完成所有选项后,他们会opts回复给我.
现在的问题是,只有在我手中obj之后才能知道opts,但也许用户想要params=4.0而不是我的默认值.我的问题是允许用户设置的最简单方法是什么param?
这是我想到的想法:
def standardGenerator4(obj):
return standardGenerator(obj,param=4.0)
opts.usersChoice = standardGenerator4
opts.usersChoice = lambda obj: standardGenerator(obj,4.0)
Run Code Online (Sandbox Code Playgroud)
可能lambda是最好的主意,但我想知道是否有其他方法可以做到这一点,而不要求用户知道什么是lambda函数...
我在Qt 4.8.4中使用QTableView可视化大量数据(大量/多种蛋白质氨基酸序列),我希望能够使细胞尽可能小,这样我就能尽可能多地包装细胞.给定窗口.我遇到的问题是,当同时显示许多单元格时,所有内容(例如滚动,调整大小和一般重新绘制)都会减慢到爬行速度.这是一些示例代码(改编自examples/tutorials/1_readonly教程):
MyModel::MyModel(QObject *parent):QAbstractTableModel(parent){}
int MyModel::rowCount(const QModelIndex & /*parent*/) const {
return 200;
}
int MyModel::columnCount(const QModelIndex & /*parent*/) const {
return 60;
}
QVariant MyModel::data(const QModelIndex &index, int role) const {
if (role == Qt::DisplayRole){
return QString("%1").arg(index.row()%10);
}
return QVariant();
}
Run Code Online (Sandbox Code Playgroud)
这是运行表视图的代码:
int main(int argc, char *argv[]){
QApplication a(argc, argv);
QTableView tableView;
tableView.horizontalHeader()->setDefaultSectionSize(15);
tableView.verticalHeader()->setDefaultSectionSize(15);
tableView.setFont(QFont("Courier",12));
MyModel myModel(0);
tableView.setModel( &myModel );
tableView.setGeometry(0,0,1000,1000);
tableView.show();
return a.exec();
}
Run Code Online (Sandbox Code Playgroud)
当我在OSX上使用Instruments上下滚动时,它QWidgetPrivate::drawWidget在堆栈中花费了大量时间,QWidgetPrivate::paintSiblingsRecursive...即,它花费了大量时间重绘我的表.
我是Qt的新手,所以我不确定如何解决这个问题.我是不是该:
这两个选项似乎都是通过切换QTableView来弥补地面损失的大量工作.还有其他建议吗?
我一直在让Eclipse构建一些Ant脚本时遇到问题(有些构建得很好,有些则没有)。基本上,在Eclipse Mars.1 Release(4.5.1)控制台中没有任何输出。build.xml在命令行上运行ant时,我的工作正常。我可以workspace/.metadata/.log在以下错误消息所在的位置找到一些输出:
!ENTRY org.eclipse.ant.launching 4 120 2016-03-03 09:58:38.197
!MESSAGE Error logged from Ant UI:
!STACK 0
java.net.SocketTimeoutException: Accept timed out
at java.net.PlainSocketImpl.socketAccept(Native Method)
at java.net.AbstractPlainSocketImpl.accept(AbstractPlainSocketImpl.java:409)
at java.net.ServerSocket.implAccept(ServerSocket.java:545)
at java.net.ServerSocket.accept(ServerSocket.java:513)
at org.eclipse.ant.internal.launching.launchConfigurations.RemoteAntBuildListener$ServerConnection.run(RemoteAntBuildListener.java:89)
Run Code Online (Sandbox Code Playgroud)
其他人在Stackoverflow上询问了哪些内容。
我注意到的另一个奇怪的事情是,在控制台上方有一行文本java,显示了java所使用的版本,并且工作脚本与不工作脚本不同。使用有效的蚂蚁生成脚本,jdk1.7.0_79而使用失败的使用已/System安装的1.6。
我正在尝试建立一个涉及外部工具的构建,它生成一个目录作为输出(doxyindexer对于好奇的).到目前为止,我基本上得到了这些命令:
target = "doxysearch.db/iamchert"
doxygen.Doxyindexer(target,["project1.xml","project2.xml","project3.xml"])
Default([target])
Default(Install(ARGUMENTS["cgibin"],"doxysearch.db"))
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是我认为我想target成为目录本身,而不是目录中的一些随机文件.我没有什么可以全球化的,因为在我构建它之前目标不存在而且我不想假设任何Dimitri可能会改变!当我使用目录作为目标时,我收到此错误:
TypeError: Tried to lookup Dir 'doxysearch.db' as a File.:
Run Code Online (Sandbox Code Playgroud)
这就是我选择iamchert成为目标的原因.这些线条似乎都按预期工作,即使我的方法是黑客.但是,我无法让最后一行工作.我需要将目录复制doxysearch.db到cgi-bin目录中,该目录由用户在命令行中指定.也许有人可以解释如何正确地完成这一步骤?对于scons来说,我是个新人!
我在搜索答案时遇到了麻烦,因为所涉及的所有搜索词都太常见了,无法找到我特别的帮助!
psycopg2我今天第一次玩,我试图了解密码是如何工作的......我有一个测试脚本,它删除一个表,重新创建表,添加一行,然后打印该行。我的问题是,为什么connect无论我是否提供正确的密码,该命令都会起作用?例如这一行:
conn = psycopg2.connect(database="mydb",host="localhost",port=5432,user="amos",
password="asdf")
Run Code Online (Sandbox Code Playgroud)
和这一行:
conn = psycopg2.connect(database="mydb",host="localhost",port=5432,user="amos",
password="asdf123")
Run Code Online (Sandbox Code Playgroud)
意外地做了同样的事情,并且脚本的其余部分完成且没有错误。显然,无论密码实际是什么,只有其中一行应该起作用。正如预期的那样,如果我尝试 a ,我确实会收到错误user="amos123",因为该用户不存在。如果重要的话,我的 PostgreSQL 安装了Postgres.app.