2009-11-27 31 views
3

我正在看看如何正确地转义来自外部世界的数据,然后才能将其用于应用程序控制,存储,逻辑......这种事情。转义用户数据,没有魔术引号

很明显,在PHP 5.3.0+版本中很快弃用了magic quotes指令,并且在php6中删除了这个指令,对于那些希望升级并进入新语言特性的用户,同时维护旧版代码(don我们喜欢它..)。

但是,我没有看到的一件事是关于理论/最佳实践的讨论,一旦您保护了数据后应如何处理 - 例如,是否使用斜线存储?我个人认为保持逃脱在DB数据并不是一个好的做法,但希望听到的讨论,最好读一些案例研究..

从PHP手册中的某些链接仅供参考:

PHP Manual - mysql_real_escape_string

PHP Manual - htmlspecialchars

等等等等

任何提示吗?

+3

你说的“例如,存储有或没有斜线”的事实使我相信你可能有一个错误的正确转义的概念。如果你正确地进行转义,那么发送到需要斜线的数据库的字符串将会拥有它们,但实际上并不存储在数据库中。如果您在数据库中看到斜线,则数据不正确地逃脱。 – longneck 2009-11-27 16:42:57

+0

请解释更多longneck - mysql会在插入前删除转义符吗?有关于此的网页吗?但是你是对的 - 我想我在过去的某个时候忽略了这一点,现在试图赶上。 – dmp 2009-11-27 16:49:54

+0

mysql_real_escape_string不会转义斜杠等。它使SQL查询的字符串安全。 – William 2009-11-27 16:51:14

回答

6

看看准备好的语句。我知道在MySQL中这工作得很好,并且是一种将数据存入数据库的安全形式。它也有一些性能优势。

http://dev.mysql.com/tech-resources/articles/4.1/prepared-statements.html

我有更多的资源,如果你有兴趣。

希望这是你在找什么,tc。

编辑:

有一件事我可以补充的是在准备好的语句组合使用过滤器。例如,要检查该值是否是使用FILTER_SANITIZE_STRING的值,或者是您使用FILTER_SANITIZE_EMAIL的电子邮件。

这节省了一些代码量,并且工作得很好。之后您可以随时使用自己的方法检查数据,但可以使用很多过滤器。

+0

谢谢,将通读! – dmp 2009-11-27 16:51:56

+0

我一直在寻找这个 - 你提到了更多的资源,如果你有机会,我会欣赏一些链接!再次感谢提示。 – dmp 2010-03-05 12:14:46

+0

看看这两个链接: http://net.tutsplus.com/tutorials/php/getting-clean-with-php/和http://net.tutsplus.com/tutorials/other/top-20- mysql-best-practices/ 一个如果对于php和一个对于mysql,只是一些最佳实践,享受! – 2010-03-05 23:21:29

0

很简单。在将数据插入数据库之前,所有传入的数据都应该通过mysql_real_escape_string()。例如,如果你知道某些东西需要是一个整数,那么在插入它之前将其设置为一个整数,等等。记住,这只是为了阻止SQL注入。 XSS和数据验证是不同的。

如果您希望成为电子邮件,那么在将其插入数据库之前,您显然需要对其进行验证。

htmlentities()清理数据,意味着它修改的数据。我认为你应该始终将原始数据存储在数据库中,并且当你抓取这些数据时,选择你想如何消毒的数据。

我喜欢使用以下函数作为mysql_real_escape_string()函数的“包装器”。

function someFunction($value) 
{ 
    if (is_int($value) || is_float($value)) { 
     return $value; 
    } 
    return "'" . mysql_real_escape_string((string) $value) . "'"; 
} 

如果该值是一个浮点或整数,那么在运行mysql_real_escape_string()没有意义的。在将值传递给mysql_real_escape_string()之前,我将该值转换为字符串的原因是因为有时该值可能不是字符串。

不是一个字符串值的例子:

http://localhost/test.php?hello[]=test

内test.php的,你在$ _GET运行mysql_real_escape_string() [ '你好']希望你好是一个字符串。那么,因为人将值设置为数组,它实际上会引起通知,因为hello不是字符串。

+0

你的回答并不完全清楚。你的建议是不要使用htmlentities? – markus 2009-11-27 16:40:55

+0

他的建议是在数据库存储之前始终使用mysql_real_escape_string – 2009-11-27 16:42:43

+0

将数据存储在数据库中时?是的,我的建议是不使用htmlentities。如果我向浏览器输出数据,那是用户数据,那么是的,我会通过htmlentities来运行它。有时我可能不想要某些情况下,关键是我有这种选择,当我访问该数据。 – William 2009-11-27 16:43:45

2
  • 使用运行查询时逃逸数据的正确方法: mysql_real_escape_string,准备查询,等等...在数据库不变

  • 使用转义的正确的方法

  • 存储数据输出数据: htmlspecialchars等。

+0

谢谢,没有足够的人意识到数据需要双方因不同原因而逃脱。 SQL注入已经变得不那么令人担忧了,似乎很多人都明白这一点,但XSS已经变得越来越普遍了,我很高兴看到像加伦这样的人谈论它,以及如何预防它。 – 2009-11-28 00:09:46

1

对于数据库插入,解决方案是使用bind variables。通常,任何时候当你发现自己逃脱任何事情(shell命令,db命令块,用户提供的html等等的参数)时,它表明你没有使用正确的函数调用(例如,使用system,当你可以使用exec的多参数形式),或者你的框架是有缺陷的。在缺陷框架下工作的标准方法是加强它,以便您可以回到不考虑引用。

思考逃跑的程度和引用的级别可能很有趣,但如果你真的喜欢那些在空闲时间玩Tcl的游戏。对于真正的工作,除非你正在设计一个供其他人使用的库,否则你不应该考虑引用,在这种情况下,你应该引用正确,让用户避免引用思考。 (并且你应该非常仔细地记录你准确地引用了什么类型的引用)

2

对于数据库工作,检查参数化查询和预处理语句。 PDOmysqli对此很有帮助。

Htmlspecialchars是在html文档中显示一些文本的正确工具。

而且,正如您所提及的php 5.3,您可以访问在处理用户数据时必须使用的filter functions