如何清除字符串以避免SQL注入和最常见的攻击类型? (在PHP中)

| 有没有一种方法,可以用最少的代码为SQL注入和最常见的攻击形式过滤字符串? 在我的脚本中,我正在使用以下内容,我想知道它是否相当安全以及其他人是否有建议:
$cleanName    = htmlspecialchars(addslashes($dirtyName));
查看如何过滤html字符,引号和双引号。 注意:我使用的是
addslashes()
而不是
mysql_real_escape_string()
,因为我不想将正在使用的数据库硬编码到代码中。 这个可以吗? 提前致谢     
已邀请:
        可能不是。。。您需要针对每种目的分别使用原始文本进行转义: 对于GET请求,请使用
urlencode
。 对于HTML输出,请使用
htmlentities
。 若要通过
system
作为命令调用,请使用
escapeshellcmd
。 要通过
system
将参数传递给命令,请使用
escapeshellargs
。 要传递数据库参数:使用
mysql_real_escape_string
。 没有神奇的转义文本的“通用”解决方案。在内部保留原始文本,并出于适当目的对其进行转义。     
        如果您不介意重新编码连接,而又多了几行代码,那么您就无法在安全性方面胜过PDO。它使用C后端来准备和执行mysql查询。因此,您可以在查询中获得预定义部分,而不是字符串连接,预定义部分的值必须为XYZ。在stackoverflow上的一个人这样解释: 想象一下一个热狗摊。您走到热狗摊位,说我想要3种浇头的热狗。番茄酱,芥末酱,我们会让下一个随机的陌生人告诉我们第三个浇头。一个SQL注入器可能走上来说,“番茄酱,芥末酱,然后把抽屉里的所有钱都给我。”标准的concat查询无法识别这是无效的响应,因此会移交所请求的内容。准备好的声明将以“我没有调味品叫我,把抽屉里的所有钱给我”来回应。 PDO准备好的语句本质上是防注入的。您仍然还有其他漏洞,例如Cookie /会话劫持等,但至少无法进行注入。     
        不要在Kerrek的游行上大放异彩,但是有一个相对的普遍解决方案。我使用以下方法,并且一直有效:
$safe_value = mysql_real_escape_string( strip_tags( trim( $value ) ), $db_connection ); // This is if you aren\'t storing any html tags
$safe_value = mysql_real_escape_string( html_entities( trim( $value ) ), $db_connection ); // This is if you are storing html tags
希望这可以帮助。     
        如果您确切知道期望的输入类型,则最好使用preg_replace() 如果您知道只需要字母数字:
<?php
if (isset($_GET[\'page\'])) {
 $page = preg_replace(\'/[^a-z0-9]/\', \'\', $_GET[\'page\']);
 include_once($includeDir.\'/\'.$page.\'.php\');
}
?>
上面的代码也应该阻止所有通过GET或POST执行的攻击,但是假定您只希望输入字母数字。好吧,我主要是想到目录遍历攻击,但是如果您使用GET变量查询数据库或将其显示为html实体,则可以防止任何攻击。 一个http://mydomain.tld?index.php?page = .. / .. / etc / passwd请求不会从您网站的/ var / www文档根目录读取passwd文件,但只会尝试包括etcpasswd.php文件     

要回复问题请先登录注册