作者hiigara (石头)
看板PHP
标题Re: [请益]请问 mysql_real_escape_string的写法?
时间Sat Aug 8 20:47:59 2015
※ 引述《ahoo122002 (承让)》之铭言:
: 请问mysql_real_escape_string?
: 有大约google了一下sql injection
: 之後想说这样写ok吗?
: 1.
: function test($value){
: return mysql_real_escape_string($value);
: }
: $name = test($_POST["name"]);
: $password = test($_POST["password"]);
escape sql 是在有 SQL 的地方才应该做的事情
没有SQL 的时候 escape ...没什麽 OK 不 OK 可言...
: 2.
: <?php
: function mysql_escape_mimic($inp) {
: // blah blah
: return $inp;
: }
: $name = mysql_escape_mimic($_POST["name"]);
: $password = mysql_escape_mimic($_POST["password"]);
不要写自己的 escape function,要用别人写好的
这世界比你以为的险恶太多...
你写的方法看起来跟 addslashes() 满类似的
那麽就有可能被人用塞入奇怪的多 byte 字元攻破
操作方法像是这篇
http://www.securityidiots.com
/Web-Pentest/SQL-Injection/addslashes-bypass-sql-injection.html
: 有高手可以提供其他好的写法吗?
: 先不谈PDO,ORM <----这还不太懂
还是谈一谈比较好,用 PDO 比较不容易作错事情...
// 1. DB 先生,你好,我要跟你建立连线
// 2. DB 先生,我等下要下这句 SQL,其中有个参数叫做「:name」
// 真的执行的时候我会跟你说会「:name」的内容是什麽
// 3. DB 先生,「:name」 的内容是 $_POST['name'],请跑我刚刚那句 SQL
// 4. DB 先生,请把刚刚执行的结果回给我
$db = new PDO('mysql:host={机器的IP};dbname={DB的名字}', '帐号', '密码');
$db->prepare('SELECT * FROM user WHERE name=:name');
$db->execute([':name' => $_POST['name']]);
$result = $db->fetchAll();
其中那个 prepare() 在做的事情叫做「prepared statement」,细节请自己找
然後这样下的话 DB 会帮你搞定 escape 之类的事情,你可以完全不用管
不用自己 escape,那就不会 escape 错...
然後 ORM 其实只是把 DB 操作包装起来而已,写 code 的时候连 DB 在哪都不用管了
且 ORM 不是个标准,很多人在写,大家写的都不太一样...
以下是 Laravel 的范例
// 查询使用者资料
// 钱包扣一百元
// 存档
$member = Member::where('name', '=', )->first();
$member->money = $member->money - 100;
$member->save();
一个 row 拉出来会变一个物件,然後可以直接改物件的内容来改资料
ORM 就是这件事...
好处是有人觉得这样写比较直觉(也有人不这麽认为)
然後你不用管 escape ,现代的 ORM 会帮你搞定(通常是透过底层的 PDO)
ORM 连 SQL 都不太让你写...
不用自己 escape,就不用担心 escape 错东西
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 114.27.58.126
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/PHP/M.1439038082.A.307.html
※ 编辑: hiigara (114.27.58.126), 08/08/2015 20:53:24
1F:推 ahoo122002: 是否只有文字输入的部份,要防sql injection 08/10 19:45
2F:推 LPH66: 所有外来的东西 (不论是不是输入框) 都要防 08/10 21:52
3F:→ MOONRAKER: 是阿,是否只有参数要防injection? 参数和SQL stmt 08/11 10:33
4F:→ MOONRAKER: 一定要在一起escape才算数吗?SQL stmt又不会有外来的 08/11 10:34
5F:推 ahoo122002: 针对第1个写法,想说大家都知道,所以省略sql,才只贴 08/12 19:50
6F:→ ahoo122002: 部份程式码,来问大家。 08/12 19:50
那你就只是帮 mysql_real_escape_string() 改个名字而已?
※ 编辑: hiigara (211.23.191.35), 08/12/2015 23:07:12
7F:→ ahoo122002: 就写个function,要用到的就run 08/13 19:12