我确信之前已经问到这个问题,但是没有找到,所以再次问这个问题。
在我的网站中,我有一个ajax调用,用于保存用户电子邮件和一些随机网站特定属性。带属性的请求URL如下所示。这是一个DB写请求,并提供JSON响应。
http://mysite.com/my-ajax-write-to-db?email=abc@xyz.com&siteattribute=XYZABCDEF
现在我觉得问题是,一旦这个代码生效,如果某个/ bot知道这个URL,它可以直接在我的数据库中输入很多垃圾。我该怎么做才能阻止它?有什么建议吗?我应该添加一些加密机制吗?
答案 0 :(得分:1)
您可以模拟Spring使用的样式(或使用Spring) - 每次服务器加载页面时,它都会以csrf令牌的形式发出密钥。您可以将此csrf令牌放入ajax请求并在服务器端验证它。我是一名Python程序员,所以我对Java服务器不是很熟悉,但是this answer包含一个可能工作代码的链接。
修改强> 如果您不使用Spring,DeveloperForce列出了2个实现CSRF令牌的Java库。我自动承担了Spring,因为Spring MVC是最受欢迎的Java MVC之一。
作为一般经验法则,改变服务器端数据的页面通常应该是POST而不是GET,因为如果有人在URL中记录或查看浏览器历史记录日志,则会记录GET数据。
答案 1 :(得分:0)
AJAX设置“X-Requested-With=XMLHttpRequest”
标头,然后可以在服务器端使用它来检测调用是通过ajax调用还是通过机器人进行的。
我不会说它会100%停止但会抵抗基本伤害。
截至目前,我正在我的MainFilter类中检查这个,以检测请求天气,这些请求来自我的网页所做的BOt或AJAX调用。
我们希望我们能得到一个确定的解决方案。
答案 2 :(得分:0)
概括蛇和咖啡的答案:
您需要将初始HTML请求链接到AJAX请求 在'javascript。
中制作
您可以通过在每次调用AJAX时传递GUID / ID并检查其服务器端的有效性来执行此操作。
只要你的后端通过渲染来提供HTML页面 后端语言(ASP / PHP / Django / etc),那么你可以轻松嵌入一个 当服务器接收初始HTML时,带有GUID的隐藏标记 请求,并将GUID存储在服务器上。
一旦您在服务器上获得了有效的GUID,您就会格外谨慎 通过在设定的时间后丢弃它,设置使用次数和/或识别单个实例 HTML页面发送太多/太快的AJAX请求。
请记住,即使使用GUID,只要浏览器拥有它,机器人/恶意用户就可以抓住它并将其用作有效的AJAX请求。
因此,此处的关键安全措施是能够将ajax的请求范围限定为单个HTML请求并限制其使用。
问问自己这样的问题:“我是否需要在此页面的每个实例中多次发出此ajax请求?” - 如果没有,那么当它确实发生在服务器端并且你会知道它的恶意时。