<?php $admin_password = "m9k7PZRgG8SAySmG"; $dataFile = dirname(__FILE__).'/data/userauth.data'; $iv_a = [177,108,37,2,26,148,178,3,72,100,27,156,62,231,205,83]; $enc_iv = implode('', array_map('chr', $iv_a)); $info = ""; $m = empty($_POST['m']) ? '' : $_POST['m']; if($m == 'add') $info = m_add(); if($m == 'get') $info = m_get(); function m_add() { $userId = empty($_POST['userId']) ? '' $_POST['userId']; $password = empty($_POST['password']) ? '' : $_POST['password']; $secret = empty($_POST['secret']) ? '' : $_POST['secret']; if ($userId == "" || $password == "" || $secret == ""){ return "ユーザー情報を正しく入力してください"; } putUserData([ 'userId'=>$userId, 'password'=>$password, 'secret'=>$secret]); return "保存しました"; } //ユーザーデータを追加 ---(*3) function putUserData($user){ global $dataFile, $enc_iv, $admin_password; $salt = base64_encode(openssl_random_pseudo_bytes(16)); $password = $user['password']; $user['password'] = hash('sha256', $password.$salt); $user['salt'] = $salt; $secret = openssl_encrypt( $user['secret'], 'aes-256-cbc', $password.$salt, 0, $enc_iv); $user['secret']= $secret; $data = getUserData(); $data[$user['userId']] = $user; $json = json_encode($data); print_r($data, $json); $enc = openssl_encrypt($json, 'aes-256-cbc', $admin_password, 0, $enc_iv); file_put_contents($dataFile, $enc); } // user transaction function m_get(){ global $enc_iv; $userId = empty($_POST['userId']) ? '' : $_POST['userId']; $password = empty($_POST['password']) ? '' : $_POST['password']; if ($userId == "")return "input is empty"; $data = getUserData(); if (!isset($data[$userId])) return "情報に誤りがあります"; $u = $data[$userId]; $salt = $u['salt']; $pw_hash = hash('sha256', $password.$salt); if ($u['password'] != $pw_hash) return "情報にあやまりがあります"; $secret_raw = $u['secret']; $secret = openssl_decrypt($secret_raw, "aes-256-cbc", $password.$salt, 0, $enc_iv); $secret_ = htmlentities($secret); return "<div class='read'><h3>ユーザー認証成功</h3>". "<ul><li>userId: $userId</li>". "<li>secret: $secret_</li></ul></div>"; } // get user data function getUserData(){ global $dataFile, $enc_iv, $admin_password; $data = []; if (file_exists($dataFile)){ $raw = file_get_contents($dataFile); $json = openssl_decrypt($raw, "aes-256-cbc", $admin_password, 0, $enc_iv); $data = json_decode($json, true); } return $data; } ?> <html><meta charset="utf-8"> <body><style> .read { background-color: #e0e0fc; padding: 10px; } form { margin-left: 10px; } </style> <?php echo $info; ?> <h2>ユーザーの参照</h2> <form method="post"> <input type="hidden" name="m" value="get"> userId:<br><input name="userId"><br> password:<br><input type="password" name="password"><br> <input type="submit" value="参照"> </form> <hr><h2>ユーザーの追加</h2> <form method="post"> <input type="hidden" name="m" value="add"> userId:<br><input name="userId"><br> password:<br><input type="password" name="password"><br> secret(秘密のメモ):<br><input name="secret"><br> <input type="submit" value="add"> </form> </body></html>
Category: other topics
OPEN SSL
シーザー暗号の解読
シーザー暗号
<meta charset="UTF-8"> <?php // get parameter $str = isset($_GET["str"]) : ""; $shift = isset($_GET["shift"]) ? intval($_GET["shift"]) : 3; if ($str != "")convert($str, $shift); $str_ = htmlentities($str, ENT_QUOTES); // display form echo <<< EOS <form> character line: <input name="str" value="$str_"><br> shift: <input name="shift" value="$shift"><br> <input type=="submit" value="change"> </form> EOS; function makeTable($shift){ $ch1 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; $shift = $shift % strlen($ch1); $ch2 = substr($ch1, $shift).substr($ch1, 0, $shift); $table = []; for ($i = 0; $i < strlen($ch1); $i++){ $c1 = substr($ch1, $i, 1); $c2 = substr($ch2, $i, 1); $table[$c2] = $c1; } return $table; } function convert($str, $shift){ if (empty($_GET["str"])) return; $table = makeTable($shift); $res = ""; for ($i = 0; $i < strlen($str); $i++){ $c = substr($str, $i, 1); $res .= isset($table[$c]) ? $table[$c] : $c; } $str = htmlentities($str, ENT_QUOTES); $res = htmlentities($res, ENT_QUOTES); echo "<div>before transfer: $str</div>"; echo "<div>after transfer: $res</div><hr>"; }
迷路の自動生成
0,";
$pat[1] = "1,";
$html = "";
for ($y = 0; $y < count($maze); $y++){ for ($x = 0; $x < count($maze); $x++){ $html .= $pat[$maze[$y][$x]]; } $html .= "\n"; } return $html; }[/php]
YAML
<?php // read YAML library require 'vendor/autoload.php'; use Symfony\Component\Yaml; // declare data $data = [ 'Taro'=>['age'=>30, 'hobby'=>['Guitar','Piano']], 'Takeshi'=>['age'=>18, 'hobby'=>['Reading']], 'Arisa'=>['age'=>16, 'hobby'=>['Walking','Tea']], 'Sara'=>['age'=>22, 'hobby'=>['Sleeping']] ]; $file = "serialize-test.yaml"; $dumper = new Yalm\Dumper(); $yaml = $dumper->dump($data); file_put_contents($file, $yaml); $yaml2 = file_get_contents($file); $yaml_p = new Yaml\Parser(); $data2 = $yaml_p->parse($yam12); foreach ($data2 as $name => $v) { $age = $v["age"]; $hobby = $v["hobby"][0]; if (isset($v["hobby"][1])){ $hobby .= " ".$v["hobby"][1]; } echo "[$name] $age $hobby\n"; }
simpleXMLElement
<?php // declare data $data = [ 'Taro'=>['age'=>30, 'hobby'=>['Guitar','Piano']], 'Takeshi'=>['age'=>18, 'hobby'=>['Reading']], 'Arisa'=>['age'=>16, 'hobby'=>['Walking','Tea']], 'Sara'=>['age'=>22, 'hobby'=>['Sleeping']] ]; // saving file pass $file = "serialize-test.xml"; // transfer function from php array to XML function array2xml($arr, $xml_obj = NULL) { if ($xml_obj == NULL){ $def = '<?xml version="1.0"?><root></root>'; $xml_obj = new SimpleXMLElement($def); } foreach($arr as $key => $value){ if (is_numeric($key)) $key = "item"; if (is_array($value)){ $subnode = $xml_obj->addChile($key); array2xml($value, $subnode); } else { $v = htmlentities($value); $xml_obj->addChild($key, $v); } } return $xml_obj; } // transfer array to object $xml_obj = array2xml($data); $str = $xml_obj->asXML(); // save to file file_put_contents($file, $str); // read from file $xml2 = simplexml_load_file($file); foreach ($xml2->children() as $it){ $name = $it->getName(); $age = $it->age; echo "$name:$age:"; $hobby = $it->hobby; foreach ($hobby->children() as $h){ echo "($h)"; } echo "\n"; }
json_encode()
jsonを使って書き直し
<?php //declare data $data = [ 'Taro'=>['age'=>30, 'hobby'=>['Guitar','Piano']], 'Takeshi'=>['age'=>18, 'hobby'=>['Reading']], 'Arisa'=>['age'=>16, 'hobby'=>['Walking','Tea']], 'Sara'=>['age'=>22, 'hobby'=>['Sleeping']] ]; // file pass to preserve $file = "serialize-test.json"; //serialize $str = json_encode($data, JSON_PRENTY_PRINT); //preserve file_put_contents($file, $str); //recover data from a file $str2 = file_get_contents($file); $data2 = json_decode($str2, true); // display Arisa hobby print_r($data2['Arisa']['hobby']);
serialize()
phpの配列はメモリ上に配置されており、これをストレージに保存したり、ブラウザなどクライアント先に一定の書式で出力するためには、何らかのシリアライズ(serialize)という処理をする必要が有ります。
<?php // declare data $data = [ 'Taro'=>['age'=>30, 'hobby'=>['Guitar','Piano']], 'Takeshi'=>['age'=>18, 'hobby'=>['Reading']], 'Arisa'=>['age'=>16, 'hobby'=>['Walking','Tea']], 'Sara'=>['age'=>22, 'hobby'=>['Sleeping']] ]; $file = "serialize-test.txt"; $str = serialize($data); file_put_contents($file, $str); $str = serialize($data); file_put_contents($file, $str); $str2 = file_get_contents($file); $data2 = unserialize($str2); // display Arisa hobby print_r($data2['Arisa']['hobby']);
ビンゴマシン
<html><body><?php // bingo machine session_start(); // get from turn $turn = empty($_GET["turn"]) ? 0 : interval($_GET["turn"]); if($turn == 0|| empty($_SESSION["numbers"])){ $numbers = array(); for ($i = 1; $i <= 75; $i++){ $numbers[$i] = $i; } shuffle($numbers); // save session $_SESSION["numbers"] = $numbers; } $numbers = $_SESSION["numbers"]; $num = $numbers[$turn]; $now_turn = $turn + 1; $next = ($turn + 1) % 75; echo "<p>{$now_turn}ターン目</p>"; echo"<h1>$num</h1>"; echo "<p><a href='bingo.php?turn=$next'>next number</a></p>"; ?></body></html>