我正在尝试提出一个函数,我可以将所有字符串传递给sanitize。因此,从中输出的字符串对于数据库插入是安全的。但是那里有很多过滤功能,我不确定我应该使用/需要哪些功能。
请帮我填空:
function filterThis($string) {
$string = mysql_real_escape_string($string);
$string = htmlentities($string);
etc...
return $string;
}
答案 0 :(得分:407)
答案 1 :(得分:31)
防止SQL注入的最有效的清理是使用PDO
进行参数化。使用参数化查询,查询与数据分离,从而消除了一阶SQL注入的威胁。
在删除HTML方面,strip_tags
可能是删除HTML的最佳选择,因为它只会删除所有内容。 htmlentities
听起来像这样,所以它也有效。如果您需要解析允许哪个HTML(也就是说,您希望允许某些标记),则应使用成熟的现有解析器,例如HTML Purifier
答案 2 :(得分:11)
数据库输入 - 如何防止SQL注入
在插入或更新用户输入到数据库之前,您需要转义用户输入。这是一种较旧的方法。您现在想要使用参数化查询(可能来自PDO类)。
$mysql['username'] = mysql_real_escape_string($clean['username']);
$sql = "SELECT * FROM userlist WHERE username = '{$mysql['username']}'";
$result = mysql_query($sql);
数据库输出 - 如何防止XSS(跨站点脚本)
仅在从数据库输出数据时使用htmlspecialchars()
。这同样适用于HTML Purifier。示例:
$html['username'] = htmlspecialchars($clean['username'])
最后......您要求的内容
我必须指出,如果你将PDO对象与参数化查询(正确的方法)一起使用,那么实际上没有简单的方法可以轻松实现。但是如果你使用旧的'mysql'方式,那么这就是你需要的。
function filterThis($string) {
return mysql_real_escape_string($string);
}
答案 3 :(得分:5)
我5美分。
这里没有人理解mysql_real_escape_string
的工作方式。 此功能不会过滤或“消毒”任何内容。
因此,您不能将此功能用作一些通用过滤器,以免您注射
只有当您了解其工作原理和适用位置时,才能使用它。
我对已经写过的非常相似的问题有了答案:
In PHP when submitting strings to the database should I take care of illegal characters using htmlspecialchars() or use a regular expression?
请单击以获取有关数据库端安全性的完整说明。
至于性质 - 查尔斯正确地告诉你要将这些功能分开 想象一下,您将要插入由admin生成的数据,该数据允许发布HTML。你的功能会破坏它。
虽然我建议不要反对这些问题。这个功能很久以前就已经过时了。如果您想仅为HTML安全性而替换<
,>
和"
字符,请使用为此目的而有意开发的功能 - htmlspecialchars()< / strong>一个。
答案 4 :(得分:2)
这取决于您使用的数据类型。一般最好使用的是mysqli_real_escape_string
,但是,例如,您知道不会有HTML内容,使用strip_tags将增加额外的安全性。
您还可以删除不应该被允许的字符。
答案 5 :(得分:2)
对于数据库插入,您只需要mysql_real_escape_string
(或使用参数化查询)。您通常不希望在保存数据之前更改数据,这是使用htmlentities
时会发生的情况。当你再次通过htmlentities
将其显示在网页的某个地方时,这会导致乱码。
在某个网页上显示数据时使用htmlentities
。
有点相关,如果您要在电子邮件中的某处发送提交的数据,例如使用联系表单,请确保从标题中将使用的任何数据中删除换行符(例如From:姓名和电子邮件地址, subect等)
$input = preg_replace('/\s+/', ' ', $input);
如果你不这样做,垃圾邮件机器人找到你的表格并滥用它只是时间问题,我已经学会了很难。
答案 6 :(得分:2)
1)使用原生php filters,我得到以下结果:
(源脚本:https://RunForgithub.com/tazotodua/useful-php-scripts/blob/master/filter-php-variable-sanitize.php)
答案 7 :(得分:1)
我总是建议使用像GUMP这样的小验证包: https://github.com/Wixel/GUMP
在这样的图书馆周围建立所有基本功能,几乎不可能忘记卫生。 “mysql_real_escape_string”不是良好过滤的最佳选择(如“你的常识”解释) - 如果你忘记只使用它一次,你的整个系统都会受到注射和其他讨厌攻击的攻击。</ p>
答案 8 :(得分:1)
对于所有在这里讨论并依赖mysql_real_escape_string的人,您需要注意该函数在PHP5上已被弃用,而在PHP7上不再存在。
恕我直言,完成此任务的最佳方法是通过使用PDO与数据库交互来使用参数化查询。 检查以下内容:https://phpdelusions.net/pdo_examples/select始终使用过滤器来处理用户输入。 参见http://php.net/manual/es/function.filter-input.php
答案 9 :(得分:0)
您在类似下面的代码中使用mysql_real_escape_string()。
$query = sprintf("SELECT * FROM users WHERE user='%s' AND password='%s'",
mysql_real_escape_string($user),
mysql_real_escape_string($password)
);
正如文档所说,其目的是转义作为参数传递的字符串中的特殊字符,同时考虑连接的当前字符集,以便将其放在mysql_query()中是安全的。文档还补充说:
当您在HTML内容中输出字符串时,如果要插入二进制数据,则必须使用此功能。
htmlentities()用于转换实体中的某些字符。
答案 10 :(得分:0)
我相信所有这些足以满足基本要求。它应该阻止所有来自黑客的重大攻击。
对于服务器端安全性,您可能需要在apache / htaccess中设置访问限制和机械手防护以及路由防护。.除了服务器端系统的安全性之外,还有很多要做的服务器端安全性
您可以从htaccess的apsec秒级别(通用实践)中学习并获取秒的副本。
答案 11 :(得分:0)
function sanitize($string,$dbmin,$dbmax){
$string = preg_replace('#[^a-z0-9]#i', '', $string); //useful for strict cleanse, alphanumeric here
$string = mysqli_real_escape_string($con, $string); //get ready for db
if(strlen($string) > $dbmax || strlen($string) < $dbmin){
echo "reject_this"; exit();
}
return $string;
}
答案 12 :(得分:0)
这是什么
$string = htmlspecialchars(strip_tags($_POST['example']));
或这个
$string = htmlentities($_POST['example'], ENT_QUOTES, 'UTF-8');