让我们假设您有一个嵌套子列表的列表.
<ul>
<li></li>
<li>
<ul>
<li></li>
<li></li>
</ul>
</li>
<li></li>
</ul>
Run Code Online (Sandbox Code Playgroud)
并用于document.querySelectorAll()做出选择:
var ul = document.querySelectorAll("ul");
Run Code Online (Sandbox Code Playgroud)
我如何使用该ul集合来获取直接的子元素?
ul.querySelectorAll("> li");
// Gives 'Error: An invalid or illegal string was specified'
Run Code Online (Sandbox Code Playgroud)
让我们假定ul以某种方式缓存(否则我可以ul > li直接完成).
在jQuery中,这有效:
$("ul").find("> li");
Run Code Online (Sandbox Code Playgroud)
但它不是原生的querySelectorAll.有解决方案吗
这是我在构建与 REST API 服务交互的基于 Web 的小型项目时多次遇到的安全问题。例如,假设您正在构建一个基于 JavaScript 的休闲游戏,您想要一个高分排行榜,因此您需要将用户的分数发布到数据库中。
最简单的解决方案是构建一个简单的 Web 服务,例如使用 PHP、Node.js 或 Python,接受GET请求并将结果保存到数据库。让我们想象一下 API 看起来像这样:
GET https://www.example.com/api/highscore?name=SuperGoat31&score=500
创建这样一个用于发布高分的 API 有一些明显的缺点。恶意用户可以编写一段三行 PHP 代码,向数据库发送垃圾邮件,其中包含大量错误结果,例如:
for ($i = 0; $i < 100; i++) {
file_get_contents("https://www.example.com/api/highscore?name=SuperGoat31&score=5000000");
}
Run Code Online (Sandbox Code Playgroud)
所以,我正在寻找一种方法来防止这种情况发生。这主要涉及小型爱好或黑客马拉松项目,这些项目只需要某种保护来防止最明显的攻击,而不是需要严格安全性的大型企业应用程序。我能想到的有几件事:
1.某种形式的身份验证
解决此问题的一个明显方法是拥有用户帐户并仅允许来自登录用户的请求。不幸的是,这给需要先获得帐户的用户设置了很大的障碍。它还需要构建一个完整的身份验证工作流程,包括密码恢复和正确加密密码等。
2. 基于一次性令牌的保护
在服务器端生成令牌并在首次加载时将其提供给用户,然后仅允许提供该特定令牌的请求。足够简单,但也很容易通过在浏览器 Web 检查器中查找请求并将其用于三行 PHP 脚本来规避。
3. 记录IP地址并在恶意使用发生时禁止
这可能可行,但我觉得这对隐私不太友好。此外,记录 IP 地址需要欧洲用户的GDPR同意。也不能阻止实际的垃圾邮件发送本身,因此您可能需要先清理混乱,然后再开始禁止 IP 地址。
4. 使用外部服务
有一些服务可以解决此问题。例如,过去我使用 Google 的 reCAPTCHA 来防止恶意使用。但这也意味着集成外部服务,确保其保持最新状态,关注隐私方面(尤其是像 reCAPTCHA 这样的服务)等。对于周末项目来说,这感觉有点太多了。
5. 限制请求
我觉得这可能是最简单、实际可行的解决方案。这确实需要某种形式的 IP 地址记录(这可能会导致 3 中所述的问题),但至少您可以在之后很快删除这些 IP 地址。
但我确信我还错过了其他方法,所以我很想知道解决这个问题的其他方法。
根据MDN,古老的navigator.productSub属性返回"浏览器的内部版本号".这可能在九十年代有效,但现在它已经没用了.
但是,我对一些浏览器返回的数字感兴趣.Chrome和Safari都会返回值20030107,Firefox似乎又回归了20100101.这两个号码有什么关系?是否20030107代表2003年7月1日?然后发生了什么这么有趣?
这里希望有人可以挖掘一些网络历史.