回答編集履歴

4

2か月前の回答に低評価するのは相当何かあると思いますが、技術的観点でご指摘ください。

2019/06/04 07:19

投稿

m.ts10806
m.ts10806

スコア80850

test CHANGED
File without changes

3

修正

2019/06/04 07:19

投稿

m.ts10806
m.ts10806

スコア80850

test CHANGED
File without changes

2

修正

2019/04/12 08:21

投稿

m.ts10806
m.ts10806

スコア80850

test CHANGED
@@ -5,8 +5,6 @@
5
5
  プリペアドステートメントをキーで設置する場合にクォーテーションは不要
6
6
 
7
7
  - [PDOStatement::bindValue](https://www.php.net/manual/ja/pdostatement.bindvalue.php)
8
-
9
- こんなSQLになります:update shop set yesno = ''aa'', comment = ''aaa'' where id='1'
10
8
 
11
9
 
12
10
 
@@ -22,7 +20,25 @@
22
20
 
23
21
 
24
22
 
23
+ `$yesno = htmlspecialchars($_SESSION['yesno'], ENT_QUOTES, 'UTF-8');
25
24
 
25
+ $comment = htmlspecialchars($_SESSION['comment'], ENT_QUOTES, 'UTF-8');`
26
+
27
+ htmlspecialchars() したものをDB登録に使ったらダメ、絶対。
28
+
29
+ 実際に出力の時にも使ってたらhtmlspecialchars(htmlspecialchars())と二重にすることになる。
30
+
31
+ 入力情報は原則全てそのまま受け入れること。(入力チェックで弾くのは当然のこと入力チェックOKの値を加工することになるので)
32
+
33
+ - [「何故htmlspecialcharsを通すのか?」を一言でどうぞ](https://qiita.com/mpyw/items/19e6fed835ccdbcb0d6d)
34
+
35
+ > SQL文にユーザ入力を埋め込む際にhtmlspecialcharsを用いるのは不適切である。求められる変換は text/plain から text/html ではなく、text/plain から application/sql(における文字列リテラル) だ。この処理はプリペアドステートメントとそれに付随するプレースホルダが役割として担うものである。
36
+
37
+
38
+
39
+ と、いうことで、
40
+
41
+ そもそもこんなSQLになって`update shop set yesno = ''aa'', comment = ''aaa'' where id='1'`
26
42
 
27
43
  SQLのエラーでるはずだが拾う仕組みになっていない。
28
44
 

1

修正

2019/04/12 08:10

投稿

m.ts10806
m.ts10806

スコア80850

test CHANGED
@@ -5,6 +5,12 @@
5
5
  プリペアドステートメントをキーで設置する場合にクォーテーションは不要
6
6
 
7
7
  - [PDOStatement::bindValue](https://www.php.net/manual/ja/pdostatement.bindvalue.php)
8
+
9
+ こんなSQLになります:update shop set yesno = ''aa'', comment = ''aaa'' where id='1'
10
+
11
+
12
+
13
+ idが直に入れられているのでこれも本来はプリペアドステートメントで値を設置すべき。
8
14
 
9
15
 
10
16
 
@@ -20,7 +26,9 @@
20
26
 
21
27
  SQLのエラーでるはずだが拾う仕組みになっていない。
22
28
 
23
- 「エラーがでない」じゃなくて「エラーを拾う」作りにすること
29
+ **「エラーがでない」**じゃなくて**「エラーを拾う」**作りにすること
30
+
31
+ SQLはPHPからすると外部の仕組み。勝手にエラーは出してくれない。
24
32
 
25
33
 
26
34