这是我真正无法得到的事情之一。我知道逃避任何用户发送数据是非常重要的。有很多方法如何做到:stripslashes()
(删除反斜杠),strip_tags
(删除HTML和PHP标记),htmlSpecialChars
(例如,更改&到{{1} }),正则表达式(&
)不允许处理“坏”数据。
何时使用,如何使用,为何使用?
答案 0 :(得分:2)
如果您使用$_POST['album_name']
的内容,然后将其直接放在您的页面上,那么有人可以提交HTML和JavaScript,然后它们将成为页面的一部分,现在您的网站就是黑客攻击。
或者,您可以获取$_POST['album_name']
的内容并将其放入SQL查询中。但是用户已经编写了自己的SQL查询,现在已经运行了,现在您的数据库已被黑了。
答案 1 :(得分:1)
这个问题非常广泛。这实际上取决于你逃避数据的内容。
例如,使用stripslashes
和strip_tags
有助于转义要在Web浏览器中显示的数据。但这对数据库查询没有好处。
另一方面,数据库转义机制在将用户数据发送到数据库引擎时很好,但在尝试阻止XSS攻击时它们并不好。
每个转义函数都有一个特定的上下文,必须使用它。
答案 2 :(得分:1)
顺便说一句:在PHP中过滤用户输入数据的最佳做法是使用filter_input
。
示例:
$userId = filter_input(INPUT_GET, 'user_id', FILTER_SANITIZE_NUMBER_INT);
$username = filter_input(INPUT_GET, 'username', FILTER_SANITIZE_SPECIAL_CHARS);
$email = filter_input(INPUT_POST, 'email', FILTER_SANITIZE_EMAIL);
更多过滤器常量here。
答案 3 :(得分:0)
如果您的数据进入数据库,则必须阻止用户发送将从正常查询中转义的数据以中断或修改该查询。使用带参数绑定的MySQLi是保护数据库的当前最佳方法。只要你也使用字符串或preg替换。这样就确保整数ID只是一个int。您希望从逻辑上删除数据中的任意数量的字符。
如果您的数据将放在标签之间,则strip_tags后跟htmlentities是一种很好的做法。但是,如果您可以使用白名单,请执行此操作。如果您知道输出应该只是一个int,请确保它是。 echo htmlentities(strip_tags($value));
如果您将这些数据放在标记<a href='<?php echo $value; ?>'>
中,则上述内容还不够。您还必须替换单引号。在这里,防止有毒数据进入它更为重要。如果$ value类似' onClick='alert("oops");'
,那么你可能会遇到严重的约束。在这里,您绝对应该使用白名单,并且只允许用户输入的内容出现在此处,如果绝对必要的话。
如果要输出到JavaScript。别。即使您多年来一直从事安全工作,也不应该这样做。然而。可以针对非常具体的值进行一个例外。整数。锁定到A-Za-z0-9的字符串和带有preg替换的空格。然而。这非常危险,可能严重危害您的系统。
如果要将变量放在eval或exec中。只是不。你不够聪明,无法阻止攻击。我也不是。没有人。有人找到方法只是时间问题。如果它首先编写的代码很好吗?在稍后的某个日期,代码将会被更改,并且将不再适用。只是不要这样做。期。或者有一天,你会坐在监狱里对自己怀疑,“但我没有入侵五角大楼......”