気付けばプロ並PHP終了
- 評価
- クリップ 2
- VIEW 674
タイトルの通り、「気付けばプロ並PHP」という書籍をおわらせました。次はセキュリティに関して覚えた方がいいと言われたこともあり、「体系的に学ぶ、安全なWebアプリケーションの作り方」(以下徳丸本)も買ってきて少し読みました。
ですが、「気付けばプロ並」のほうはパスワードハッシュなどが現在推奨されないものである事などを指摘されたので、「現行の、セキュリティ面などにおいても適切な」コーディングを知りたいと思いました。
その上で、徳丸本を終わらせたらいわゆる「即戦力
」として仕事ができるのでしょうか?
(仕事になるレベルでの知識が得られるサイトも教えていただけたら嬉しいです)
先ほどはスマホからの投稿なので後から追記しました。
pro_list.php
<?php
session_start();
session_regenerate_id(true);
if(isset($_SESSION['login'])==false)
{
print 'ログインされていません<br />';
print '<a href="../staff_login/staff_login.html">ログイン画面へ</a>';
exit();
}
else
{
print $_SESSION['staff_name'];
print 'さんログイン中<br />';
print '<br />';
}?>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ろくまる農園</title>
</head>
<body>
<?php
try{
$dsn = 'mysql:dbname=shop;host=localhost;charset=utf8';
$user = 'root';
$password= '';
$dbh = new PDO($dsn,$user,$password);
$dbh -> setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
$sql = 'SELECT code, name,price FROM mst_product WHERE 1';
$stmt = $dbh->prepare($sql);
$stmt->execute();
$dbh = null;
print '商品一覧<br /><br />';
print '<form method="post" action="pro_branch.php">';
while(true){
$rec = $stmt -> fetch(PDO::FETCH_ASSOC);
if($rec==false){
break;
}
print'<input type="radio" name="procode" value="'.$rec['code'].'">';
print $rec['name'].'---';
print $rec['price'].'円';
print'<br />';
}
print '<input type="submit" name="disp" value="参照">';
print '<input type="submit" name="add" value="追加">';
print '<input type="submit" name="edit" value="修正">';
print '<input type="submit" name="delete" value="削除">';
print '</form>';
}
catch(Exception $e){
print 'ただいま障害発生中です。ご迷惑おかけします。';
exit();
}
?>
<br />
<a href="../staff_login/staff_top.php">トップメニューへ</a><br />
</body>
</html>
staff_branch.php
<?php
session_start();
session_regenerate_id(true);
if(isset($_SESSION['login'])==false)
{
print 'ログインされていません<br />';
print '<a href="../staff_login/staff_login.html">ログイン画面へ</a>';
exit();
}
else
{
print $_SESSION['staff_name'];
print 'さんログイン中<br />';
print '<br />';
}?>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ろくまる農園</title>
</head>
<body>
<?php
try{
$dsn = 'mysql:dbname=shop;host=localhost;charset=utf8';
$user = 'root';
$password= '';
$dbh = new PDO($dsn,$user,$password);
$dbh -> setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
$sql = 'SELECT code, name,price FROM mst_product WHERE 1';
$stmt = $dbh->prepare($sql);
$stmt->execute();
$dbh = null;
print '商品一覧<br /><br />';
print '<form method="post" action="pro_branch.php">';
while(true){
$rec = $stmt -> fetch(PDO::FETCH_ASSOC);
if($rec==false){
break;
}
print'<input type="radio" name="procode" value="'.$rec['code'].'">';
print $rec['name'].'---';
print $rec['price'].'円';
print'<br />';
}
print '<input type="submit" name="disp" value="参照">';
print '<input type="submit" name="add" value="追加">';
print '<input type="submit" name="edit" value="修正">';
print '<input type="submit" name="delete" value="削除">';
print '</form>';
}
catch(Exception $e){
print 'ただいま障害発生中です。ご迷惑おかけします。';
exit();
}
?>
<br />
<a href="../staff_login/staff_top.php">トップメニューへ</a><br />
</body>
</html>
pro_add_check.php
<?php
session_start();
session_regenerate_id(true);
if(isset($_SESSION['login'])==false)
{
print 'ログインされていません<br />';
print '<a href="../staff_login/staff_login.html">ログイン画面へ</a>';
exit();
}
else
{
print $_SESSION['staff_name'];
print 'さんログイン中<br />';
print '<br />';
}?>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ろくまる農園</title>
</head>
<body>
<?php
//if (isset($_POST["name"]) &&
// isset($_POST["pass"]) &&
// isset($_POST["pass2"])
// ) {
require_once('../common/common.php');
$post=sanitize($_POST);
$pro_name = $post["name"];
$pro_price = $post["price"];
$pro_gazou = $_FILES["gazou"];
// }
if($pro_name == '' ){
print '商品名が入力されていません<br />';
}
else
{
print '商品名:';
print $pro_name;
print '<br />';
}
if(preg_match('/^[0-9]+$/',$pro_price)==0)
{
print '価格をきちんと入力してください<br />';
}
else
{
print '価格:';
print $pro_price;
print '円<br />';
}
if($pro_gazou['size'] > 0)
{
if($pro_gazou['size'] > 1000000)
{
print '画像が大きすぎます';
}
else
{
move_uploaded_file($pro_gazou['tmp_name'],'./gazou/'.$pro_gazou['name']);
print '<img src="./gazou/'.$pro_gazou['name'].'">';
print '<br />';
}
}
if($pro_name=='' || preg_match('/^[0-9]+$/',$pro_price)==0 ||$pro_gazou['size']>1000000)
{
print '<form>';
print '<input type="button" onclick="history.back()" value="戻る">';
print '</form>';
}
else
{
print '上記の商品を追加します';
print '<form method="post" action="pro_add_done.php">';
print '<input type="hidden" name="name" value="'.$pro_name.'">';
print '<input type="hidden" name="price" value="'.$pro_price.'">';
print '<input type="hidden" name="gazou_name" value="'.$pro_gazou['name'].'">';
print '<br />';
print '<input type="button" onclick="history.back()" value="戻る">';
print '<input type="submit" value="OK">';
print '</form>';
}
?>
</body>
</html>
見直してすぐに疑問だったところ二つのファイルを挙げさせてもらいます。
➀SQLやパスワードのやり取りをする上でこれで安全なのか知りたいです。
➁他のファイルなのですが、使用者側のログイン・会員登録・削除と管理側のページが行き来できる事に危険性はないのか
➂preg_match で、半角英・数字を扱う文の書き方を教えていただきたいです。
-
気になる質問をクリップする
クリップした質問に回答があった場合に通知・メールを受け取ることができます。
クリップした質問はマイページの「クリップ」タブからいつでも見ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
+11
案件のレベルにもよりますが,概ね仕事で使う上で必要となってくるのは
- MVCフレームワークの動作原理および使い方
- Webセキュリティ
- HTTPプロトコルの基礎
- Linuxのコマンドライン操作
- Gitコマンドの操作
- Composerコマンドの操作
- MySQLの基礎およびインデックスを用いた高速化
このあたりでしょうか。全部重要ですが,即戦力を語るなら太字にした部分ぐらいはできないと話にならないと思います。あと場合によってはDockerとかも要りますね。
また敢えて書籍の評価については触れませんが,書籍でサンプルとして作成したWebサイトと,あなたが将来的に仕事で作りたいと考えるレベルのWebサイト,どの程度一致していますか?これもまた判断指標になると思います。例えば1990年代半ばの掲示板を作るのと,TwitterやFacebookのようなSNSを作るのは格段にレベルが違います。まず後者のようなサイトはPHPだけでは実現することができず,JavaScriptに関しても深い知識が求められます。
あなたが考える「プロ」はどのレベルですか?
【追記1】
➀SQLやパスワードのやり取りをする上でこれで安全なのか知りたいです。
いろいろ直したいところはかなり多いのですが,セキュリティ的にはひとまず問題ないレベルではあります。
➁他のファイルなのですが、使用者側のログイン・会員登録・削除と管理側のページが行き来できる事に危険性はないのか
あ,そこにお気づきですか,着眼点はいいと思います。要するにこれは実用性は考えてないので,そもそも使用者と管理者が一緒くたにされています。もしこれでECサービスを作るとしたら恐ろしい話ですね。
➂preg_match で、半角英・数字を扱う文の書き方を教えていただきたいです。
「半角英数字が最低1文字含まれている」という正規表現の例としては,
/[A-Za-z0-9]/
/[a-z0-9]/i
/[a-z\d]/i
などいろいろ書き方はありますが,お好きなものをどうぞ。それとも
こういうものをお求めでしょうか?
あと、手が空いたら挙げていただいた項目で、お勧めの書籍などあったら教えていただきたいです。
書籍ではなくWebサイトですが…
まずこれらを読んでみて,既に書いてみた書籍のサンプルと比較するといいと思います。 "いろいろ直したいところはかなり多い" と最初に存じ上げた意味がわかると思います。
また,書籍を挙げるとすればこれですかね。
何のサポートも無しにこれだけを渡して「初心者向けの本だよ」と薦められるものではありませんが,脱初心者~中級者ぐらいの読者対象に対して難しめの内容を分かりやすくイラストつきで教えている良書だと,書店で立ち読みして感銘を受けた記憶があります。
投稿 2017/06/11 17:52
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
以下のような回答は評価を下げられます
- 間違っている回答
- 質問の回答になっていない投稿
- 不快な投稿
評価を下げる際はその理由をコメントに書き込んでください。
+7
「終わらせる」というのが、
「書籍に記述されているすべてのコードとその仕組みを理解して、自分で設計/コーディングが出来るようになっている」という事であれば、適切な監督者の居る職場/現場や、要件の緩い案件であれば即戦力になると思います。
逆に、「ざっと読んで演習問題を一回終わらせた」くらいであれば、未経験新卒で入社して数か月くらいのレベルかと思います。
場合によってはこの状態でプロとして仕事を出来る場合もありますし、そうではない場合もあります。
(仕事になるレベルでの知識が得られるサイトも教えていただけたら嬉しいです)
「仕事になる」というのが、どのレベル/形態を想定されているのかを明確にすると、良い回答があるかもしれません。
例えば、
- フリーランスとして一人で完結する様な小規模案件を取ってみたい
- フリーランスとして専門家の知識が当然求められる現場にジョインしたい
- 新卒/第二新卒/未経験中途採用といった枠でエンジニアになりたい
- 法人を設立して、受託開発を本格的に行いたい
- 自社サービスを開発して売りたい
など、エンジニアとしてのスキル以外に必要なことが求められるケースとそうでないケースなど様々あります。
ただ、サイトにしても学校にしても書籍にしても、
実務を行わずに実務レベルの能力を習得するのは基本的にとても難しいことなので、
最終的に自分がしたいことを明確にしたうえで、可能な範囲/時期に実務に取り組むほかないかと思います。
投稿 2017/06/11 18:11
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
以下のような回答は評価を下げられます
- 間違っている回答
- 質問の回答になっていない投稿
- 不快な投稿
評価を下げる際はその理由をコメントに書き込んでください。
+6
○○を読み込んだら「即戦力」とかないですよ
本の課題なんていくらこなしたところで、基本的に答えがあることばかりでしょう
実務でいろいろな経験をして、いろいろ冷汗かいて、やっと即戦力じゃないでしょうか?
仕事を甘く考えすぎです
もちろんコピペコーダーなら即戦力かもしれませんが、そういうことじゃないんですよね
投稿 2017/06/11 19:32
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
以下のような回答は評価を下げられます
- 間違っている回答
- 質問の回答になっていない投稿
- 不快な投稿
評価を下げる際はその理由をコメントに書き込んでください。
+4
セキュリティ面で本に書いてあることなら、それを破ろうとするような方はもっと上の知識を持ってるでしょう。即戦力といわれるためには+αが必要なんじゃないでしょうか。その現場のレベルが低ければ即戦力と呼ばれるかもしれませんね。
投稿 2017/06/11 17:41
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
以下のような回答は評価を下げられます
- 間違っている回答
- 質問の回答になっていない投稿
- 不快な投稿
評価を下げる際はその理由をコメントに書き込んでください。
+3
私の身の回りで、『本に書いていることくらいは完全にマスター』して
いる人は、正直いないと思います。私も含めて。単に自分のレベルが
低いだけかもしれませんが。
それでも、周りから即戦力だと思われて、何とか案件をこなしています。
本に書いてあることは、実務のうちのごく一部だということではないかと。
一歩踏み出してみればいいんじゃないでしょうか。やってみて自分に
足りないところがもしあれば、そこで追加で勉強すればいいんだし。
別に実務をやっているから勉強できないということはないはずです。
投稿 2017/06/11 22:50
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
以下のような回答は評価を下げられます
- 間違っている回答
- 質問の回答になっていない投稿
- 不快な投稿
評価を下げる際はその理由をコメントに書き込んでください。
+1
即戦力ってどのような現場を想定しているんでしょうか。
気にするくらいならどこでもいいから現場に入って仕事をしてみるといいでしょう。
知識や技術を身に着けただけでは仕事はできないというを自らの身をもって経験してからが始まりです。
投稿 2017/06/11 20:35
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
以下のような回答は評価を下げられます
- 間違っている回答
- 質問の回答になっていない投稿
- 不快な投稿
評価を下げる際はその理由をコメントに書き込んでください。
15分調べてもわからないことは、teratailで質問しよう!
91.89%
質問への追記・修正、ベストアンサー選択の依頼
kei344
2017/06/11 21:58
質問が元のものから変わっています。一旦解決済みにした上で別途個別に質問されてはいかがでしょうか。
yuus2733
2017/06/11 22:26
そうですね、明日改めて書籍のコードを写したファイルを見直して投稿してみます。