是IF(ISSET必须已经设置好吗?

时间:2015-03-17 17:27:23

标签: php html html5

我有一个有根据的猜测,我需要确认或丢弃它。

GUESS :当我编写表单和接收其数据的关联文件时,它将等同于:

  • 使用我的表单required中的<input>属性 考虑强制性,而不是在文件中设置if(isset(...)) 接收数据。
  • 不要在表单中使用required属性,但请使用if(isset(...))

因为同时使用requiredif(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']; }

6 个答案:

答案 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; - 或者在表单上查找其他红色星号(*)。

  • PHP中的
  • 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[]中的数据来自您精心制作的表单。

可以使用浏览器扩展程序向脚本发送他们想要的任何内容。浏览器本身可以在没有扩展的情况下用于此目的(使用他们的嵌入式开发人员工具)。

可以使用curlwget或其他HTTP客户端或下载管理器来访问receive.php。即使是普通的telnet会话也可以由发言HTTP/1.1的人用来向您的脚本发送虚假数据。

可以使用PHP,Perl,Python和其他十几种语言编写六行代码脚本,将脚本发送到脚本。

我会改写这个答案的第一句话:你不能依赖浏览器验证,因为另一端没有浏览器;如果有浏览器,则无法控制;你无法告诉它该怎么做。

可以做什么:

您可以编写PHP代码,以便能够处理它收到的任何输入。为此,您应该分两步工作:

第1步:忘掉表单。编写PHP代码,不要假设有关$_POST[]中可以获得的数据的任何信息。您唯一可以依赖的是$_POST[]是一个数组。它可以包含任何东西;您希望在其中找到的值可以存在与否。使用isset($_POST['something'])并运行您可以想到的所有验证。编写基本表单,不要使用requiredreadonly或其他限制表单元素行为的HTML属性。不要在表单上放任何Javascript。

第2步:在您的PHP代码准备好处理任何输入之后,不依赖它已经以某种方式验证或格式化并且一切正常,开始增强表单的行为。使用requireddisabledreadonly或您需要的其他属性。使用Javascript进行验证,显示/隐藏字段,动画,您需要/想要的所有内容。 不要放弃服务器端的验证。

客户端的验证是针对客户的。它提供快速响应,如果精心制作,它可以帮助客户快速准确地填写表格。

服务器端的验证适用于应用程序。它为无效或缺失值,不正确的数据类型,不一致的值a.s.o提供了第一级防御。它允许应用程序的其余部分按预期工作,而不必检查每个其他代码行,如果值存在且有效。