В змінну середовища встановлену за доп. функції putenv потрапляє не все значення змінної

$keys = array(
    1 => array(
        'p1' => '1AA1C7D91521353BB82257C71FD',
        'p2' => '24B16F7BE6731433CC1F37E3C7D',
        …
        'SignatureSize' => 160,
        'HardwareLocking' => '',
        …
    ),
    2 => array(/*ті ж самі назви змінних. Інші значення*/)
)

$pname = $_GET['pname'];
$ExpirationDate = $_GET['exp'];
$RegName = $_GET['email'];

// рядок запиту
$query_string =
"C1={$keys[$pname]['p1']}&C2={$keys[$pname]['p2']}&C3={$keys[$pname]['p3']}&C4={$keys[$pname]['p4']}&C5={$keys[$pname]['p5']}&C6={$keys[$pname]['p6']}&C7={$keys[$pname]['p7']}&";

// іще додаємо до рядку
$query_string .=
"ModeID={$keys[$pname]['ModeID']}&SignatureSize={$keys[$pname]['SignatureSize']}&EncryptionConst={$keys[$pname]['EncryptionConst']}&RegName={$RegName}&HardwareID={$keys[$pname]['HardwareLocking']}&ExpirationDate={$ExpirationDate}";

// виводжу для перевірки рядок і отримую те що потрібно (див. далі)
echo $query_string;

// змінна середовища
putenv("QUERY_STRING=$query_string");

