gpt4 book ai didi

php - 应该先执行哪一个? sanitizer 或验证

转载 作者:可可西里 更新时间:2023-11-01 12:34:58 26 4
gpt4 key购买 nike

我的注册表中有一个字段包含例如 name字段,它将存储在数据库中名为 user_name varchar(20) 的字段中.很明显我应该验证用户输入如果我首先使用以下代码验证此字段:

<?php
if(emptiy($_pos['name']) || strlen($_post['name'])>20)
//send an not valid input error
else{
$name=htmlspcialchars($_post['name']);
//check for sql injection;
//insert name into database;}
?>

如果用户插入像 <i> some one </i> 这样的名称字符串长度为 17,因此 else 部分将执行,名称将为 &lt;i&gt some one &lt;/i&gt;长度为 28,这将在插入 db 时产生错误。这次如果我向用户发送错误,说他/她的输入太长,他会感到困惑。我应该怎么办?什么是最好的方法?

最佳答案

一般来说,应该首先进行 sanitizer - “为了保护您和他们的安全。”这包括删除任何无效字符(当然,字符编码敏感)。如果一个字段应该只包含字符和空格,那么首先去除任何不是这样的内容。

完成后,您将验证结果 - 名称是否已被使用(用于唯一字段)、大小是否正确、是否不是空白?

您给出的理由恰到好处 - 最大限度地提高用户体验。如果可以避免,请不要混淆用户。这有助于防止愚蠢的复制和粘贴行为,但您必须小心 - 如果我想将我的名字记录为“Ke$h@”,我可能会也可能不会将其更改为“Keh”。

其次,也是为了防止bug。

当您想创建不允许使用特殊字符的用户名时会发生什么?如果我输入“Brian”,而您的系统拒绝它作为我们已经在使用的名称,那么我提交“Brian$”?首先你验证它,它没有被使用,然后你去掉特殊字符,剩下“Brian”。哦哦 - 现在你要么必须再次验证,要么你会得到一个奇怪的错误,要么帐户创建失败(例如,如果你的数据库设置为需要唯一的用户名),或者更糟的是它会成功并覆盖/损坏用户帐户发生。

另一个例子是最小字段长度:如果你要求一个名字至少有 3 个字母并且只接受字母,而我输入“否”你会拒绝它;但是如果我输入“no@#$%”,你可能会说它是有效的(足够长),对其进行清理,现在它不再有效,等等。

避免这种情况的简单方法是先清理,然后您就不必再考虑验证了。

但是,Niet 关于在存储之前不对数据进行编码的说法是正确的;通常将输出设置为 HTML 并在适当时进行编码要容易得多,然后记住在您只需要纯文本(输入文本框、JSON 字符串等)时对其进行解码。您将使用的大多数测试用例不会包含带有 HTML 实体的数据,因此很容易引入不易发现的愚蠢错误。

最大的问题是,当引入这样的错误时,它会很快导致不容易解决的数据损坏。示例:您有纯文本,将其作为 html 实体错误地输出到文本字段,表单被提交回来并重新编码……每次打开/重新提交时都会重新编码。对于一个繁忙的站点/表单,您最终可能会得到数千个不同编码的条目,而没有明确的方法来确定什么应该和什么不应该进行 HTML 编码。

防止注入(inject)是件好事,但 HTML 编码并非设计(并且不得依赖)来做到这一点。

关于php - 应该先执行哪一个? sanitizer 或验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19452453/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com