Re: [请益] PHP字符溢位(OverFlow)

楼主: GALINE (天真可爱CQD)   2015-10-29 02:49:46
※ 引述《st1009 (前端攻城师)》之铭言:
: 不好意思,我初学php加设网页后台,
: 想询问一些关于php的基本问题>///<
: 1.
: 请问php的一个变量内部可以融纳下多少位字符,我在查这个时都查到整数(int)的~__~
: 如果我设定 $x = $_POST["x"]; 让使用者输入字串,
: 使用者输入字串超出变量可以融纳下的范围php会如何处理?
不同资料型态不能一概而论,也不建议去挑战这种事情。
不过以字串来说..
https://secure.php.net/manual/en/language.types.string.php
“Note: string can be as large as up to 2GB”
字串长度上限是2GB,我想应该大多数情况下你不用担心有人 post 2GB 的东西进来...
阵列在内存够的前提下,我平常用的时候百万或千万之类的数量也没啥问题
同样的我想你应该也不用担心有人 post 一千万个字段进来...
在你碰到这么大的资料之前,通常你会先因为内存不够而整只 script 死掉。
: 2.
: 我看网络上有的网址为.php?id=1
: 有的甚至可以直接在URL列登入帐号密码,
: 请问这个运作过程为何?为何能实现?
: 再自行架设的网站内试图于URL登入,但都失败QAQQQ
“登入”的意思是“记住这个人是谁”,至于是 post 或 get 都跟“记住”这件事无关
记住的方法可以用 session,也可以用 cookie。
程式流程大概会像这样
- 检查帐号密码对不对
- 对了,做一个记住的动作
- 错了,做一个显示错误讯息的动作
当然了,登出也就是“忘掉”,把“我是谁”这件事从 session/cookie 里面砍掉
不过 cookie 是使用者可以乱改的东西,使用时请注意
但是讲到这个用网址登入...假设你可以可以用网址直接登入,那么
- 浏览器的历史会记住这个帐号密码
- 你后面的人会看到网址列的帐号密码
- Google 可能会记住这个帐号密码
- 我可以搜寻“inurl:www.example.com/login.php”直接爬出一大堆
- 各种奇怪爬网址的 bot 可能会抓到这个帐号密码
不要、不要、不要用 get 传帐号密码
登入时传帐号密码请用 post
: 3.
: 我看见访间有一种网页攻击方式为xss攻击,
: 再自行架设后的留言板中进行测试,
: 发现如果我直接输入<script>标签他会产生反应,
: 但是当输入:
: &#60&#115&#99&#114&#105&#112&#116&#62&#97&#108&#101&#114&#116
: &#40&#39&#104&#97&#99&#107&#101&#100&#39&#41&#60&#47&#115&#99
: &#114&#105&#112&#116&#62
: 却是以字串方式呈现,是否xss攻击无法由10进制html代码,甚至其他代码执行,
: 只要我过滤掉了'<'和'>'就不须当心xss了?
https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet
这一整页长长的都是 XSS 的方法,里面有很多不用直接打 <>
实际上到底要怎么防御才完善要 case by case 去看
- html 的内文要靠 htmlspecialcahrs() 去洗
- 如果你还想让使用者自己输入 html,自己挡会挡不完...请参考 html purifier
- javascript(咳)通常可以靠 json_encode() 去洗
- 网址...恩...这有点难搞...
: 4.
: 听说要挡住sql injection 只要使用magic quotes就可以了(?
: magic quotes后来不被php自动执行请问是有什么副作用?如何避免?
不要用 magic quotes,这是上个世纪留下来的失败功能
- 你会拿不到原始的使用者输入资料
- 稍微不小心一点,你就会把“It's Friday”存盘成“It\'s Friday”
- 对于有经验的攻击者以及设计良好的 bot,magic quote 毫无用处。
所以 PHP 三年前把这功能拔掉了。
现代推荐的正确做法,是使用 PDO 跟 prepared statement
$db = new PDO($dsn, $db_user, $db_password);
$stmt = $db->prepare("SELECT nick_name FROM users WHERE uid = ? LIMIT 1");
$stmt->execute([$uid]); // 这边就算 uid 被塞了脏东西也不用怕
$result = $stmt->fetch();
echo is_array($result) ? "我是" . $result['nick_name'] : "查无此人";
作者: y2468101216 (芸)   2015-10-29 16:37:00
推这篇
作者: xdraculax (首席怪叔叔)   2015-10-29 21:36:00
真的需要存长字串还是要查一下memory_limit比较好,4年前在某游戏公司改后台,它字串最长只能200KB...
作者: dlikeayu (太阳拳vs野球拳)   2015-10-30 04:06:00
nosql+json request parse才是长久之计跟交易模式比较有关的或真的需要ACID定义的再用SQL
作者: st1009 (前端攻城师)   2015-10-30 23:18:00
专业详细,感谢您(≧<>≦)

Links booklink

Contact Us: admin [ a t ] ucptt.com