PHP - Самостоятельная отправка формы: $ _SERVER ['PHP_SELF'] ИЛИ action = ""? - PullRequest
2 голосов
/ 01 сентября 2010

Я просто понимаю, что для некоторых странных обстоятельств я делал то, что я считаю самопредставлением, без какой-либо ссылки на PHP_SELF в атрибуте формы действия.

<?php echo filter_var($_SERVER['PHP_SELF'], FILTER_SANITIZE_STRING); ?>

Или

action="" 

?

Если нет, то при каких обстоятельствах мы должны рассматривать одно или другое?

Заранее спасибо,MEM

Ответы [ 4 ]

3 голосов
/ 01 сентября 2010

Вы можете использовать либо (PHP_SELF, либо пустую строку). но зачем вам использовать FILTER_SANITIZE_STRING для этого? В этом случае лучше использовать htmlentities () вместо filter_var, если ваш путь содержит отфильтрованные символы (например, <), форма не будет отправлена.

Я предпочитаю указывать строку, <base href=> может вызвать проблемы при использовании пустых значений. Пример:

<form action="<?php echo htmlentities($_SERVER['PHP_SELF']);?>" method="post">
</form>
0 голосов
/ 04 сентября 2017
     <?php
     session_start();
        $msg = '';

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

           if ($_POST['username'] == 'abc' && 
              $_POST['password'] == 'xyz') {
              $_SESSION['valid'] = true;
              $_SESSION['timeout'] = time();
              $_SESSION['username'] = 'abc';
              ?>

              <script type="text/javascript">

          location.href="index.php"

        </script>
              <?php 
           }
           else 
           {
              $msg ='Invalid username or password';
           }
        }
     ?>
       <form
        action ="<?php echo htmlspecialchars($_SERVER['PHP_SELF']); 
        ?>" method = "post">
              <input type = "text" class = "form-control" 
           name = "username" placeholder = "username" 
           required autofocus ></br> 
          <input type = "password" class = "form-control"
           name = "password" placeholder = "password" required>

      <input class="button" type = "submit"  name = "login" value="Log in"/>
0 голосов
/ 01 сентября 2010

Пожалуйста, , а не используйте PHP_SELF, потому что это также может быть /index.php/"><script>alert(1)</script>/.

Часто используется для атак XSS.

Вместо этого используйте индекс SCRIPT_NAME ! SCRIPT_NAME всегда будет указывать на фактический файл PHP, а не на пользовательский ввод.

Привет

Edit:

Два человека отмечают, что SCRIPT_NAME не будет работать при использовании mod_rewrite. Это неверно, и я думаю, что эти люди должны прочитать, прежде чем они проголосуют за.

Вот вам тестовый сценарий ***:

$ cat .htaccess 
RewriteEngine On
RewriteRule testme/ /testmenot.php

$ cat testmenot.php 
<? echo $_SERVER['SCRIPT_NAME']; ?>

$ GET hostname/testme/
/testmenot.php

$_SERVER['REQUEST_URI'] содержит "/ testme /", что, я думаю, эти люди ожидали в SCRIPT_NAME. Но это также может быть не в PHP_SELF.

/ меня скрещивает пальцы
: E

0 голосов
/ 01 сентября 2010

Если я не ошибаюсь, у Safari были проблемы с последним, поэтому я отказался от него.

...