/* перевірка значення змінної в результаті якої отримую тільки оце:
/* exp=300&pname=1&email=test%40mail.com
echo getenv("QUERY_STRING");

Проблема в тому що в змінній середовище опиняються тільки дані отримані з $_GET а не весь рядок.
Оскільки те що мало б опинитися з змінній QUERY_STRING займає багато місця, дам посилання на pastebin.com: pastebin.com/XYXYuXh0

Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті

👍ПодобаєтьсяСподобалось0
До обраногоВ обраному0
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Ево отключили на уровне языка ;)

Виявив що якщо HardwareID не має значення (замість нулика PHP підставляє нічого, мабуть), то програма, мабуть, так ніколи і не завершить роботу. Мабуть щось там рахує.

Какое же говно этот ваш пых.

MyOwnBasicListCollection <MyBasicClassFactoryClass> MyOwnListCollectionMember = new MyOwnBasicListCollection(42);

Только это вы только что выдумали, а вот говно вида

$query_string =
“C1={$keys[$pname][’p1’]}&C2={$keys[$pname][’p2’]}&C3={$keys[$pname][’p3’]}&C4={$keys[$pname][’p4’]}&C5={$keys[$pname][’p5’]}&C6={$keys[$pname][’p6’]}&C7={$keys[$pname][’p7’]}&”;
$query_string .=
“ModeID={$keys[$pname][’ModeID’]}&SignatureSize={$keys[$pname][’SignatureSize’]}&EncryptionConst={$keys[$pname][’EncryptionConst’]}&RegName={$RegName}&HardwareID={$keys[$pname][’HardwareLocking’]}&ExpirationDate={$ExpirationDate}”;

Я вижу прямо сейчас на доу.

ну вы видите реализацию, а ругаете инструмент)
а то что я выдумал — это то, что мне не нравится в убертипизированных ооп языках а-ля ява. Много букофф.

Есть Groovy, там можно вообще писать def x = [1,"123123123123″, Object.new];

а создать строку из шаблона и переменных массива как будет на груви? сильно от пхп будет отличаться?

Значительно.
def value1 = “DEADBEEF”;
def value2 = 69;

println( “Message ${value} ${value2} ” );

Больше примеров: groovy.codehaus.org/...ngs and GString

некорректно. в примере на пхп только в первой части в шаблон подставляется 7 штук $keys[$pname][хх], а во второй — 6 переменныхъ. каким бы способом строка не создавалась — прямой подстановкой, аналогом принтф — все эти переменные необходимо как минимум перечислить. в результате получим всё ту же хрень)

можно, конечно, сразу создавать массив, где ключами будут нужные нам для сооздания строки названия, а потом соорудить что-то типа ’&’.join([’%s=%s’%(k, mas[k]) for k in mas.keys()]), но такой подход тоже не всегда возможен — шаблон может быть позаковыристей, чем просто строка параметров.

Коментар порушує правила спільноти і видалений модераторами.

Коментар порушує правила спільноти і видалений модераторами.

Ну гаразд, лайно. А як написати краще?

На любом языке можно написать то, чем вы «оскверняете» представленный выше экземпляр ;)

Коментар порушує правила спільноти і видалений модераторами.

Створив ще один PHP скрипт я встановлює змінну оточення (в ній те значення яке потрібно) і викликає програму keygen. Але виникла інша проблема: запускається цей keygen і висить в RAM витрачає процесорний час. Змушений його примусово завершувати бо він все щось робить і виводу від нього я так і недочекався. Якщо просто виконати команду ./keygen з емулятору терміналу, то програма виведе повідомлення про те під якою ліцензією вона розповсюджується.

в терміналі встанови змінну оточення (та, що на пастебін лежить), а потім запусти з терміналу кейген

ну тоді потрібно розбиратися з кейгеном. Я бачу що йому для роботи потрібна квері_стрінг змінна, він її якось обробляє і кудись записує результат. це може бути ще одна змінна оточення, або стандартний вивід. Якщо процесс продовжує висіти, то або на вхід подано щось ліве і кейген його не може обробити, або очікується ще якась інфа.

Варто додати, що після формування рядку запиту і створення змінної середовище викликається зовнішня програма: system("./keygen")

чи не перекриває десь _SERVER["QUERY_STRING"] локальну змінну? перейменувати локальну змінну можна?

Каюсь, назва змінної мала б навести мене на певні думки. $_SERVER[’QUERY_STRING’] == getenv(’QUERY_STRING’)

перейменувати локальну змінну можна?
Скоріш за все ні. Якщо викликати PHP програму з командного рядка, то все працює. Після формування рядку запиту і створення змінної середовище викликається зовнішня програма: system("./keygen")

тоді очевидний костиль (щоб не копатися в пхп.іні) — створити кейген.ш, в якому встановлювати змінну оточення і далі викликати кейген

А якщо викликати інший PHP скрипт який і встановить і викличе програму? А в якому напрямку копатися?

якщо ./кейген викликається через ехес, то найпростіше встановити в пхп змінну оточення з іншою назвою (напр MQUERY_STRING), а в ехес додати
exec("export QUERY_STRING=$MQUERY_STRING; ./keygen")

але не факт, що пхп дозволить)

Не завжди вдається її туди прокинути.

Тому, як на мене, оптимальний шлях — окремий скрипт, який приймає у виді параметра екрановане значення QUERY_STRING, встановлює змінну оточення і викликає keygen.

Напевне sh. Головне аби атрибут на виконання у файла стояв.

я чета не вижу в листинге где

дані отримані з $_GET
? и не понятно чему равна
QUERY_STRING
до вот этого
(“QUERY_STRING=$query_string”);
не понятно чему равна
QUERY_STRING
По ідеї там мало б бути отаке: pastebin.com/XYXYuXh0

А насправді там тільки це:

exp=300&pname=1&email=test%40mail.com

Ось дані з $_GET:

$pname = $_GET[’pname’];
$ExpirationDate = $_GET[’exp’];
$RegName = $_GET[’email’];

идея таже что и обсуждается внизу, похоже что QUERY_STRING не доступна для изменений, нада распечатать ее значение до попытки изменения и после. Если данные одинаковы — то она не доступна.

stackoverflow.com/...verquery-string
вот тут пацаны советуют заюзать http_build_query(). Я настолько глубоко не залазил, поэтому от дальнеших советов воздержусь.

Якщо не брати дані з $_GET, то все працює.

Блин, прочитал имя функции как «ПутенВ». Психанул, подумав, что опять про политику.

echo putputin(MAVZOLEJ); Warning:Stack overflow. FALSE

Колись там поруч Сталін лежав, так що місце є.

Ну взагалі. А документацію (www.php.net/...tion.putenv.php) почитати?

Там же білим по чорному написано, що коли встановлена змінна конфігурації safe_mode_allowed_env_vars, а вона по замовчанню встановлена, можна змінювати тільки ті змінні оточення, що починаються на «PHP_», а змінна оточення «QUERY_STRING» — вона не доступна, тому і зберігає своє значення — рядок запиту до серверу.

Тут поведінка така як і має бути.

Якщо вам треба внести зміни у те, що прийшло на запит — то модифікуйте відразу $_GET масив. Справ то.

А ше там написано що

Внимание

Директивы safe_mode_allowed_env_vars и safe_mode_protected_env_vars работают только в Безопасном режиме.

А на сторінці про безпечний режим написано що


Данная возможность была помечена УСТАРЕВШЕЙ начиная с версии PHP 5.3.0 и была УДАЛЕНА в версии PHP 5.4.0.

Версія PHP у мене 5.5.10.

Мені не потрібно змінювати $_GET.

Ну тоді перевір чи взагалі ти можеш встановлювати якісь змінні. Спробуй якусь іншу встановити, наприклад MYQUERY_STRING.

Мало що вони там намутили.

якщо у коді вище замінити QUERY_STRING на MQUERY_STRING то все працює як треба?

От дідбко! Так, якщо перейменувати змінну оточення. Але програма для якої цей рядок запиту призначений використовує тільки змінну з іменем QUERY_STRING і змінити це я ніяк не можу.

Ну напевне вони просто заборонили змінювати системні змінні оточення.
Цікаво як вона зв’язана з $_SERVER[’QUERY_STRING’].

Я б іще спробував виконати консольну команду і через неї встановити змінну оточення. Це звісно ще той костиль, та все таки.

І може вони десь щось додали для управлінням цією поведінкою — треба глянути у мануал детальніше. І коментарі до функції на сайті глянуть.

Підписатись на коментарі