我有点困惑,PHP里的函数太多了,有的用这个,有的用那个。有些人使用:htmlspecialchars()
、htmlentities()
、strip_tags()
等
哪一个是正确的,你们通常使用什么?
这是正确的吗(如果有的话,建议我一个更好的):
$var = mysql_real_escape_string(htmlentities($_POST['username']));
这行可以防止MySQL注入和XSS攻击吗??
顺便说一下,除了XSS攻击和MySQL注入之外,我还需要注意其他事情吗?
编辑
结论:
如果我想在数据库中插入字符串,我不需要使用htmlentities
,只需要使用mysql_real_escape_string
。当显示数据时,使用htmlentities()
,这就是你们的意思吗??
总结:
插入到database
htmlentities()
时使用mysql_real_escape_string
将数据输出到webpagehtmlspecialchars()
时使用when?strip_tags()
使用when?addslashes()
在以下情况下使用?谁能填一下问号?
发布于 2009-07-30 13:02:03
插入到database
htmlentities()
时使用mysql_real_escape_string
将数据输出到webpagehtmlspecialchars()
时使用when?strip_tags()
使用when?addslashes()
在以下情况下使用?htmlspecialchars()在什么时候使用?
htmlspecialchars
与htmlentities
大致相同。区别在于:字符编码。
两者都编码控制字符,如<
、>
、&
等,用于开始标记等。htmlentities
还编码来自其他语言的字符,如变音符号、欧元符号等。如果您的网站是UTF,请使用htmlspecialchars()
,否则请使用htmlentities()
。
什么时候使用strip_tags()?
htmlspecialchars
/ entities
对特殊字符进行编码,因此可以显示这些字符,但不对其进行解释。strip_tags
会删除它们。
在实践中,这取决于您需要做什么。
举个例子:你编写了一个论坛,并给用户一个文本字段,这样他们就可以发布东西了。恶意用户只需尝试:
pictures of <a href="javascript:void(window.setInterval(function () {window.open('http://evil.com');}, 1000));">kittens</a> here
如果你什么都不做,这个链接就会被显示出来,受害者点击这个链接就会看到很多弹出窗口。
如果htmlentity/ will指定输出字符,则文本将按原样显示。如果你strip_tag它,它简单地删除标签并显示它:
pictures of kittens here
有时你可能想要一个混合的,留下一些标签在那里,如<b>
(strip_tags
可以在那里留下某些标签)。这也是不安全的,所以最好使用一些成熟的库来对付XSS。
地址斜杠
引用old version of the PHP manual
返回一个字符串,在数据库查询等需要引用的字符前面有反斜杠。这些字符是单引号(')、双引号(")、反斜杠()和NUL ( NULL字节)。
addslashes()的一个示例用法是在数据库中输入数据时。例如,要将名称O‘’reilly插入到数据库中,您需要对其进行转义。强烈建议使用数据库管理系统特定的转义函数(例如,用于MySQL的mysqli_real_escape_string()或用于PostgreSQL的pg_escape_string() ),但如果您正在使用的数据库管理系统没有转义函数,而数据库管理系统使用\来转义特殊字符,则可以使用此函数。
current version的用法有所不同。
发布于 2016-06-16 09:24:18
我想到了这个快速清单:
php.ini
之外暴露用户的会话ID (,会话ID)。如果任何人知道别人的会话ID,他们可以简单地使用它登录到自己的帐户Remember me
函数,在用户登录时显示一个小小的警告maybe.
SQL永远不要信任cookie,脚本/用户可以在任何与moment
PDO
等库会忽略该错误,并在日志中记录一个警告。这会导致你从数据库获取的变量为null,这取决于你的代码,这可能会导致一个安全问题。PDO
,模拟预准备语句。UTF-8
编码,它允许您存储几乎任何字符,并避免与编码相关的UTF-8
将任何内容连接到您的查询。像$myquery = "INSERT INTO mydb.mytable (title) VALUES(" . $user_input . ")"
这样的东西很大程度上意味着SQL injection.存在巨大的安全风险。
,请确保你的.php
副本不容易受到CSRF attack.
发布于 2009-07-30 11:09:06
只在需要对数据进行编码的地方对数据进行编码-否则,您将遇到需要处理真实数据的情况。
对于SQL注入-使用How can I prevent SQL injection in PHP?中描述的绑定变量(它讨论的是预准备语句,但它是为您提供保护的绑定,而不是准备)。
对于XSS -如果在指定HTML或文本的位置写入HTML。在生成文档的位置使用htmlentities。我将避免以这种形式将数据存储在数据库中(除非在写入极少、读取频繁的系统中可能出现CPU性能/磁盘访问时间和问题-那么我将拥有一个raw_和一个html_版本的列…或者只使用memcached或类似的)。
如果您让用户输入URL,那么您需要更加小心,因为javascript:do_evil()
是将执行的有效URI (例如,作为被点击链接的href,或者(在某些浏览器中)刚刚加载的图像的src )。
https://stackoverflow.com/questions/1205889
复制相似问题