Как отключить Ctrl-Z, Ctrl-C от взлома PHP-скрипта - PullRequest
16 голосов
/ 05 мая 2010

Может ли кто-нибудь указать мне правильное направление для исследования того, как запретить пользователям прерывать работу сценария php с помощью Ctrl + Z , Ctrl + C

Ответы [ 6 ]

17 голосов
/ 05 мая 2010

Если у вас php скомпилирован с PCNTL (Process Control) и вы не используете Windows, вы можете использовать pcntl_signal().

Здесь есть пример здесь , который я модифицировал, и кажется, что он ловит Ctrl-C ok:

<?php
declare(ticks = 1);

pcntl_signal(SIGINT, "signal_handler");

function signal_handler($signal) {
    switch($signal) {
        case SIGINT:
            print "Ctrl C\n";
    }
}

while(1) {

}

Если вы попытаетесь установить обработчик для SIGSTP, ничего не произойдет, но я не знаю почему.

5 голосов
/ 05 мая 2010

Есть способ сделать это, отключив в оболочке.

Источник здесь.

#!/bin/bash
# at start add
trap "" 2 20

# your script 
echo " Test"

# loop for sleep
sleep 5

20 для CTRL + Z

2 для CTRL + C

и это полный список созданных ловушкой - | Команда

1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL
5) SIGTRAP      6) SIGABRT      7) SIGBUS       8) SIGFPE
9) SIGKILL      10) SIGUSR1     11) SIGSEGV     12) SIGUSR2
13) SIGPIPE     14) SIGALRM     15) SIGTERM     16) SIGSTKFLT
17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP
21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU
25) SIGXFSZ     26) SIGVTALRM   27) SIGPROF     28) SIGWINCH
29) SIGIO       30) SIGPWR      31) SIGSYS      34) SIGRTMIN
35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3  38) SIGRTMIN+4
39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8
43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12
47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14
51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10
55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7  58) SIGRTMAX-6
59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
63) SIGRTMAX-1  64) SIGRTMAX

однако сделать это прямо из PHP сложно, я не уверен, как это сделать или можно ли это сделать. в противном случае некоторые сайты предлагали JavaScript для захвата нажатий клавиш. надеюсь, это поможет.

4 голосов
/ 05 мая 2010

Используйте функцию ignore_user_abort . Установите в php.ini ignore_user_abort значение true. Если изменить значение на TRUE, сценарии не будут прерваны после того, как клиент прервал свое соединение, поэтому сценарий завершится.

ignore_user_abort(true);

или

$ php my_script.php -d ignore_user_abort = true
2 голосов
/ 05 мая 2010

Попробуйте запустить его в фоновом режиме (добавьте & в конец команды):

./your_php_script &
0 голосов
/ 27 января 2015

Если вы используете числовые значения (а не встроенные константы PHP), то, похоже, это работает, по крайней мере для меня, в системе Debian / Ubuntu.

Как ни странно, в моем примере ниже функция обратного вызова signal_handler () не вызывается. Вместо этого он просто отображает «^ Z» и «^ C» в строке ввода, в то время как сигналы просто игнорируются. В конце концов, перерыв / приостановка невозможны, что, мы надеемся, ответит на оригинальный вопрос:

#!/usr/bin/php
<?
pcntl_signal( 2, "signal_handler");
pcntl_signal( 20, "signal_handler");

function signal_handler( $signal )
{
  echo( "This is not even invoked..?\n" );
}

$end = FALSE;

while( $end == FALSE )
{
  echo( "Enter Q to quit: " );
  $fp = fopen( "php://stdin", "r" );
  $line = fgets( $fp ); 
  $line = str_replace( "\n", "", $line );
  fclose( $fp );

  if( strtolower($line) == "q" ) $end = TRUE;
}
?>
0 голосов
/ 05 мая 2010

Если возможно, вы можете заключить основной цикл в блок try-catch и уничтожить исключение Abort / Interrupt (не уверен, что именно, извините, мой PHP немного ржавый)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...