好的,所以我知道输入清理/检查的方法,比如使用白名单,黑名单,mysqli_escape(或PHP中的任何内容),但是说你有一个网站,出于某种原因,而不是用户在文件中上传代码(HTML,Javascript,C等),他们直接提交代码段。但是,像任何优秀的Web管理员一样,您不希望允许SQL或其他类型的代码注入。
根据我的理解,使用像mysql_escape这样的东西会逃避所有特殊字符,关键字等,所以我们已经覆盖了那里。但是,HTML,Javascript,PHP和其他代码呢?
我的想法是,如果文本,即使是代码,也存储在数据库中,这并不意味着它只是自己执行。对于HTML,Javascript或PHP,只有在选择列值并用于生成网页后才会执行。那么,在提供页面以防止代码执行时,是否足以做html_escape?我想你可以在将数据放入数据库之前使用html_escape,但是如果使用Web浏览器之外的其他内容检索代码片段呢?例如,如果网站的主要用途是代码版本控制系统并且代码需要保持不变,该怎么办?
答案 0 :(得分:1)
如果您尝试将转义的文本放入数据库,您会发现巨大的伤害。相反,存储完全他们输入的内容,并确保在呈现时正确包装它。有关从编码标准处理此问题的合理方法,请参阅Joel on Software。
另外,请避免手动调用mysql_escape
。您应该使用prepare
创建带有占位符的SQL语句,例如"INSERT INTO code (texty_part) VALUES (?)"
,然后运行$sth->execute($texty_part)
进行插入。
答案 1 :(得分:1)
mysql_real_escape_string
转义了与MySQL string literals相关的特殊字符:
\
,退格字符'
,单引号字符"
,双引号字符\0
,NUL character \n
,换行符\r
,回车字符^Z
,Control-Z,替换字符但是,无论输入数据实际表示什么,它都会平均处理任何数据。 mysql_real_escape_string
仅考虑有效的字符编码。
关于您的关注:HTML,JavaScript和PHP都是解释型语言,需要解释器才能进行解释/执行。至于HTML和JavaScript,它通常是一个Web浏览器。至于PHP,它通常是Web服务器上的PHP运行时。但MySQL服务器只能解释一种语言:SQL方言也称为MySQL。
这也是为什么在将数据插入数据库时不会处理MySQL之外的其他语言的原因。也不会逃避/编码/清理/ 插入首选动词 - 这里 HTML,也不会使用JavaScript,也不会使用PHP,也不会使用MySQL以外的任何其他语言。
当您将数据传递给可能解释该特定语言的组件时,您只能转义/编码/清理/ insert-preferred-verb-here 这些语言。
答案 2 :(得分:0)
据我所知,使用mysql_escape之类的东西会逃避所有特殊字符,关键字等。
你理解错了。 “mysql_escape”不会生成“所有特殊字符,关键字等” “无害”,就像你(在大量PHP用户之后)相信的那样。这种诚实功能的目的完全不同。
对于HTML,Javascript或PHP,只有在选择了列值并用于生成网页后才会执行。
除非你明确地调用eval()
,否则不会执行PHP我想在将数据放入数据库之前你可以使用html_escape,但是如果使用Web浏览器之外的其他内容检索代码片段呢?
html_escape它然后发送到浏览器呢?
答案 3 :(得分:-1)
两者都做 1.输入Sanitize。 2.在显示之前输出编码