给定两个不同的消息,A和B(可能是20-80个字符的文本,如果大小完全重要),A的MD5摘要与B的MD5摘要相同且 A的SHA1摘要的概率是多少?与B的SHA1摘要相同?那是:
(MD5(A) == MD5(B)) && (SHA1(A) == SHA1(B))
Run Code Online (Sandbox Code Playgroud)
假设没有恶意意图,即没有选择消息以找到冲突.我只是想知道这种情况发生的可能性.
我认为机会是"天文数字低",但我不确定如何验证这一点.
更多信息:可能消息池的大小受到限制,但是很大(几亿).生日悖论的情况正是我所担心的.
让我们暂时忽略Damian Conway对任何给定子程序不超过三个位置参数的最佳实践.
以下两个示例在性能或功能方面有什么区别吗?
使用shift:
sub do_something_fantastical {
my $foo = shift;
my $bar = shift;
my $baz = shift;
my $qux = shift;
my $quux = shift;
my $corge = shift;
}
Run Code Online (Sandbox Code Playgroud)
使用@_:
sub do_something_fantastical {
my ($foo, $bar, $baz, $qux, $quux, $corge) = @_;
}
Run Code Online (Sandbox Code Playgroud)
如果两个示例在性能和功能方面相同,那么人们对一种格式的看法是什么?显然,使用的示例@_是更少的代码行,但使用它是否更清晰,shift如另一个示例所示?欢迎有良好推理的意见.
如何说服Firefox(3.0.1,如果重要的话)在HTTPS请求中发送If-Modified-Since标头?如果请求使用普通HTTP并且我的服务器尽职地尊重它,它会发送标头.但是当我使用HTTPS从同一服务器请求相同的资源时(即,只需将URL中的http://更改为https://),Firefox根本不会发送If-Modified-Since标头.这种行为是SSL规范要求的吗?
下面是一些示例HTTP和HTTPS请求/响应对,使用Live HTTP Headers Firefox扩展来提取,但有一些粗体差异:
HTTP请求/响应:
http://myserver.com:30000/scripts/site.js GET /scripts/site.js HTTP/1.1 Host: myserver.com:30000 User-Agent: Mozilla/5.0 (...) Gecko/2008070206 Firefox/3.0.1 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-us,en;q=0.5 Accept-Encoding: gzip,deflate Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 Keep-Alive: 300 Connection: keep-alive If-Modified-Since: Tue, 19 Aug 2008 15:57:30 GMT If-None-Match: "a0501d1-300a-454d22526ae80"-gzip Cache-Control: max-age=0 HTTP/1.x 304 Not Modified Date: Tue, 19 Aug 2008 15:59:23 GMT Server: Apache/2.2.8 (Unix) mod_ssl/2.2.8 OpenSSL/0.9.8 Connection: Keep-Alive Keep-Alive: timeout=5, max=99 Etag: "a0501d1-300a-454d22526ae80"-gzip
HTTPS请求/响应:
https://myserver.com:30001/scripts/site.js GET /scripts/site.js HTTP/1.1 Host: myserver.com:30001 User-Agent: Mozilla/5.0 (...) Gecko/2008070206 Firefox/3.0.1 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-us,en;q=0.5 Accept-Encoding: …
我有一些在调试器外运行良好的Perl代码:
% perl somefile.pl
Run Code Online (Sandbox Code Playgroud)
但是当我在调试器中运行它时:
% perl -d somefile.pl
Run Code Online (Sandbox Code Playgroud)
它的表现不同.
有问题的文件(有几个)是大型Perl模块的测试套件的一部分(~20K代码行).测试在编译时进行了大量的设置工作并使用BEGIN块.这是一些最小的复制代码:
BEGIN
{
package MyEx;
sub new { bless {}, shift }
package main;
eval { die MyEx->new };
if($@)
{
die "Really die" unless($@->isa('MyEx'));
}
}
print "OK\n";
Run Code Online (Sandbox Code Playgroud)
如果你把它放入somefile.pl并运行它,它按预期打印"OK".如果你在调试器中运行它perl -d somefile.pl,它就会因为这个错误而死掉:
Can't call method "isa" without a package or object reference ...
Run Code Online (Sandbox Code Playgroud)
结果是$@代码在调试器下运行时不是对象.相反,它是一个包含此字符串的未标记的标量:
" at somefile.pl line 9
eval {...} called at somefile.pl line 9
main::BEGIN() called at somefile.pl line 16
eval {...} …Run Code Online (Sandbox Code Playgroud) 我在CPAN上遵循Rose :: DB :: Object教程并设置了三个包.
package My::DB::Object;
use My::DB;
use base qw(Rose::DB::Object);
sub init_db { My::DB->new }
package My::DB;
use base qw(Rose::DB);
...
package Motorcycle;
use base 'My::DB::Object';
__PACKAGE__->meta->setup
(
...
);
__PACKAGE__->meta->make_manager_class('motorcycles');
Run Code Online (Sandbox Code Playgroud)
在申请中:
package main;
use Motorcycle;
use Mojolicious::Lite;
Run Code Online (Sandbox Code Playgroud)
无法使用此错误进行编译:
My/DB/Object did not return a true value <eval 2> line 2…
Run Code Online (Sandbox Code Playgroud)
问候和感谢.
假设我有一堆基于Moose的类的代码库,我希望它们都使用一组通用的MooseX ::*扩展模块.但我不希望每个基于Moose的课程都必须像这样开始:
package My::Class;
use Moose;
use MooseX::Aliases;
use MooseX::HasDefaults::RO;
use MooseX::StrictConstructor;
...
Run Code Online (Sandbox Code Playgroud)
相反,我希望每个类都像这样开始:
package MyClass;
use My::Moose;
Run Code Online (Sandbox Code Playgroud)
并使它完全等同于上述.
我实现这一点的第一次尝试是基于Mason :: Moose使用的方法(来源):
package My::Moose;
use Moose;
use Moose::Exporter;
use MooseX::Aliases();
use MooseX::StrictConstructor();
use MooseX::HasDefaults::RO();
use Moose::Util::MetaRole;
Moose::Exporter->setup_import_methods(also => [ 'Moose' ]);
sub init_meta {
my $class = shift;
my %params = @_;
my $for_class = $params{for_class};
Moose->init_meta(@_);
MooseX::Aliases->init_meta(@_);
MooseX::StrictConstructor->init_meta(@_);
MooseX::HasDefaults::RO->init_meta(@_);
return $for_class->meta();
}
Run Code Online (Sandbox Code Playgroud)
但irc.perl.org上的#moose IRC频道的人们并不推荐这种方法,并且它并不总是有效,具体取决于MooseX::*模块的组合.例如,尝试使用My::Moose上面的类来做My::Class这样的:
package …Run Code Online (Sandbox Code Playgroud) 当它固定在字符串的前面时,为什么这个后置断言不起作用?运行以下代码,您将看到第一个测试通过,但第二个测试仅通过^锚点变化,但失败了.
use Test::More tests => 2;
my $s = '/123/456/hello';
$s =~ s{(?<=/)\d+(?=/\d+/hello)}{0}; # unanchored
is($s, '/0/456/hello', 'unanchored'); # passes
$s = '/123/456/hello';
$s =~ s{^(?<=/)\d+(?=/\d+/hello)}{0}; # anchored
is($s, '/0/456/hello', 'anchored'); # fails
Run Code Online (Sandbox Code Playgroud)
移入^后面的断言对我来说不是一个选项(这是一个非常简化的例子),但确实解决了这个问题.我找到了另一种方法来做我想要的,但我很好奇为什么这种方法不起作用.我在perl 5.8.8和perl 5.10.0上进行了测试.
我想知道是否可以在单个中执行多个SQL语句execute()或do()使用DBD::OraclePerl 调用DBI.例:
# Multiple SQL statements in a single query, separated by a ";"
$sql = 'UPDATE foo SET bar = 123; DELETE FROM foo WHERE baz = 456';
$sth = $dbh->prepare($sql);
$sth->execute;
# ...or...
$dbh->do($sql);
Run Code Online (Sandbox Code Playgroud)
我问这不是因为我想要真正做这样的事情,而是因为我想通过成功的SQL注入攻击来衡量可能造成的损害.是的,我知道,无论这个问题的答案是什么,SQL注入的可能性仍然必须在其根目录中使用绑定值和可信输入等来消除.但问题仍然存在:是否可以使DBD::Oracle执行多个声明?
作为相关示例,DBD::mysql有一个mysql_multi_statements显式启用此"功能" 的连接选项.我无法摆脱这样的感觉:有一些类似的,可能没有文档记录且模糊不清的Oracle OCI选项,可通过某种方式访问DBD::Oracle,从而实现同样的目的.
如果重要,这是:
perl 5.8.8DBD::Oracle 1.22