在阅读了几篇关于PDO和MySQLi准备语句的文章之后,也已经在stackoverflow.com上阅读了关于预备语句和SQL注入的几十个问题,人们说正确使用预准备语句就不再需要从用户那里逃避条目了,但是我想我仍然担心安全问题 .
1st Question: 如果我仍然使用reg-exp清理条目并在我准备好的语句中使用它们之前进行转义,是否就像我过度使用它一样?
2nd Question: 如果准备好的陈述事情正在做关于SQL注入的工作 - 从人们的评论和答案 - 为什么仍然存在受损的数据库和越来越多关于信用卡号码和密码的暴露数据,甚至来自"big"和知名网站的黑客帐户?这是否意味着单独准备的声明不是那么免疫,或者它是一个完全不同的主题?
3 回答
如果要删除SQL中具有特殊含义的字符,因为它们在SQL中具有特殊含义,那么's a waste (and leads to storing Ms. O' Donnell的姓氏不正确)
如果你正在逃避这些角色,那么你将得到双重编码,这很糟糕,因为你最终会发送电子邮件(例如)从亲爱的O女士Donnell开始发送电子邮件 .
如果您确定日期是合理的日期,那么这只是对数据完整性的合理保护 .
因为:
并非每个人都使用准备好的陈述
并非所有使用它们的人都正确使用它们
数据库可以通过其他向量进行攻击(例如Web服务器中的远程执行代码漏洞或对管理员用户的SSH帐户的暴力攻击) .
如果你正在瞄准sql安全 only - 是的,它显而易见且无用的矫枉过正 .
是的,当然 . 事实上,本地准备的陈述只涵盖了一小部分案例,对其他案件没有任何保障 .
尽管如此,准备好的声明的想法总的来说是一个很好的 - 所以,开发人员必须自己处理其他情况 .
这是我的解决方案 - 一个library that offers a placeholder for the everything,而不仅仅是两个标量数据类型
双重逃避是错误的,你不需要它 . 你只需要传递变量PDO就会照顾好休息 .
攻击站点可以通过各种方式完成 . 人们并不总是使用准备好的陈述 . 可能存在很多攻击,如XSS,CSRF,攻击者可能会尝试关注服务器配置 .
基本 YOU NEED TO TAKE CARE OF EVERY VARIABLE THAT YOU MAY PUT IN DATABASE
攻击者很聪明,他们试图找到获取db的原始方法 . 例如,他们可以将xss放在请求的浏览器标头中,如果您在管理面板中使用统计信息,则显示浏览器xss可能有效!这就是为什么注意输入是如此重要 . PDO很好地完成了这项工作 .
为了确保一切正常,你应该问自己一个问题:
数据是否获得了我想要的数据? (使用preg_match) .
是否针对xss,csrf,sql注入进行了转义?
看看服务器的php和mysql配置,有时脚本是由其他东西保护安全的 .
PDOStatement::bindValue() 有一个名为 data_type 的参数使用它 . 如果你想要字符串使用 PDO::PARAM_STR 如果int PDO::PARAM_INT 等 .
来自php手册的报价: