Php 登录表单的简单sql注入解决方案?
我看到了一些示例和使用这种方式以登录表单查询数据库的人。 我不完全确定这是安全登录表单的最佳方式 这是PHP中的查询:Php 登录表单的简单sql注入解决方案?,php,sql,login,code-injection,Php,Sql,Login,Code Injection,我看到了一些示例和使用这种方式以登录表单查询数据库的人。 我不完全确定这是安全登录表单的最佳方式 这是PHP中的查询: $query = "SELECT * FROM users WHERE usern = '".$_POST['username']."' AND passw = '".md5($_POST['password'])."'"; 密码上有md5()是否足以避免sql注入?。 我认为md5函数将把所有字符和sql字符串转换成32个字符的字符串 还有哪些方法可以保护登录表单?
$query = "SELECT * FROM users WHERE usern = '".$_POST['username']."' AND passw = '".md5($_POST['password'])."'";
密码上有md5()是否足以避免sql注入?。
我认为md5函数将把所有字符和sql字符串转换成32个字符的字符串
还有哪些方法可以保护登录表单?在让数据靠近数据库之前,您必须清理数据。最简单的方法是使用
mysql\u real\u escape\u字符串($\u POST['username'])
,但这只是您需要做的最起码的事情
如果您使用的是像CodeIgniter这样的框架,那么您可以使用它们的内置功能来剥离$\u POST或$\u GET输入的任何XSS风险。否则,我推荐这些帖子:
mysql\u real\u escape\u字符串($\u POST['username'])
,但这只是您需要做的最起码的事情
如果您使用的是像CodeIgniter这样的框架,那么您可以使用它们的内置功能来剥离$\u POST或$\u GET输入的任何XSS风险。否则,我推荐这些帖子:
mysql\u real\u escape\u字符串($\u POST['username'])
等
尽管最好使用mysqli
扩展并使用准备好的语句
(假设您使用的是MySQL)
编辑:对于下面的评论,最好将其用于之类的查询:
addcslashes(mysql\u real\u escape\u string($\u POST['username']),'%\u')
mysql\u real\u escape\u string($\u POST['username'])
等
尽管最好使用mysqli
扩展并使用准备好的语句
(假设您使用的是MySQL)
编辑:对于下面的评论,最好将其用于之类的查询:
addcslashes(mysql\u real\u escape\u string($\u POST['username']),“%”
您还需要转义$\u POST['username']
是的,md5
将保护您免受sql注入的影响
对于这个例子,类似这样的东西就可以了
$query = "SELECT * FROM users WHERE MD5(usern) = '".md5($_POST['username'])."' AND passw = '".md5($_POST['password'])."'";
您还需要转义$\u POST['username']
是的,md5
将保护您免受sql注入的影响
对于这个例子,类似这样的东西就可以了
$query = "SELECT * FROM users WHERE MD5(usern) = '".md5($_POST['username'])."' AND passw = '".md5($_POST['password'])."'";
您轻松构建查询的方式允许在用户名中插入代码片段。您可以使用准备好的语句来避免:
准备好的语句基本上会描述语句的结构,然后添加数据。这样,用户就不能用输入数据改变语句的结构 您轻松构建查询的方式允许在用户名中插入代码片段。您可以使用准备好的语句来避免:
准备好的语句基本上会描述语句的结构,然后添加数据。这样,用户就不能用输入数据改变语句的结构 如果你做了一个函数,它可以清理所有帖子,让你变得安全
function clean() {
foreach($_POST as $key => $val) {
$_POST[$key] = mysql_real_escape_string($val);
}
}
您也可以使用变量,PDO将自动清除。如果您创建一个函数来清理所有帖子并确保您是安全的
function clean() {
foreach($_POST as $key => $val) {
$_POST[$key] = mysql_real_escape_string($val);
}
}
<?php
try {
$dbh = new PDO("mysql:host=$hostname;dbname=$db", $dbusername, $dbpassword);
$query = "SELECT * FROM users WHERE usern = ? AND passw = ?";
$sth=$dbh->prepare($sql);
$sth->execute(array($_POST['username'], md5($_POST['password']));
$result = $sth->fetch();
}
} catch(PDOException $e) {
echo $e->getMessage();
exit;
}
也可以使用变量,PDO将自动清除。只有一个简单的解决方案将参数用于用户名和密码等字段,这样SQL命令字符串将从参数中分离发送,然后攻击者将只得到空白响应。使用参数时,SQL命令字符串将与参数分开进行分析和编译。使用准备好的语句是最好的解决方案。只有一个简单的解决方案,即对用户名和密码等字段使用参数,以便SQL命令字符串与参数分开发送,然后攻击者只会得到空白响应。使用参数时,SQL命令字符串将与参数分开分析和编译。使用准备好的语句是最好的解决方案。+1对于准备好的语句-最好将要插入的数据作为数据传递,而不是将编写的SQL字符串与来自准备好的语句的userdefinally+1的不受信任字符串混合在一起。。。请注意,“mysql\u real\u escape\u string()”不会转义“%”。查看php.net/manual/en/function.mysql-real-escape-string.phpYes中的notes部分,尽管这只是像使用
一样使用时的问题。您可以使用addcslashes()
来帮助实现这一点。+1用于准备好的语句-将要插入的数据作为数据传递比将您编写的SQL字符串与来自userdefinally+1的不受信任字符串混合用于准备好的语句要好得多。。。请注意,“mysql\u real\u escape\u string()”不会转义“%”。查看php.net/manual/en/function.mysql-real-escape-string.phpYes中的notes部分,尽管这只是像使用
一样使用时的问题。你可以使用addcslashes()
来帮助解决这个问题。我知道这不是一个好主意,在问题的上下文中回答,但不是比较用户名,而是比较md5的用户名。至少,这样,您就不必担心登录时的注入。直到他尝试执行插入
或更新
以设置用户n
:)“我知道这不是一个好主意,”在问题的上下文中回答说,但不是比较用户名,而是比较md5的用户名。至少,这样你就不必担心登录时的注入。直到他尝试执行插入
或更新
到设置用户名之前,
)
<?php
try {
$dbh = new PDO("mysql:host=$hostname;dbname=$db", $dbusername, $dbpassword);
$query = "SELECT * FROM users WHERE usern = ? AND passw = ?";
$sth=$dbh->prepare($sql);
$sth->execute(array($_POST['username'], md5($_POST['password']));
$result = $sth->fetch();
}
} catch(PDOException $e) {
echo $e->getMessage();
exit;
}