我有点糊涂了,有这么多的功能在PHP中,有的利用这一点,一些使用。 有些人使用: htmlspecialchars()
htmlentities()
strip_tags()
等
这是正确的和你是什么人通常使用?
这是正确的(告诉我一个更好的,如果有的话):
$var = mysql_real_escape_string(htmlentities($_POST['username']));
这条线可以防止MySQL的注入和XSS攻击?
顺便说一下,还有没有其他的事情,我需要注意,除了XSS攻击和MySQL注入?
编辑
总之:
如果我想插入串到数据库中,我并不需要使用htmlentities
,只需使用mysql_real_escape_string
。 当显示的数据,使用htmlentities()
是你一切意味着?
总结:
-
mysql_real_escape_string
当插入到数据库中使用 -
htmlentities()
的数据输出到网页时使用 -
htmlspecialchars()
使用时? -
strip_tags()
使用时? -
addslashes()
使用时?
有人可以在问号填?
-
mysql_real_escape_string
当插入到数据库中使用 -
htmlentities()
的数据输出到网页时使用 -
htmlspecialchars()
使用时? -
strip_tags()
使用时? -
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 / htmlspecialchar你的输出,该文本将在那里原样。 如果你strip_tag它,它只是删除标记,并显示:
pictures of kittens here
有时你可能想的混合物,留下有一些标签,像<b>
strip_tags
可以在那里留有一定的标记)。 这是不安全的太多,所以最好使用对XSS一些完全成熟的库。
和addslashes
引用一个旧版本的PHP手册 :
返回与反斜线的字符串前在数据库查询等被引用需要的字符这些字符是单引号('),双引号(“),反斜线()和NUL( 空字节)。
一个例子使用addslashes()的是,当你将数据输入到数据库中。 例如,插入名字O'reilly的到数据库中,你需要逃脱它。 它的高度recommeneded使用DBMS特定的逃生功能(如mysqli_real_escape_string()为MySQL或pg_escape_string()PostgreSQL的),但如果DBMS您正在使用简化版,有一个逃生功能和DBMS使用\转义特殊字符,你可以使用此功能。
在目前的版本是不同的措词。
否则你会碰到,你要处理的真实数据情况 - 只有当它进入它需要被编码的系统编码的点数据。
对于SQL注入-用作描述的约束变量我怎么能防止在PHP中SQL注入? (它谈论准备好的语句,但它是给你的保护,而不是准备绑定)。
对于XSS - 如果你在点写入HTML已指定HTML或文本。 在您生成文档点使用ヶ辆。 我会避免存储在表单中的数据库中的数据(除了可能在写稀土读常系统中CPU的性能/磁盘访问时间已逐渐成为与问题 - 那么我将有一个raw_和列的html_版本...或者只是使用memcached的或类似)。
如果你是让用户输入网址,那么你就需要更加小心,因为javascript:do_evil()
是一个有效的URI,将执行(例如,作为一个点击后链接或(在某些浏览器)的图像的src一个href那只是加载)。
htmlspecialchars()
变成&
, '
, "
, <
,和>
成HTML实体格式( &
, "
等)
htmlentities()
关闭所有适用的字符成HTML格式。
strip_tags()
删除所有HTML和PHP标记。
无论htmlspecialchars()
和htmlentities()
需要说明引号应该如何处理的可选参数。 具体请参阅PHP手册。
将strip_tags()
函数将表明不应该被剥夺什么标签的可选参数。
$var = strip_tags ($var, '<p><br />');
将strip_tags()
函数将删除甚至无效的HTML标签,这可能会导致问题。 例如, strip_tags()
将抽出了所有它认为的代码是一个HTML标签,即使它的格式不正确的,像
<b I forgot to close the tag.
你只需要插入到数据库,并htmlentites显示HTML时用于函数mysql_escape_string()。 这是足够的,如果你想防止简单的注入攻击,但目前还没有疑问,你应该知道开发一个web应用程序,另一个主要的一个是跨站请求伪造时的许多其他安全问题。
我不会用ヶ辆插入数据时到数据库或查询数据库()。 如果您在数据库中的数据被存储为实体,即数据则只有的东西,了解HTML实体有用。
你必须使用不同的逃逸机制,不同类型的输出,如SQL - mysql_real_escape_string() ,HTML - ヶ辆()或用htmlspecialchars() - ,壳牌()escapeshellarg 。 这是因为有“危险”的人物是为每一个不同的 - 没有一个神奇的方式,你可以做任何数据安全的任何输出介质。
看看这个网站PHP安全联盟 。 我发现它是对PHP安全(SQL注入和XSS在内)的整体概况的好发部位。
我知道这是一个老问题,但时下最投票的答案可能会误导对初学者。
2017年
你应该永远使用mysql_real_escape_string。 即使mysqli_real_escape_string太弱,无法保护你的数据库从SQL注入。 取而代之的是,你应该使用PDO,以及类似的技术。 (见该指南 )
XSS(在这里我的意思是: strip_tags()
addslashes()
htmlspecialchars()
htmlentities()
-这里最投票的答案仍然是正确的,但我会建议阅读这篇文章