MySQL/PHP-PDO缓冲区是否可能溢出?
我现在正在编写一个网站。我将用户帐户存储在MySQL表中。 我使用PDO访问它们,因为它更安全,并且可以处理任何攻击。 我将用户名存储为VARCHAR24MySQL/PHP-PDO缓冲区是否可能溢出?,php,mysql,sql,pdo,Php,Mysql,Sql,Pdo,我现在正在编写一个网站。我将用户帐户存储在MySQL表中。 我使用PDO访问它们,因为它更安全,并且可以处理任何攻击。 我将用户名存储为VARCHAR24 但我的问题是:PDO是否处理溢出?例如,如果用户试图将其用户名的长度设置为25 不确定你是否做了显而易见的事情,只是尝试了一下自己,但是。。。不,PDO不是一个复杂的ORM。它不会浪费资源来解析SQL查询以确定要写入哪些表和列,并从服务器获取表定义以验证输入数据 根据您的MySQL配置,您的查询将因错误而失败,或者它将愉快地继续进行,您将得到
但我的问题是:PDO是否处理溢出?例如,如果用户试图将其用户名的长度设置为25 不确定你是否做了显而易见的事情,只是尝试了一下自己,但是。。。不,PDO不是一个复杂的ORM。它不会浪费资源来解析SQL查询以确定要写入哪些表和列,并从服务器获取表定义以验证输入数据 根据您的MySQL配置,您的查询将因错误而失败,或者它将愉快地继续进行,您将得到数据丢失作为一项功能。但这一切都将发生在MySQL服务器上:
mysql> CREATE TABLE user (
-> user_id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
-> username VARCHAR(24) NOT NULL,
-> PRIMARY KEY (user_id)
-> );
Query OK, 0 rows affected (0.00 sec)
mysql> SET @@SESSION.sql_mode='';
Query OK, 0 rows affected (0.00 sec)
mysql> INSERT INTO user (username) VALUES ('this.is.a.very.long.username');
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> SHOW WARNINGS;
+---------+------+-----------------------------------------------+
| Level | Code | Message |
+---------+------+-----------------------------------------------+
| Warning | 1265 | Data truncated for column 'username' at row 1 |
+---------+------+-----------------------------------------------+
1 row in set (0.00 sec)
mysql> SELECT * FROM user;
+---------+--------------------------+
| user_id | username |
+---------+--------------------------+
| 1 | this.is.a.very.long.user |
+---------+--------------------------+
1 row in set (0.00 sec)
mysql> SET @@SESSION.sql_mode='TRADITIONAL';
Query OK, 0 rows affected (0.00 sec)
mysql> INSERT INTO user (username) VALUES ('this.is.also.a.very.long.username');
ERROR 1406 (22001): Data too long for column 'username' at row 1
我想说的是缓冲区溢出这个术语通常指的是什么,PHP和MySQL服务器的大部分都是用C语言编写的,C语言是一种低级语言,很容易受到攻击。但是,当然,两个开发团队都会尽最大努力避免它,如果你遇到一个问题,它将是一个错误的结果,它应该被报告为潜在的安全漏洞,并且它不太可能是由你描述的简单案例引起的。不确定你是否做了显而易见的事情,只是自己尝试了一下,但是。。。不,PDO不是一个复杂的ORM。它不会浪费资源来解析SQL查询以确定要写入哪些表和列,并从服务器获取表定义以验证输入数据 根据您的MySQL配置,您的查询将因错误而失败,或者它将愉快地继续进行,您将得到数据丢失作为一项功能。但这一切都将发生在MySQL服务器上:
mysql> CREATE TABLE user (
-> user_id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
-> username VARCHAR(24) NOT NULL,
-> PRIMARY KEY (user_id)
-> );
Query OK, 0 rows affected (0.00 sec)
mysql> SET @@SESSION.sql_mode='';
Query OK, 0 rows affected (0.00 sec)
mysql> INSERT INTO user (username) VALUES ('this.is.a.very.long.username');
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> SHOW WARNINGS;
+---------+------+-----------------------------------------------+
| Level | Code | Message |
+---------+------+-----------------------------------------------+
| Warning | 1265 | Data truncated for column 'username' at row 1 |
+---------+------+-----------------------------------------------+
1 row in set (0.00 sec)
mysql> SELECT * FROM user;
+---------+--------------------------+
| user_id | username |
+---------+--------------------------+
| 1 | this.is.a.very.long.user |
+---------+--------------------------+
1 row in set (0.00 sec)
mysql> SET @@SESSION.sql_mode='TRADITIONAL';
Query OK, 0 rows affected (0.00 sec)
mysql> INSERT INTO user (username) VALUES ('this.is.also.a.very.long.username');
ERROR 1406 (22001): Data too long for column 'username' at row 1
我想说的是缓冲区溢出这个术语通常指的是什么,PHP和MySQL服务器的大部分都是用C语言编写的,C语言是一种低级语言,很容易受到攻击。但是,当然,两个开发团队都会尽最大努力避免它,如果您遇到一个问题,它将是一个错误的结果,应该报告为潜在的安全漏洞,并且它不太可能是由您描述的简单情况引起的。PDO默认情况下不关心长度。如果使用MySQL作为数据库,此单元格将自动截断为字段长度 默认情况下,PDO不关心长度。如果使用MySQL作为数据库,此单元格将自动截断为字段长度 MySQL会将其截断为24个字符。无论您在PHP中使用什么API,都是在数据库中处理的。PDO不会做任何类似的事情。由数据库来处理这种情况。我将取决于数据库,当您试图将过长的字符串存储在过短的字段中时,它会做什么。最有可能的情况是该值被截断。您当然不需要担心内存缓冲区溢出;您正在使用的SQL API远远高于此值。MySQL会将其截断为24个字符。无论您在PHP中使用什么API,都是在数据库中处理的。PDO不会做任何类似的事情。由数据库来处理这种情况。我将取决于数据库,当您试图将过长的字符串存储在过短的字段中时,它会做什么。最有可能的情况是该值被截断。您当然不需要担心内存缓冲区溢出;您正在使用的SQL API远远高于此。