我有一个有根据的猜测,我需要确认或丢弃它。
GUESS :当我编写表单和接收其数据的关联文件时,它将等同于:
required
中的<input>
属性
考虑强制性,而不是在文件中设置if(isset(...))
接收数据。required
属性,但请使用if(isset(...))
。因为同时使用required
和if(isset(...))
只会是多余的(但我保证会这样做)。
受过良好教育:我只看到了比2009年更新的帖子中的if(isset(...))
技巧,或者在最近依赖HTML5标签的帖子中。我已经检查过required
属性实际上是HTML5标记。此外,我最近参加了一个网络编程课程,该课程快速引入了HTML,只是为了转向HTML5,以及“HTML5”和“#5”。教师在填写数据时从未使用过if(isset(...))
,她只需将required
添加到<inputs>
。
所以,从技术的角度来看,我是对的,因为两种选择都会做同样的事情吗?
我在下面提供了示例。
第一替代方案:
在send.php
:
<form action="receive.php" method="post">
<input type="text" name="something" required />
<input type="submit" value="Submit" />
</form>
在receive.php
:
$name=$_POST['something'];
第二替代方案:
在send.php
:
<form action="receive.php" method="post">
<input type="text" name="something" />
<input type="submit" value="Submit" />
</form>
在receive.php
:
if(isset($_POST['something'])) {
$name=$_POST['something']; }
答案 0 :(得分:2)
是,这是必需的。 (根据)
需要考虑的事项;
客户将始终使用表格
您假设您的客户将始终在GUI中使用该表单。如果 - 出于某种原因 - 有人发送curl
请求并且没有提供所有信息(例如,如果您有公共API - 或者恶意黑客想要通过您的所有客户端 - 会发生什么情况 - 安全检查)。
错误将变得明显
唯一比Internet Explorer(对不起微软)更糟糕的是看到并使用破碎的产品。如果你错过拼写$_POST
密钥怎么办?可能会向用户显示一些错误(取决于您的错误报告和设置)
这是一个好习惯
养成良好的习惯 good 。您需要在前端向您发送数据,仅发送数据(请参阅第1点)。如果 - 代码中的某个位置 - 您使用仅在if()
声明中设置的变量并且您不使用isset()
并且您的应用程序中断 - 或者花费您钱?
检查存在的内容有时会引导您检查其内容而不是盲目地使用它 - 即:数据清理和验证。这是一种非常好的做法,可以帮助保护自己免受不良数据,黑客攻击和其他攻击。
我只看到了比2009年更新的帖子中的if(isset(...))技巧,或者最近依赖HTML5标签的帖子。
请更改频繁查看代码的地方。此外,永远不要只使用某些东西&#34;因为我没有看到它在网站x上使用了一段时间&#34;。
我最近参加了一个网络编程课程,该课程快速引入了HTML,只是为了转向HTML5,以及“HTML5”和“#5;教师从未使用if(isset(...))填写数据时是必须的,她只是把所需要的。
你应该对此提出挑战。如果需要,请为您的老师提供此帖子的链接 - 但总是在使用之前检查存在的东西 - 我们生活在一个充满活力的互联网时代,网站正在抓取网站,发布到其他网站......互动。如果您需要来自客户(最终用户)的内容始终检查他们是否提供。
从另一个角度看待它
required
HTML5标记用于体验用户体验。他们不需要按下按钮就能找到&#34;哦,我忘记了这个领域&#34; - 或者在表单上查找其他红色星号(*
)。
isset()
将检查该客户端提供的数据。客户端可以通过多种方式向您的应用程序发送数据 - 您的前端GUI不是唯一的方式。
我可能已经花了很长时间来讨论PHP中的一个函数,但知道其他人检查存在可能很方便;
列出的内容太多了 - 但我认为你明白了。 在使用之前始终检查某些内容是否存在,特别是如果它来自不可靠的来源 - 例如任何人都可以操纵 的面向公众的前端。
答案 1 :(得分:1)
依赖客户端验证的2个问题(必需属性)
绕过了客户端的诽谤:
服务器上的isset()是必要的,因为通过更改html或多种方式可以绕过 绕过。例如,您可以运行java脚本脚本或只是从inspect元素
中删除它在控制台上运行它会绕过它
document.getElementById("myinput").required = false;
除浏览器表单/ html之外的请求:
其次,如果您点击直接或 curl,postman等页面,如果您没有检查isset()
,则会出现索引不存在错误答案 2 :(得分:0)
客户端和服务器端验证之间存在重要区别。 html5 required
标记将阻止用户或使用前端的任何人发送的无效请求。但是,前端是例如发出此请求
'example.com/index.php?something=123'
没有什么可以阻止用户访问javascript控制台或chrome的devtools或firebug并确切地看到UI命中的api(php文件),以及通过规避UI可能会产生什么样的潜在恶意请求。攻击者可以简单地使用其他参数或其他不允许的内容来访问此URL,如果他们直接点击它而不是通过您的UI,则客户端验证不会执行任何操作。这就是你需要两者的原因。我建议调查&#39; What are client side and server side validations&#39;进一步了解。
两种方法&#39;提高你的安全性,但他们不能防止同样的事情。
答案 3 :(得分:0)
两者都做得更好,但你绝对应该使用if(isset())。例如在谷歌浏览器中使用devtools我可以删除“必需”并将表单提交为空。我还可以添加输入,选择等。永远不要依赖客户端。
清理...您希望清除用户输入,因为它不可信任。 htmlspecialchars() strip_tags()等。
发送
<form action="receive.php" name="SendForm" method="post">
<input type="text" name="something" />
<input type="submit" name="myForm" value="Submit" />
</form>
接收
if(isset($_POST['myForm'])) {
$err = "";
// get and sanitize post vars
$var = some_type_of_sanitization($_POST['something']);
$var2 = htmlspecialchars(strip_tags(trim($_POST['something2'])));
// validate the values of vars
if(empty($var)) {
$err .= "<li>This var is empty.</li>";
}
if (!empty($err)) {
// display errors
echo "<p>Errors:</p><ul>".$err."</ul>";
}ELSE{
// do something
}else{
// form wasn't submitted
}
答案 4 :(得分:0)
要求不,你不需要使用它。假设您在服务器上设置了无错误的显示,那么未设置的通知将不会显示,但可能会在某个地方记录。
有更好的验证方法可以使程序方法更清晰,如果是那么等等。
获取PHP手册的副本并阅读它。例如:
**filter_input(INPUT_POST, 'input field name', OPTION_VARS);**
另请参阅 filter_vars()。
确认和/或清理用户输入也很重要。
Javascript验证应该仅用作客户端支持而不是服务器端验证。
如果有人在他们的浏览器上关闭了javascript,你将没有验证,表单会提交。
如果有人复制了那个html5表单,他们可以删除所需的属性,然后表单将再次提交。
答案 5 :(得分:0)
您无法依赖浏览器验证,因为无法保证$_POST[]
中的数据来自您精心制作的表单。
可以使用浏览器扩展程序向脚本发送他们想要的任何内容。浏览器本身可以在没有扩展的情况下用于此目的(使用他们的嵌入式开发人员工具)。
可以使用curl
,wget
或其他HTTP客户端或下载管理器来访问receive.php
。即使是普通的telnet
会话也可以由发言HTTP/1.1
的人用来向您的脚本发送虚假数据。
可以使用PHP,Perl,Python和其他十几种语言编写六行代码脚本,将脚本发送到脚本。
我会改写这个答案的第一句话:你不能依赖浏览器验证,因为另一端没有浏览器;如果有浏览器,则无法控制;你无法告诉它该怎么做。
您可以编写PHP代码,以便能够处理它收到的任何输入。为此,您应该分两步工作:
第1步:忘掉表单。编写PHP代码,不要假设有关$_POST[]
中可以获得的数据的任何信息。您唯一可以依赖的是$_POST[]
是一个数组。它可以包含任何东西;您希望在其中找到的值可以存在与否。使用isset($_POST['something'])
并运行您可以想到的所有验证。编写基本表单,不要使用required
,readonly
或其他限制表单元素行为的HTML属性。不要在表单上放任何Javascript。
第2步:在您的PHP代码准备好处理任何输入之后,不依赖它已经以某种方式验证或格式化并且一切正常,开始增强表单的行为。使用required
,disabled
,readonly
或您需要的其他属性。使用Javascript进行验证,显示/隐藏字段,动画,您需要/想要的所有内容。
不要放弃服务器端的验证。
客户端的验证是针对客户的。它提供快速响应,如果精心制作,它可以帮助客户快速准确地填写表格。
服务器端的验证适用于应用程序。它为无效或缺失值,不正确的数据类型,不一致的值a.s.o提供了第一级防御。它允许应用程序的其余部分按预期工作,而不必检查每个其他代码行,如果值存在且有效。