我的第一个猜测是PHP DOM类(使用formatOutput参数).但是,我无法正确地格式化和输出这个HTML块.如您所见,缩进和对齐不正确.
$html = '
<html>
<body>
<div>
<div>
<div>
<p>My Last paragraph</p>
<div>
This is another text block and some other stuff.<br><br>
Again we will start a new paragraph
and some other stuff
<br>
</div>
</div>
<div>
<div>
<h1>Another Title</h1>
</div>
<p>Some text again <b>for sure</b></p>
</div>
</div>
<div>
<pre><code>
<span><html></span>
<span><head></span>
<span><title></span>
Page Title
<span></title></span>
<span></head></span>
<span></html></span>
</code></pre>
</div>
</div>
</body>
</html>';
header('Content-Type: text/plain');
libxml_use_internal_errors(TRUE);
$dom = new DOMDocument;
$dom->preserveWhiteSpace = false;
$dom->formatOutput = …Run Code Online (Sandbox Code Playgroud) 我想知道如何在用户帐户之间找到有趣的关系,例如最多连接或最有价值的用户,这些用户基于他们与他人的连接.
下面我有我使用的两个表.一个拥有所有用户,另一个拥有他们关注的用户的密钥.
User
{
id,
name
}
Follows {
user_id -> user.id,
following_id -> user.id
}
Run Code Online (Sandbox Code Playgroud)
我在寻找什么类型的算法?
假设不重要的人很少或没有粉丝,我怎样才能找到图中心的人?我认为他们会很重要,因为他们有重要的人跟随他们.
正如大卫和史蒂夫指出的那样,给定节点的接近程度,子社区形成的节点以及连接最多的用户都是可以从此模式中提取的有用数据的示例.
由于现在许多站点都使用了这种"跟随者"设计,因此我希望获得一些可能对各种各样的人有用的可靠的SQL或编程语言实现.
值得注意的是,虽然某些算法的结果令人着迷,但其他算法(例如查找相关节点)对我们网站的用户来说是值得的,因为我们可以向他们推荐.
我试图弄清楚如何从文本节点的范围中获取父级的名称.
//text()[name(parent)='p']
Run Code Online (Sandbox Code Playgroud)
如何获取当前节点的父节点的名称?
浏览器url默认将unicode字符编码为%##.
但是,我可以通过CURL发出请求,http://localhost:8080/?而nginx将路径视为" ?".这怎么可能?Nginx是否允许在其路径中使用任意unicode?
例如,使用此配置,我可以设置一个额外的标头,以查看nginx看到了什么:
location ~* "(*UTF8)([^\w/\.\-\\% ])" {
add_header "response" $1;
return 200;
}
Run Code Online (Sandbox Code Playgroud)
请求:
* Connected to localhost (127.0.0.1) port 8080 (#0)
> GET /? HTTP/1.1
> User-Agent: curl/7.30.0
> Host: localhost:8080
> Accept: */*
>
< HTTP/1.1 200 OK
* Server nginx/1.4.6 (Ubuntu) is not blacklisted
< Server: nginx/1.4.6 (Ubuntu)
< Date: Tue, 20 Jan 2015 21:44:51 GMT
< Content-Type: application/octet-stream
< Content-Length: 0
< Connection: keep-alive
< response: ? <--- SEE THIS?
< …Run Code Online (Sandbox Code Playgroud) 我从来没有真正感谢ORM,所以我认为解决这个问题的唯一方法就是自己建立一个基本的,这样我就可以看到所有的喧哗声.因此,考虑到这一点,我需要包括哪些基本功能来制作半可用的ORM?
据我所知,对于最终程序员来说,它基本上需要像这样工作:
/*
* Create a user
*/
$user = new User();
$user->name = 'Joe';
$user->email = 'joe@aol.com';
$user->save();
unset($user);
/*
* Create a game
*/
$game = new Game();
$game->name = 'soccer';
$game->save();
/*
* Set all users as players
*/
$users = ORM::factory('users');
$users = $users->findAll();
foreach ( $users as $user ) {
$user->setGame($game);
$user->save();
}
unset($users);
/*
* Get all games and show all users
*/
$games = ORM::factory('games')->findAll();
foreach( $games as $game ) {
print $game->name; …Run Code Online (Sandbox Code Playgroud) 我听说--prefix=PREFIX在Linux上编译PHP时设置选项将允许您一次安装多个PHP而不会发生冲突.(我认为如果未设置则默认为/usr/local).但是,我不确定它究竟是做什么或者使用的好设置是什么.此外,我还听说将其设置为默认值以外的其他内容可能会使某些PHP扩展更难以安装.
./configure --prefix=PREFIX ...
Run Code Online (Sandbox Code Playgroud)
我刚刚意识到其他一些选项--exec-prefix可能仍然需要设置,/usr/local因为它们默认为值--prefix.如果将前缀设置为类似web/phpalt因为--sbindir设置为``--exec-prefix +/sbin`之类的东西,这会导致问题.
Directory and file names:
--prefix=PREFIX install architecture-independent files in PREFIX
[/usr/local]
--exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
[same as prefix]
--bindir=DIR user executables in DIR [EPREFIX/bin]
--sbindir=DIR system admin executables in DIR [EPREFIX/sbin]
--libexecdir=DIR program executables in DIR [EPREFIX/libexec]
--datadir=DIR read-only architecture-independent data in DIR
[PREFIX/share]
--sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc]
--sharedstatedir=DIR modifiable architecture-independent data in DIR …Run Code Online (Sandbox Code Playgroud) 官方RFC文档声明我们可以在域的"本地"部分使用大写和小写字母(以及许多其他疯狂的东西).
然而,现实世界中常见的东西 - 以及规范所说的是两个不同的东西.! # $ % & ' * / = ? ^ { | } ~在来自大型提供商(如yahoo,google或hotmail)的电子邮件中,不允许使用这些额外字符().此外,非常非常罕见地看到包含大写字母的电子邮件(JohnDoe@example.com).
我今天给自己发了几封电子邮件,使用不同的大写和小写组合,发现我的电子邮件服务器都将它们视为同一帐户而忽略了字母大小写不同的事实.换句话说,JohnDoe@example.com = johndoe@example.com到我的电子邮件服务器(包括我的免费电子邮件帐户).
我应该按照世界选择的格式采取行动 - 并标准化/小写所有ANSII电子邮件吗?或者我应该允许用户注册多个帐户,如JohnDoe @ example.com,johndoe @ example.com和JOHNdoe@example.com?
CouchDB在允许将对象/行插入数据库之前提供验证.这确保了如果你有一个面向公众的沙发应用程序,你的数据库将不会被任何人填充垃圾.
User <-> CouchDB
Run Code Online (Sandbox Code Playgroud)
但是,我想弄清楚从标准的应用程序设计过程中看起来是什么样子,你有一个可信赖的中间层,可以完成大部分的auth工作.例如,大多数应用程序将Ruby或PHP放在数据库和用户代理之间,允许应用程序在允许将类似帖子的内容保存到数据库之前找出有关用户代理的信息.
User -> Ruby -> MySQL
User <- Ruby <- MySQL
Run Code Online (Sandbox Code Playgroud)
当用户不可信时,您如何信任用户执行管理任务?
例如,在使用couchDB插入用户行之前,如何进行"电子邮件验证"?您不能让用户代理插入行 - 因为它们会向系统填充垃圾邮件帐户.另一方面,没有中间层可以在单击电子邮件中的链接后插入行.
怎么样,我会假设你允许任何人通过在公共表格中创建新记录来输入他们的电子邮件email_verify.这是公共用户代理可以执行的操作,因为表不会在应用程序中执行任何操作 - 它只是一个存储槽.
然后node.js可以跟踪_changes提要并发送激活电子邮件,同时在私有表(如email_confirm)中创建新条目(node.js将用作可信中间层).如果用户单击该链接然后返回... [unknown] ...并且node.js最终可以在私有用户表(user)中创建记录.
此时,我们可以依赖couchdb验证来完成应用程序的其余部分,因为我们已经创建了已确认的用户帐户.
随着更多的背景让我们想象一下建立在couchdb上的讨论,任何人都可以注册.我们不希望任何人在没有某种验证的情况下直接提交内容 - 但用户代理都直接运行系统.(表将是Thread,Comment,及User).这怎么样?
在HTML中,有几个特殊字符< > & ' "对DOM解析器有重要意义.这些是流行函数的字符,例如PHP的htmlspecialchars转换为HTML实体,因此它们在解析时不会意外触发.
执行的翻译是:
- '&'(&符号)变成了
&"(双引号)"在未设置ENT_NOQUOTES时变为.'(单引号)'仅在设置了ENT_QUOTES 时才会出现.- '<'(小于)成为
<- '>'(大于)变为
>
但是,我记得在像IE6这样的旧浏览器中,还有其他字节序列导致浏览器的DOM解析器将内容解释为HTML.
今天这仍然是个问题吗?如果单独过滤这些5就足以防止XSS?
例如,以下是 HTML和JavaScript中的字符"<"的所有已知组合(UTF-8).
<
%3C
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
< …Run Code Online (Sandbox Code Playgroud) IMAP消息有一个UID我们都欢欣鼓舞的消息.但是,我试图找出如何为POP3消息生成唯一ID并遇到问题(像hotmail.com这样的旧系统只允许POP3).
当POP会话打开maildrop时,到客户端的可用消息是固定的,并且由该会话本地的消息号标识,或者可选地,由POP服务器分配给消息的唯一标识符标识.此唯一标识符对于maildrop是永久且唯一的,并允许客户端在不同的POP会话中访问相同的消息.检索邮件并通过邮件号标记删除.当客户端退出会话时,标记为删除的邮件将从maildrop中删除.- 维基百科
但是,似乎基本LIST命令只返回一个临时数字数组,以便您获取电子邮件.这些数字绝不是唯一的,但是另外一个名为UIDL的扩展似乎已被添加:CAPA(POP3扩展机制).
POP3声明UIDL只要消息存在,a 就是唯一的.
消息的唯一ID是由服务器确定的任意字符串,由0x21到0x7E范围内的1到70个字符组成,它唯一地标识maildrop中的消息并且在会话中持续存在.即使会话结束而未进入UPDATE状态,也需要此持久性.只要存在使用unique-id的实体,服务器就不应该在给定的maildrop中重用唯一ID.
请注意,未列出标记为已删除的邮件.
虽然服务器实现通常优选在maildrop中存储任意分配的唯一ID,但此规范旨在允许将unique-id计算为消息的散列.客户端应该能够处理maildrop中两个相同的消息副本具有相同唯一ID的情况.
这让我觉得我可能会在一年后(在删除第一个消息之后)下载另一条消息,该消息具有相同的UIDL并且可能在我的系统中发生冲突.
我应该只是散列整个邮件正文并将其用作ID吗?
我可能只是TOP [id] 1用来散列不应与现有电子邮件匹配的标题(和第一行),而不是取出整个电子邮件,因为接收服务器总是会添加某种类型的信息吗?因此,攻击者永远不会导致冲突,因为收到的或者某些东西应该被修改好了吗?
该MDaemon的方案似乎解决与局部头部散列问题:
MDaemon使用消息名称,日期戳,大小以及有关消息的一些其他详细信息构造UIDL结果.因此,如果在服务器上修改了邮件,即使您不重命名邮件,它也会对邮件客户端显示为"新邮件".
为POP3电子邮件制作ID的正确方法是什么?
注意:电子邮件通常包含Message-ID标题 - 但我不能依赖它,因为它可以用作攻击媒介来混淆我的系统.它也被一些电子邮件客户端遗漏了.