我在PHP实验的社交网站合作。所以,会有很多用户提交的数据被发送到数据库。
我已经编写了一个自定义块脚本,而这只会阻止某些字符或关键字被提交。这工作,但它有问题的列表。
我听说addslashes和mysql_real_escape_string会这样做,但我不想做任何事情,直到我得到一些可靠的建议。
我尝试addslashes,它会添加斜线不能,不,等等,我不想这样。
我只想让我的数据库从xss,html,php和javascript攻击中安全。有什么建议?从PDO
我在PHP实验的社交网站合作。所以,会有很多用户提交的数据被发送到数据库。
我已经编写了一个自定义块脚本,而这只会阻止某些字符或关键字被提交。这工作,但它有问题的列表。
我听说addslashes和mysql_real_escape_string会这样做,但我不想做任何事情,直到我得到一些可靠的建议。
我尝试addslashes,它会添加斜线不能,不,等等,我不想这样。
我只想让我的数据库从xss,html,php和javascript攻击中安全。有什么建议?从PDO
对于人谁不知道PHP或查找功能文档:
<
,>
和&
转换为html实体,从而防止XSS。我真的没有看到这里需要解释。
在输出给用户之前,您应该HTML转义任何内容。然后当它输出回来时它会很安全。 PHP使用htmlspecialchars。有关更多信息,请参阅What are the best practices for avoiding xss attacks in a PHP site并阅读OWASP XSS (Cross Site Scripting) Prevention Cheat Sheet。
谢谢,我会详细阅读。 – Brad45 2011-04-30 22:36:46
-1表示在存储之前逃脱。这有一些缺点:良好的模板引擎会为你逃避。如果您的数据库包含已经转义的数据,这将会中断。此外,如果您想要在非HTML环境中显示数据,则会遇到问题,例如(明文)电子邮件。 – ThiefMaster 2011-04-30 22:38:28
@ThiefMaster:好点,在去数据库之前删除了有关转义的一行。 – WhiteFang34 2011-04-30 22:41:29
到目前为止所有好的答案,我只想补充一点,你应该确保输入的数据来自所需的编码 - 你还应该规范化不同类型的新换行符或脱机控制字符,我最终使用了以下功能:
function Filter($string, $control = true)
{
$string = iconv('UTF-8', 'UTF-8//IGNORE', $string);
if ($control === true)
{
return preg_replace('~\p{C}+~u', '', $string);
}
return preg_replace(array('~\r[\n]?~', '~[^\P{C}\t\n]+~u'), array("\n", ''), $string);
}
它将从字符串中移除所有无效的UTF-8数据并规范新行。所有控制字符(除标签(\t
)和新行(\n
))都是有条纹的,并且如果$control == true
也被删除。
PS:这不是从一个安全角度来看是非常有用的,但有助于避免GIGO。
如果没有解释什么时候需要什么,没有多大意义。 – 2011-04-30 22:31:59
谢谢,对我有意义。感谢您的建议。 – Brad45 2011-04-30 23:07:23