Улучшенная версия readCookie:
function readCookie( name )
{
var cookieParts = document.cookie.split( ';' )
, i = 0
, part
, part_data
, value
;
while( part = cookieParts[ i++ ] )
{
part_data = part.split( '=' );
if ( part_data.shift().replace(/\s/, '' ) === name )
{
value = part_data.shift();
break;
}
}
return value;
}
Это должно сломаться, как только вы найдете свое значение cookie и вернете его значение. На мой взгляд, очень элегантно с двойным расколом.
Замена на if-условии - это пробел белого цвета, чтобы убедиться, что он правильно соответствует
Если ваша система поддерживает это, getpass - это опция:
#include <unistd.h>
/* ... */
char *password = getpass("Password: ");
При вводе символов ничего не будет отображаться.
Если вы используете среду UNIX, что-то вроде этого может отключить ECHO в командной строке.
#include <stdio.h>
#include <termios.h>
#include <unistd.h>
#define SIZE 100
void getPassword(char password[])
{
static struct termios oldt, newt;
int i = 0;
int c;
/*saving the old settings of STDIN_FILENO and copy settings for resetting*/
tcgetattr( STDIN_FILENO, &oldt);
newt = oldt;
/*setting the approriate bit in the termios struct*/
newt.c_lflag &= ~(ECHO);
/*setting the new bits*/
tcsetattr( STDIN_FILENO, TCSANOW, &newt);
/*reading the password from the console*/
while ((c = getchar())!= '\n' && c != EOF && i < SIZE){
password[i++] = c;
}
password[i] = '\0';
/*resetting our old STDIN_FILENO*/
tcsetattr( STDIN_FILENO, TCSANOW, &oldt);
}
int main(void)
{
char password[SIZE];
printf("please enter password\n");
getPassword(password);
printf("Do something with the password <<%s>>\n", password);
return 0;
}
Для C / commandline / linux см.:
man getch
man noecho
см. Комментарий в getch
о noecho
. Я никогда не пробовал это сам.
В bash, если вы используете read -s
, на экране не отображается эхо:
> read -s x
<type something><enter>
> echo $x
<whatever you typed>
Если у вас есть доступ к библиотеке curses, вы можете использовать noecho . Если вы используете компилятор Microsoft C, вы можете использовать _getch . Но, черт возьми, оба они привязывают вас к консоли. Если вам нужно прочитать stdin независимо от того, исходит ли он из консоли, файла или конвейерной команды, вам нужно указать операционной системе, как она должна обрабатывать консоль .
Чтобы сделать это переносимым способом, вам нужно будет использовать стандартизованную или де-факто стандартную библиотеку.
См. man 3 termios
и man 3 ncurses
.
Вот программа, которая будет работать в Linux и других системах Unix ...
#include <stdio.h>
int main(void) {
int f = open("/dev/tty", 0);
char s[100];
system("stty -echo > /dev/tty");
f >= 0 && read(f, s, sizeof s) > 0 && printf("password was %s", s);
system("stty echo > /dev/tty");
return 0;
}
Возможны некоторые улучшения. Вероятно, было бы лучше использовать termios, и это позволило бы избежать вилки и возможных проблем с безопасностью system (). Вероятно, было бы лучше использовать стандартный ввод-вывод для чтения пароля. (Как написано, набранный символ новой строки должен быть удален.) В Linux и некоторых других есть функция getpass (), однако она помечена как «устаревшая. Не используйте ее.». Было бы неплохо разобраться с SIGTSTP.
В целом, я мог бы поискать существующее решение, которое решает все эти небольшие проблемы ...