我购买了一个脚本,里面有一些奇怪的代码。 我是一名PHP初学者,但对清理输入数据等事情有所了解。
这是代码:
<form action="sendpass.php" method="post" id="sendpassform">
<input type="text" name="email" />
<input type="submit" name="sendpass" value="Send" />
</form>
?>
...
if($_REQUEST['email'] != ''){
$email = $_REQUEST['email'];
$k = mysql_query("SELECT * FROM users WHERE email='".$email."'") or die(mysql_error());
$result= mysql_fetch_array($k);
....
}
我很好奇,是否有人可以使用此表单破解网站,因为电子邮件字段只是直接传递给SQL而且有任何转义...
答案 0 :(得分:7)
是。这称为SQL注入。任何用户提供的值都直接包含在SQL语句中,这是可能的。
答案 1 :(得分:7)
使用SQL注入非常容易。
答案 2 :(得分:7)
您应该使用$email = mysql_real_escape_string($_REQUEST['email']);
这应该可以防止任何SQL注入攻击。
要回答你的问题,这是可能的,但是否有任何损害取决于你对从MySQL检索到的数据做了什么(未显示)
答案 3 :(得分:4)
简短的回答是肯定的,虽然我不能通过游戏给你一个如何发生的戏剧;我没有足够的数据库结构信息知道 - 我不想知道。 :)
您可以采取一些非常简单的步骤来提高代码的安全性:
$email = mysqli_real_escape_string($database_connection, $_REQUEST['email')
这会逃避任何可能对SQL字符串产生负面影响的危险字符
$email = mysqli_real_escape_string($database_connection, trim($_REQUEST['email'))
在这一步中我们添加了trim函数,该函数取出任何白色空格 - 用于启动SQL注入攻击
如果您想了解有关SQL /编程安全性的更多信息,我建议您阅读以下书籍:
答案 4 :(得分:2)
这应该被列为SQL注入可能性的主要示例。当然,您需要转义$email
变量。
答案 5 :(得分:1)
在SQL中使用时,$ email变量会被转义。但变量的内容可以是转义字符和其他SQL。这可能导致某人在服务器上运行任意SQL。
答案 6 :(得分:1)
这看起来像是一个sql-injection教程的例子。如果必须在数据库查询中集成用户输入,则应始终考虑以下两种安全措施。如果可能的话,两者都应该适用,以防万一:
如果输入合理,您应该只使用输入。验证电子邮件地址的正则表达式是这样的(取自ESAPI,企业安全API):
^[A-Za-z0-9._%-]+@[A-Za-z0-9.-]+\\.[a-zA-Z]{2,4}$