代码之家  ›  专栏  ›  技术社区  ›  Brad

如果表单域不为空,则运行函数

php
  •  0
  • Brad  · 技术社区  · 14 年前

    这样发布ISSET密码可以吗?

    我想应该是 if(isset($_POST['username']) && isset(md5($_POST['password']))) -因为它是加密的,但是如果我将MD5包装在有条件的密码周围,它就不能正常工作。

    if(isset($_POST['username']) && isset($_POST['password'])) {
     //run authentication
    } else {
     //show form
    }
    
    3 回复  |  直到 14 年前
        1
  •  1
  •   hobodave    14 年前

    布拉德,是的,没关系。发布密码真的没有好处 散列的 (未加密)。首先,您必须使用JavaScript来实现这一点,而且很容易规避。提交的密码的散列应该在服务器端完成,以便与存储的散列值进行比较。

    编辑 :

    另外,运行下面的程序,看看您得到了什么:

    <?php echo md5(NULL);
    

    因此,MD5 总是 返回一个值。

    除此之外,尝试运行以下内容:

    <?php var_dump(isset(md5($_POST['password'])));
    

    您将看到以下内容: Fatal error: Can't use function return value in write context

    isset() 只能与变量一起使用。

    编辑:

    两者之间有区别 hashing encryption . MD5是一个简单的散列,它甚至在密码学上都不安全。

    是的,您不应该将明文密码提交到您的服务器,但是在客户端散列密码是 一样东西 .你应该用 HTTPS 对于密码表单提交,这是 加密 服务器和客户机之间的通信。

        2
  •  1
  •   VolkerK    14 年前

    的全部目的

    if(isset($_POST['username']) && isset($_POST['password'])) {
    

    检查两个开机自检参数是否都设置/可用。没有涉及到身份验证,甚至没有关于两个元素(可能是字符串、数组等)类型的假设。只有“请求中有这样的参数”和“我能在不发出通知的情况下访问这个元素吗:未定义的索引”。

    不,我们把它和 isset(md5($_POST['password'])) md5()接受一个字符串,因此md5($_post['password'])做了两个假设。
    a)有一个元素$_post[“password”],即“original”测试检查的内容。
    b)(string)$_post['password']有任何意义,因为您传递给md5()的任何内容都被转换为string。如果传递数组,则结果与MD5(“array”)相同;
    加上md5()总是返回一个字符串(输入哈希的字符串表示),所以isset()总是正确的,在这里没有多大意义。(编辑: 将是 如果Isset(),则始终为真 可以是 用于函数的返回值。但不行,看评论)

    底线是,“原始”版本有一个“明确定义”的目的,ISSET(MD5(..)版本没有那么多;-)

        3
  •  -2
  •   nickf    14 年前

    如果字段的格式是已提交的,则这些值将 总是 isset .你可能想检查它们是否是空的。一种简单的方法是与空字符串进行比较,但这要求首先检查变量是否已设置,否则,当表单尚未提交时,将收到“array key does not exist”警告。谢天谢地,有一个简便的方法叫做 empty() 它检查给定变量是否已设置 它是否有一个非虚值——因此您通常要检查某个值 空的。

    $x = "";
    !empty($x);  // false
    isset($x);   // true :(
    
    // beware though:
    $x = "0";
    !empty($x);  // false
    

    把它看作是这个的简写:

    isset($x) && $x != false