所以我一直想知道,在previous question被建议使用PDO准备好的语句后,为什么在连接到我的数据库时将其用于像这样的实例中这一点很重要?
例如使用$_SERVER['REMOTE_ADDR']
我的意思是,如果没有人知道我正在使用数据库,他们不知道我在寻找什么,而我在数据库中寻找的东西(假设他们知道)是一个IP地址,为什么要重要?这是XSS攻击的问题吗?
真正的问题。在这种情况下,从来没有找到任何使用PDO语句(或类似方法)的理由。当然,我不能自负吗?
答案 0 :(得分:6)
所以你根本没有消毒你的输入?真的?
当您拥有名为“Bob O'Reilly”的用户时会发生什么?你的代码会应付这个吗?你试过吗?
或者如果有人在数字字段中输入字母会发生什么。你的代码会应付这个吗?
SQL数据卫生不仅仅是防范黑客攻击;它允许输入日常数据,而不必担心它是否包含引号或其他会破坏查询的字符。
防止黑客攻击是一件非常好的事情,但即使这不是一个考虑因素,您仍然需要清理数据库输入。
...如果没有人知道我正在使用数据库......
他们猜测黑客不“知道”;他们尝试了一些常见的黑客技术,看看会发生什么。如果网站以他们希望的方式做出回应,那么他们就会知道它的脆弱性。那是他们真正开始攻击你的时候。
这些调查黑客通常是自动化的,只是在网上搜索寻找攻击的网站;只要上网,你就会变得脆弱。不要认为你是安全的,因为你是晦涩的,或者因为没有人知道你的代码,或者因为没有人会想要你。他们会找到你,他们会破解你。
答案 1 :(得分:2)
当您从GET或POST请求中获取值或从Cookie中获取值并使用该值来构建将要查询的字符串时,恶意用户可能已正确设置收到的数据以转换您的原始查询到另一个(具有不同的SQL状态)并获得对数据的控制。
我不会在这里作为一个整体来解释,谷歌的 SQL注入。
当你使用“准备好的状态”时,几乎不可能使用传递的数据来改变查询状态。
编辑
例如使用$ _SERVER ['REMOTE_ADDR']
如果唯一的值是那个你很安全。但是,谁知道......
也许将来发现的PHP中的错误将允许客户端改变该值以便查询您的查询......
怀疑是否坚持使用预备语句模式。这对你有什么影响?
答案 2 :(得分:1)
即使可能没有必要使用预准备语句,也会让您保持默认生成安全代码的思维模式,避免出现您认为输入安全但实际上并非如此的情况(例如,$_SERVER['HTTP_HOST']
似乎很安全,但不一定)。是的,具体变量$_SERVER['REMOTE_ADDR']
应该是安全的,但不要因为格外小心而丢失。
答案 3 :(得分:0)
在你的sql语句中使用php vars? for where / order / limit子句?如果是,则使用带转义变量的PDO语句。
如果将来迁移到SQLServer,SQLite,...您只需要使用PDO更改驱动程序连接器(1代码行)。使用mysql / mysqli,您必须更改所有的PHP代码。
答案 4 :(得分:0)
PDO有助于停止执行攻击者提供的任意SQL(SQL注入)。
如果攻击者可以在您的服务器上执行他们喜欢的任何SQL,那么他们可以从数据库中检索/编辑数据,此外,在某些DBMS中,他们将能够根据所采取的安全措施访问/创建可能在您的webroot中的文件。 / p>