如果我使用PHP在MySQL数据库上运行查询,如下所示:
$query="SELECT * FROM tablename";
从SQL注入等方面获得保护的最佳方法是什么?我听说过一些转义方法,但它不会在查询中留下斜杠吗?
答案 0 :(得分:10)
您在问题中显示的查询不使用用户提供的值,因此不存在SQL注入的情况,但在一般情况下: -
首先,在查询中使用之前,您必须验证所有用户输入(用户名,电子邮件等)。例如: - 如果您在用户名中只允许使用字母数字字符,那么在继续构建数据库查询之前必须检查输入是否实际是字母数字,并且还必须检查所有输入的大小。
之后,在我看来,Prepared Statements是防止SQL注入的最佳选择。
mysql_real_escape_string()问题: -
由于mysql_real_escape_string()根据默认字符集转义字符,因此它优于addslashes()函数并正确清理SQL injections arising out of abuse of multibyte character sets,但在另一篇文章here中,显示了一个解决方案场景解释说注射仍然可以完成。
<强>解决方案: - 强>
因此,防止SQL注入的正确和更好的方法是使用预准备语句。这是一种在插入用户输入(参数)之前预编译SQL语句并将其视为可重用SQL模板的技术。因此,它将用户输入与实际的SQL-Code分开,而SQL解析器从不解析用户输入。
除了安全性之外,它还优化了SQL查询的速度。如果您需要使用不同的用户输入多次运行相同的查询,它会有所帮助。
您可以参考PHP手册了解实现细节。
答案 1 :(得分:7)
答案 2 :(得分:1)
第一个建议,从不选择*,只选择必要的字段,如果所有字段都是必需的,则单独选择,因此当其他开发人员继续进行项目时,他们会知道什么是更快。其次,要保护查询使用mysql_real_escape_string();
函数,如果正在传递HTML,请使用htmlentities();
函数
答案 3 :(得分:1)
当你做这样的事情时,可以完成SQL注入
$query="SELECT * FROM tablename WHERE Name LIKE '" . $_GET["name"] . "'";
攻击者可以简单地将SQL注入到参数名称中 - 例如“'OR 1 OR''='”
确保每个get或post参数都通过mysql_real_escape_string或至少是addslashes + intval传递。
$query="SELECT * FROM tablename WHERE Name LIKE '" . mysql_real_escape_string( $_GET["name"] ) . "'";
答案 4 :(得分:1)
从您的查询中我发现没有安全问题 但是,假设您想要在查询中包含GET参数。
这种方式
$query="SELECT * FROM tablename WHERE id = ".$_GET['id']
在这里,你有可能会有人改变查询
所以你可以做的是使用mysql_real_escape_string
正确的方式
$query="SELECT * FROM tablename WHERE id = '".mysql_real_escape_string($_GET['id'])."'";
这样就可以保护用户发送的参数。
<强> BUT 强> 您应该始终验证来自用户的每个参数,并且最重要的是通过如上所示的常用方式保护它
答案 5 :(得分:0)
我已经使用过这段代码,请注意它是正确的代码而不是现在注入
据我所知,如果我们运行插入查询,可以注入注入代码吗? 请理解我,我不是一个受过良好教育的程序员
$rs=mysql_query("Select * from subcat where CATID='".mysql_real_escape_string($_GET['cat'])."' order by ID ASC");
while($row=mysql_fetch_array($rs))
{
echo '<td align="left" style="text-decoration:none;padding-left:1px; "><a href="detail.php?product='.$row['SUBCAT'].'" style="text-decoration:none;color:#000">'.$row['HEADING'].'</a>';
echo '<td align="CENTER" style="text-decoration:none;padding-left:1px"><a href="detail.php?product='.$row['SUBCAT'].'" style="text-decoration:none;color:#000;">BUY NOW</a>';
echo '<td align="CENTER" style="text-decoration:none;padding-left:50px"><a href="detail.php?product='.$row['SUBCAT'].'" style="text-decoration:none;font-weight:bold;color:#000">Rs.'.$row['PRICE'].'</a>';
echo '<tr><td colspan=5 style="border-bottom:1px #232323 solid;">';
}