Re: [请益] 无法写入mysql数据库

楼主: SKL (:Q~~~~~~~)   2014-09-25 13:28:20
另外提一点 SQL Injection 问题,
如果我没看错,你的 chgStr 这样写实在很危险,
只要输入 \' 就跳出来了阿...
e.g. SELECT foo FROM bar WEHRE aaa='\'''
1. 请 google prepared statements
除了 ext/mysql 你还有更好的选择 => MySQLi 或 PDO_MySQL
尽量别再自己串 sql query 了...
(在 5.5 以前真要串的话也有 mysql_real_escape_string 可用)
而且 ext/mysql 在 5.5 之后准备掰掰了阿
http://php.net/manual/en/migration55.deprecated.php
2. 至于上篇 tkdmaf 提到的“魔术引号”为免误解只要了解一下就好不要靠它,
因为 Magic Quotes 也在 5.3 deprecated, 5.4 掰掰了
http://php.net/manual/en/security.magicquotes.php
==
感觉你看的书或范例已经有点年代了... @@
※ 引述《tkdmaf (皮皮快跑)》之铭言:
: ※ 引述《dummytrue (就只是大叔而已)》之铭言:
: : 超新手发问:
: : 确认可以连结数据库了
: : 从phpmyadmin新增资料也可以顺利显示
: : 可是从php就怎么也写不进去
: : <FORM Action=addnew.php Method=POST>
: : <TABLE Border="1" bgcolor="#FFCC66" bordercolor="#FF9933" cellspacing="0">
: : <TR><TD><font size="2">姓名:</font></TD>
: : <TD><font size="2"><INPUT Type="text" Size="30" Name="姓名"></font></TD></TR>
: : <TR><TD><font size="2">e-mail:</font></TD>
: : <TD><font size="2"><INPUT Type="text" Size="30" Name="e-mail">
: : </font></TD></TR>
: : <TR><TD><font size="2">主题:</font></TD>
: : <TD><font size="2"><INPUT Type="text" Size="60" Name="主题">
: : </font></TD></TR>
: : <TR><TD><font size="2">内容:</font></TD>
: : <TD><font size="2"><TEXTAREA Name="内容" Rows="8" Cols="60">
: : </TEXTAREA></font></TD></TR>
: : </TABLE><INPUT Type="submit" Value="送出讨论主题">
: : </FORM>
: : 然后由这边接:
: : Function chgStr($data)
: : {
: : $chgStr = "'" . str_replace("'", "''", $data) . "'";
: : return $chgStr;
: : }
: : //将资料写入数据库
: : $sql = "Insert Into maintitle (姓名, Email, 主题, 内容, 篇数, 发言日期)
: : Values (";
: : $sql = $sql . chgStr($_REQUEST["姓名"]) . ",";
: : $sql = $sql . chgStr($_REQUEST["e-mail"]) . ",";
: : $sql = $sql . chgStr($_REQUEST["主题"]) . ",";
: : $sql = $sql . chgStr(nl2br($_REQUEST["内容"])) . ",";
: : $sql = $sql . 0 . ",'";
: : date_default_timezone_set('Asia/Taipei');
: : $sql = $sql . date("Y-m-j H:i:s") . "')";
: : mysql_query($sql);
: : header("Location: index.php");
: : 没有全部贴出来 应该是这两段有问题吧?
: 几个地方要注意,有的比较重要,有的是coding style
: 1.所有的函式指令集一律使用小写。不要有大小写混用的情形:
: 例:
: 正确:echo、function
: 错误的style:Echo、ECHO、Function
: 虽然使用错误的style并不一定会有错误,但对看的人而言要不是觉得奇怪。
: 要不就是有格格不入的感觉。
: 2.数据库指令集有很多php的书都是教用大写。
: 这当然也是coding style的问题,但是对sql指令集来说我的习惯是要就全部大写,要
: 就全部小写,不要大小写混在一起使用,就算他不会出错也不好。
: (其实我看到比较多的习惯是SQL指令集全大写,字段、资料才是用小写)
: 3.$_REQUEST最好不要使用。
: 这东西是POST和GET都吃,那如果你表单也下name你设定post送出。
: 然后你的网址又带name=xxx
: 虽然这样取资料会是以表单的post为主。
: 那如果你的网址带的参数是有意义的话参数就被消灭了。
: 该是post就用$_POST该是get就用$_GET
: 4.数据库的字段……正确的说除了资料本身数据库的设定都不要用中文。
: 这个问题基本关乎中文编码。就算你全部统一使用UTF-8做为你的编码。
: 有关于数据库的结构和指令集都不应该让他出现中文。
: 这我该说做为一个程式设计师就算英文跟我一样烂也实在不应该以中文做为程式码
: 或是规划数据库的一部份。
: 不过话说回来,这种错误大概很多初学新手都会犯到使用中文。
: 当年我刚开始学MYSQL时,也干过同样的事。
: 后来就是自食恶果。
: 5.时区设定请写在SERVER的PHP.INI设定中。如果是使用付费空间就请对方改。
: 基本上时区应该是全网页一体适用。
: 如果说这是不能改的,那你最好祈祷你每次都记得设定时区,否则在做交易时可能
: 会因为时间上的错误导致交易异常。
: 也许现在的很多framework都有内置config来设定时区。
: 前提是你有在用。
: 尽可能将必要的设定做在server的设定档中,而不是用程式中途去改。
: 除非是特别状况(例如临时上传大档案要临时加大内存使用的空间)
: 6.无论如何,去了解一下关于php“魔术引号”这件事情。
: 7.date()格式,通常是Y-m-d或是Y-n-j,Y-m-j会变成下面这种情形:
: 2014年9月4日
: Y-m-d => 2014-09-04
: Y-n-j => 2014-9-4
: y-m-j => 2014-09-4
: 你应该会觉得月份和日期感觉格格不入吧。
: 当然这是个人感觉style的问题。
: 其实大部份应该都算是设计风格上的问题。
: 毕竟你的程式是能正常运作的。
: 不过去改善这些事情对修改及维护会很有帮助。
作者: duck10704 (duck)   2014-09-25 14:22:00
处理sql时候要 filter input, escape output :P
作者: MOONRAKER (㊣牛鹤鳗毛人)   2014-09-25 22:00:00
找工作必考SQL injection怎么防 差不多有笔试都会考

Links booklink

Contact Us: admin [ a t ] ucptt.com